简介
我们知道redis是一个非常常用的内存型数据库,数据从内存中读取是它非常高效的原因之一,那么但是如果有一天,「redis分配的内存满了怎么办」?遇到这个面试题不要慌,这种问题我们分为两角度回答就可以:
- 「redis会怎么做」?
- 「我们可以怎么做」?
增加redis可用内存
这种方法很暴力,也很好用,我们直接通过增加redis的可用内存就可以了, 有两种方式
- 「通过配置文件配置」 //设置redis最大占用内存大小为1000M**
maxmemory 1000mb** -
- 通过在redis安装目录下面的redis.conf配置文件中添加以下配置设置内存大小
- 「通过命令修改」//设置redis最大占用内存大小为1000M
127.0.0.1:6379> config set maxmemory 1000mb -
- redis支持运行时通过命令动态修改内存大小
这种方法是立竿见影的,reids 内存总归受限于机器的内存,也不能无限制的增长,那么如果没有办法再增加 redis 的可用内存怎么办呢?
内存淘汰策略
实际上Redis定义了**「8种内存淘汰策略」**用来处理redis内存满的情况:
- 1.noeviction:直接返回错误,不淘汰任何已经存在的redis键2.allkeys-lru:所有的键使用lru算法进行淘汰3.volatile-lru:有过期时间的使用lru算法进行淘汰4.allkeys-random:随机删除redis键5.volatile-random:随机删除有过期时间的redis键6.volatile-ttl:删除快过期的redis键7.volatile-lfu:根据lfu算法从有过期时间的键删除8.allkeys-lfu:根据lfu算法从所有键删除
这些内存淘汰策略都很好理解,我们着重讲解一下lru,lfu,ttl是怎么去实现的
lru的最佳实践?
lru是Least Recently Used的缩写,也就是**「最近很少使用」**,也可以理解成最久没有使用。最近刚刚使用过的,后面接着会用到的概率也就越大。由于内存是非常金贵的,导致我们可以存储在缓存当中的数据是有限的。比如说我们固定只能存储1w条,当内存满了之后,缓存每插入一条新数据,都要抛弃一条最长没有使用的旧数据。我们把上面的内容整理一下,可以得到几点要求:
- 「1.保证其的读写效率,比如读写的复杂度都是O(1)」
- 「2.当一条数据被读取,将它最近使用的时间更新」
- 「3.当插入一条新数据的时候,删除最久没有使用过的数据」
所以我们要尽可能的保证查询效率很高&#