请教一个并发问题的解决方案
梦尊 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个客户端同时访问,能不能保证一定不会有问题呢?
或者说,各位大神有没有更好的解决方案呢?
谢谢!