查缓存时间过期设多长
Ⅰ Redis缓存过期机制
一、针对与设置了过期时间的key值
1.(主动)定期删除:定时随机的检查过期的key,如果过期则清理删除
redis.conf(每秒检查的次数1-500)配置: hz 10
2.(被动)惰性删除:当客户端请求到一个已经过期的key时,redis会检查是否过期并删除
所以,虽然key过期了,但是没被清理的话,还是会占内存的。
二、内存淘汰管理机制Memory Management
当内存占满之后,redis提供缓存淘汰机制。
redis.conf: maxmemory <bytes>
* noeviction:旧缓存永不过期,新缓存设置不了,返回错误
* allkeys-lru:清除最少用的旧缓存,然后保存新的缓存(推荐使用)
* allkeys-random:在所有的缓存中随机删除(不推荐)
* volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存
* volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存
* volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的
Ⅱ 缓存击穿互斥锁 设置锁的失效时间
设置锁的失效时间是自己设置的,它的过期时间会很短,最长不超过五分钟
缓存穿透是指查询一个一定不存在的数据
由于缓存是不命中时被动写的,
并且出于容错考虑,如果从存储层查不到数据则不写入缓存,
这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
在流量大时,可能DB就挂掉了,
要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
最常见的则是采用布隆过滤器
将所有可能存在的数据哈希到一个足够大的bitmap中,
一个一定不存在的数据会被 这个bitmap拦截掉,
从而避免了对底层存储系统的查询压力。
另外也有一个更为简单粗暴的方法
如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),
我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟