如果有一天当你的Redis 内存满了,该怎么办?

简介

我们知道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.当插入一条新数据的时候,删除最久没有使用过的数据」

所以我们要尽可能的保证查询效率很高&#x

你可能感兴趣的:(redis,数据库,缓存,java)