mySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保
证 redis 中的数据都是热点数据?
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
通过配置 redis.conf 文件中 maxmemory 的值来开启内存淘汰功能。当客户端发起了需要申
请更多内存的命令,redis 检查内存使用情况,如果已经使用的内存大于 maxmemory,则开
始根据用户配置的不同淘汰策略来淘汰一些数据,从而换取一定的内存。
配置# maxmemory-policy noeviction 来选择不同的策略。Redis 支持运行时修改淘汰策略,不
需要重启 redis 实例而实时的调整内存淘汰策略。
redis 提供 6 种数据淘汰策略。
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据
淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
lru
在服务器配置中保存了 lru 计数器 server.lrulock,会定时(redis 定时程序 serverCorn())
更新,server.lrulock 的值是根据 server.unixtime 计算出来的。
另外,从 struct redisObject 中可以发现,每一个 redis 对象都会设置相应的 lru。可以想象
的是,每一次访问数据的时候,会更新 redisObject.lru。
LRU 数据淘汰机制是这样的:在数据集中随机挑选几个键值对,取出其中 lru 最大的键值
对淘汰。所以,你会发现,redis 并不是保证取得所有数据集中最近最少使用(LRU)的键
值对,而只是随机挑选的几个键值对中的。
评论0