首先,说说memcached的标准用法:memcached使用高效缓存,当有一些内容不是经常变动时,可以写入其中。如果有请求要获取这块数据,则优先从缓存中取出,仅当缓存过期,则从数据库获取实时数据,并再次更新到缓存中。
但如果网站频频出现高并发,比如说,将某块数据写入并设置有效时间为60s,但如果正好在60s后的那个瞬间,假如有10000个请求同时尝试获取这块数据,那么这10000个请求仍然只能通过数据库访问方式去获取,有没有办法缓解这种情况?
考虑利用memcache单个操作的原子性,使得10000个并发请求中,只让其中前面少量的请求通过get得到过期后返回的null,而后面则返回缓存中的数据。比如,写入缓存时,和key=>value时间大于60s(周期可以设置长些),再写一个key_map=>true时间正好为60s,当请求key时,先去get那个key_map,如果key_map过期,则返回一次null并设置key_map为true。如果没过期,则还是返回key对应的value。这样的话,如果有10000个请求正好在60s后过来,在memcache串化的队列中,应该是这样的
get(key_map) 过期返回null
... (代码从第一次返回null,到set为true的时间段,可能正好有几个get也入队了)
set(key_map) 重新设置为true
get(key_map) 返回true
....
get(key)
这样的话,就能控制10000个并发请求中只返回一个或少量的null,其它的都返回缓存中的数据(此时应该还是旧的数据)
关于高并发下memcached可能出现的问题
时间: 2024-10-09 23:57:08