请教一个并发问题的解决方案

梦尊 2014-05-08 08:44:09
现在有一个比较特殊的需求,大概要实现的功能如下:

服务器存储了许许多多图片,然后现在要提供一个WEB服务,
让客户端可以访问这台服务器,如 http://192.168.1.100
当客户端访问这个WEB服务的时候,服务器随机返回一张图片,
让客户端可以在浏览器上看到这张图。

然后问题来了,要求是,一旦某张图被展示过,则不能再被再次展示
如果只有一个客户端偶尔访问一下,那很好解决,
只需要在某张图片被访问之后改个文件名即可,例如像 1.jpg 改名为 1.jpg.bak 。
问题是WEB服务是并发的,如果同一个客户端频繁访问,或者不同的客户端同时频繁访问,
要怎么样才能确保图片不被重复访问呢?

目前我能想到的办法有两种:

一是在客户端访问的时候,遍历图片(*.jpg),找到任意一张图片后立即改名,
例如找到一张 1.jpg ,然后立即改名为 1.jpg.jpeg,再把这个 1.jpg.jpeg 发送到客户端。
这样,当再次有客户端访问的时候,由于遍历的是(*.jpg),
是不可能遍历到 1.jpg.jpeg 这个文件的,
所以也就不会被再次访问。

第二个办法是将所有图片信息,如文件名路径等写入数据库,并增加一个标记字段,
这个标记字段用来记录是否被访问过,比如1表示已经被访问过,0表示没有被访问过,
然后当有客户端来访问的时候,先从数据库中筛选一条标记字段为“0”的记录,
然后立即更新数据库,将标记字段改为“1”, 最后返回图片给客户端。
当再有客户端访问时,由于刚才的记录已经标记为“1”, 所以就不会被再次访问到了。

这两种方案在访问不频繁,比如10秒种才有一个客户端连接一次时是不会有问题的。
但如果在高并发的情况下,比如1秒钟就有1000个客户端同时访问,能不能保证一定不会有问题呢?
或者说,各位大神有没有更好的解决方案呢?
谢谢!
...全文
104 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-05-08
  • 打赏
  • 举报
回复
如果访问一个服务器的话(楼上说的非集群) 1建议搞一个拦截器 2调整随机算法 不可重复的随机
MiceRice 2014-05-08
  • 打赏
  • 举报
回复
用数据库的话只要你控制好事务,是可以解决这个并发访问的问题的。 不过简化点处理可以这样: 1、把所有图片路径放在内存的一个 List 或数组中; 2、打乱该数组内图片顺序; 3、设置一个计数器 int pos = 0; 4、编写函数: public static synchronized String getPath() { pos = pos % arrayPaths.length; return arrayPaths[pos++]; } 不过集群环境下可不行。
xuefeng1986 2014-05-08
  • 打赏
  • 举报
回复
服务器跑脚本。把所有文件名写到内存。 显示时,在这个结果集中随机,展示了就删除。 或者用文本文件保存文件名也可。 尽量减少对文件夹的遍历,高并发时IO读写是个大问题。也不要修改原图片名,会引发很多其他问题。
yyfhz 2014-05-08
  • 打赏
  • 举报
回复
总之需要一个不能被打断的原子操作来完成 查询+输出+修改属性 这样的动作。

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧