基本概念
-
将所有数据都缓存在redis?
- 内存资源有限
- 数据访问局部性,82原理\
-
因为内容资源有限,当不够用就需要按既定策略进行淘汰
- 指定淘汰策略,筛选出不重要数据
- 删除这些缓存
设置多大的缓存容量合适
-
基本概念
- 长尾效应:82原理基本概念,20%的数据提供了80%的访问
- 重尾效应:因为个性化的定制,20%的缓存满足不了请求\
-
因此缓存大小需要数据实际访问特征和成本开销综合考虑
-
经验:设置为总数据量的15%至30%
-
设置redis容量大小指令:CONFIG SET maxmemory 4gb\
\
redis缓存淘汰策略
-
基本概念:redis4.0前有6种内存淘汰策略,4.0后增加了两种策略
-
noeviction不进行数据淘汰,直接返回错误 默认策略\
-
其余七种淘汰策略
-
在设置过期时间数据进行淘汰 缓存没写满,但是数据过期,也会被删除
-
volatile-random 随机删除\
-
volatile-ttl 删除最早的数据\
-
volatile-lru 采用lru算法\
-
volatile-lfu 采用lfu算法 是对lru的优化\
-
-
在所有数据范围内进行淘汰
-
allkeys-lru 使用lru淘汰\
-
allkeys-random 所有数据随机删除\
-
allkeys-lfu 使用lfu淘汰\
-
-
-
-
LRU 最近最少使用
-
原理
- 把所有数据组织成链表,链表头MRU 链表尾LRU
- 每次更新数据放入MRU
- 淘汰数据从LRU开始
-
缺点
- 链表占据空间
- 大量的链表移动操作
-
-
redis的LRU
-
原理
- 默认记录每个数据最近一次访问的时间戳
- 淘汰数据时随机选择n个数据,将lru最小值数据淘汰
- 再次淘汰时会选择lru 字段值必须小于候选集合中最小的 lru 值
- 每次都淘汰lru最小的值
-
maxmemory-samples 设置选择的100个数据 CONFIG SET maxmemory-samples 100
-
-
经验
-
优先使用 allkeys-lru 策略 充分利用lru算法 有冷热数据的情况\
-
allkeys-random 策略 无冷热数据的情况\
-
volatile-lru 策略,同时不给这些置顶数据设置过期时间 不能有删除的数据时\
-
\
如何处理淘汰数据
-
是干净数据即直接删除,脏数据需要写会数据库
- 脏数据:与数据库中数据不相同,需要更新回数据库
-
解决办法,修改redis数据后将其写会数据库,否则淘汰时没有策略保证数据不丢失
\
小结
-
redis总共有8种淘汰策略
-
删除候选范围
- 设置了过期时间的候选集
- 没有设置过期时间的候选集
-
-
脏数据需要写会数据库,需要在修改时写回
\