前言

内存大小

  • 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。

  • 如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存

  • 设置最大内存大小

    • 1、获取设置的Redis能使用的最大内存大小
      • config get maxmemory 命令可以获取设置的Redis能使用的最大内存大小,Redis中默认是0,所以是不限制内存大小,依赖于硬件内存大小
    • 2、通过配置文件配置

      • 通过在Redis安装目录下面的redis.conf配置文件中添加以下配置设置内存大小

        1
        2
        // 设置Redis最大占用内存大小为100M
        maxmemory 100mb
    • 3、通过命令修改
      • Redis支持运行时通过命令动态修改内存大小
        1
        2
        3
        4
        // 设置Redis最大占用内存大小为100M
        127.0.0.1:6379> config set maxmemory 100mb
        // 获取设置的Redis能使用的最大内存大小
        127.0.0.1:6379> config get maxmemory

过期策略

  • Redis 的过期策略,就是指当 Redis 中缓存的 key 过期了,Redis 如何处理

  • 如果假设你设置了一批 key 只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?

    • 定期删除:redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载!
    • 惰性删除 :定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。这就是所谓的惰性删除,也是够懒的哈!
  • 仅仅通过设置过期时间还是有问题的。我们想一下:如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期key堆积在内存里,导致redis内存块耗尽了。怎么解决这个问题呢? redis 内存淘汰机制。

  • 实际上Redis定义了几种策略用来处理这种情况:

    • noe-viction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
    • allkeys-lru:从所有key中使用LRU算法进行淘汰
    • volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
    • allkeys-random:从所有key中随机淘汰数据
    • volatile-random:从设置了过期时间的key中随机淘汰

其他

MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据

  • 提供一种简单实现缓存失效的思路: LRU(最近少用的淘汰)
  • 即redis的缓存每命中一次,就给命中的缓存增加一定ttl(过期时间)(根据具体情况来设定, 比如10分钟).
  • 一段时间后, 热数据的ttl都会较大, 不会自动失效, 而冷数据基本上过了设定的ttl就马上失效了.

总结

  • Redis在默认配置下是不限制内存大小,依赖于硬件内存大小,如果机器存不了的话再次往redis写数据的话就报错了

  • 针对上面这个问题,redis提供了几种数据淘汰策略,大家可以根据实际需要选择合适的淘汰策略

参考