memcache应对缓存失效问题
2016-10-24 14:57
323 查看
.两个key,一个key用来存放数据,另一个用来标记失效时间
比如key是aaa,设置失效时间为30s,则另一个key为expire_aaa,失效时间为25s。在取数据时,用multiget,同时取出aaa和expire_aaa,如果expire_aaa的value == null,则后台启动一个任务去查询DB,更新缓存。和上面类似。
对于后台启动一个任务去查询DB,更新缓存,要保证一个key只有一个线程在执行,这个如何实现?
对于同一个进程,简单加锁即可。拿到锁的就去更新DB,没拿到锁的直接返回。
对于集群式的部署的,如何实现只允许一个任务执行?
这里就要用到memcached的add命令了。
add命令是如果不存在key,则设置成功,返回true,如果已存在key,则不存储,返回false。
当get expired_aaa是null时,则add expired_aaa 过期时间由自己灵活处理。比如设置为3秒。
如果成功了,再去查询DB,查到数据后,再set expired_aaa为25秒。set aaa 为30秒。
综上所述,来梳理下流程:
比如一个key是aaa,失效时间是30s。查询DB在1s内。
put数据时,设置aaa过期时间30s,设置expire_aaa过期时间25s;
get数据时,multiget aaa 和 expire_aaa,如果expired_aaa对应的value != null,则直接返回aaa对应的数据给用户。如果expire_aaa返回value == null,则后台启动一个任务,尝试add expire_aaa,并设置超时过间为3s。这里设置为3s是为了防止后台任务失败或者阻塞,如果这个任务执行失败,那么3秒后,如果有另外的用户访问,那么可以再次尝试查询DB。如果add执行成功,则查询DB,再更新aaa的缓存,并设置expire_aaa的超时时间为25s。
相关文章推荐
- PHP使用Memcache时模拟命名空间及缓存失效问题的解决
- Memcache关于缓存失效时间的问题
- memcache 缓存失效问题
- memcache 缓存失效问题(转)
- PHP使用Memcache时模拟命名空间及缓存失效问题的解决
- redis和memcache缓存击穿,缓存失效问题
- 应对 Memcached 缓存失效,导致高并发查询 DB 的几种思路
- 应对Memcached缓存失效,导致高并发查询DB的四种思路(l转)
- GDI+中启动双缓存后缩放失效的问题
- Shiro 缓存失效以后的一个问题
- 多应用共享memcache缓存带来的问题
- 关于Ehcahce缓存技术在集群环境宕机失效问题
- 缓存穿透、缓存并发、缓存失效问题以及解决方案
- 缓存击穿、失效及热点key问题
- 应对 Memcached 缓存失效,导致高并发查询 DB 的几种思路
- memcache缓存失效
- memcached缓存失效时的高并发访问问题解决
- 应对Memcached缓存失效,导致高并发查询DB的几种思路
- 解决服务器缓存失效后可能导致的雪崩问题(thinkphp为例)
- memcache 缓存穿透的问题