请求完数据库数据后,把返回结果保存在redis里,来降低数据库的请求次数
存储数据类型:
String
Hash
List
Set
SortedSet
Bitmap
······
缓存过期:
存在内存的数据量有限,所有设置一个超时时间,应用程序设置超时时间后,缓存会过期
缓存淘汰:
过期的缓存会被清理掉,定时删除,100ms做一次
惰性删除:
由于不可能全部查询一次删除,所以随机选择过期的去删除,但有些不会被选中,成为漏网之鱼,所以就规定如果请求查询的时候发现过期了就立即删除,被动式触发
内存淘汰机制:
总有些不会被随机选中,又没有被请求,于是有个这个淘汰机制:
noeviction:返回错误,不会删除任何键值
allkeys-lru:使用LRU算法删除最近最少使用的键值
volatile-lru:使用LRU算法从设置了过期时间的键集合中删除最近最少使用的键值
allkeys-random:从所有key随机删除
volatile-random:从设置了过期时间的键的集合中随机删除
volatile-ttl:从设置了过期时间的键中删除剩余时间最短的键
volatile-lfu:从配置了过期时间的键中删除使用频率最少的键
allkeys-lfu:从所有键中删除使用频率最少的键
缓存穿透:
当查询的数据不存在,就没法存在缓存里,导致继续访问数据库,这就叫缓存穿透
布隆过滤器:
能够从很多的数据中告诉你查询的数据不存在(说不存在在就一定不存在,说存在却不一定存在)
缓存击穿 && 缓存雪崩:
- 当热点数据过期被清除了,大量访问突然都到了数据库,这就是缓存击穿
- 一大批数据几乎同时失效被清除,超大量访问到数据库,这就是缓存雪崩
缓存击穿和缓存雪崩的解决办法就是:
应用程序端设置热点数据永不过期,然后把键值的过期时间随机一下。