Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
一、基本内存淘汰策略:
不管是本地缓存还是分布式缓存,为了保证较高性能,都是使用内存来保存数据,由于成本和内存限制,当存储的数据超过缓存容量时,需要对缓存的数据进行剔除。
一般的剔除策略有 FIFO 淘汰最早数据、LRU 剔除最近最少使用、和 LFU 剔除最近使用频率最低的数据几种策略。
-
noeviction:禁止驱逐数据,返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
-
allkeys-lru: 从数据集中,挑选最近最少使用用的数据淘汰。尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
-
volatile-lru: 从已设置过期时间的数据集中,挑选最新最少使用的数据淘汰。尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
-
allkeys-random: 从数据集中,任意选择数据淘汰。回收随机的键使得新添加的数据有空间存放。
-
volatile-random: 从已设置过期时间的数据集中任意选择数据淘汰。回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
-
volatile-ttl: 从已设置过期时间的数据集中,挑选将要过期的数据淘汰。回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
如果没有键满足回收的前提条件的话,策略volatile-lru, volatile-random以及volatile-ttl就和noeviction 差不多了。
二、经典面试问题:
(一)简单介绍一下Redis的内存淘汰策略吧
(答案如上)
(二)MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?
答:限定 Redis 占用的内存,Redis 会根据自身数据淘汰策略,加载热数据到内存。 所以,计算一下 20W 数据大约占用的内存,然后设置一下 Redis 内存限制即可。Redis存储数据会限制它内存大小,如果超过了最大内存容量,会触发数据淘汰策略。