Redis内存管理(过期删除策略,缓存过期时间)

1.Redis 给缓存数据设置过期时间有啥用?
  因为内存是有限的,如果缓存中的所有数据都是一直保存的话,分分钟直接 Out of memory。
  Redis自带了给缓存数据设置过期时间的功能,比如:
127.0.0.1:6379> expire key 60 # 数据在60s后过期 (integer) 1127.0.0.1:6379> setex key 60 value # 数据在60s后过期 (setex:[set] + [ex]pire) OK127.0.0.1:6379> ttl key # 查看数据还有多久过期(integer) 56
注意:Redis 中除了字符串类型有自己独有设置过期时间的命令 setex 外,其他方法都需要依靠 expire 命令来设置过期时间 。另外, persist 命令可以移除一个键的过期时间。
 
过期时间除了有助于缓解内存的消耗,还有什么其他用么?
  很多时候,我们的业务场景就是需要某个数据只在某一时间段内存在,比如我们的短信验证码可能只在1分钟内有效,用户登录的token可能只在 1 天内有效。如果使用传统的数据库来处理的话,一般都是自己判断过期,这样更麻烦并且性能要差很多。
 
2.Redis 是如何判断数据是否过期的呢?
  Redis 通过一个叫做过期字典(可以看作是 hash 表)来保存数据过期的时间。过期字典的键指向 Redis 数据库中的某个 key(键),过期字典的值是一个 long long 类型的整数,这个整数保存了 key 所指向的数据库键的过期时间(毫秒精度的 UNIX 时间戳)。
 
 
3.过期的数据的删除策略了解么?
  常用的过期数据的删除策略两个:
  ·惰性删除:只会在取出 key的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。
  ·定期删除: 每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。
  定期删除对内存更加友好,惰性删除对 CPU 更加友好,所以 Redis 采用的是 定期删除+惰性/懒汉式删除 。
  但是,仅仅通过给 key 设置过期时间还是有问题的。因为还是可能存在定期删除和惰性删除漏掉了很多过期 key 的情况。这样就导致大量过期 key 堆积在内存里,然后就 Out of memory了。
怎么解决这个问题呢?答案就是:Redis 内存淘汰机制。
 
4.Redis 内存淘汰机制了解么?
  MySQL有2000w数据,Redis中只存20w,如何保证Redis中的数据都是热点数据?
  Redis提供6种数据淘汰策略
·volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
·volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
·volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
·allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
·allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
·no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!
4.0 版本后增加以下两种:
·volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
·allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key
posted @ 2023-09-10 20:52  壹索007  阅读(16)  评论(0编辑  收藏  举报