Redis的缓存过期和淘汰策略

目录

maxmemory

不设置的场景

设置的场景

expire数据结构

expire的使用

expire原理 

删除策略

定时删除(时间换空间)

惰性删除(空间换时间)

主动删除/定期删除

逐出算法 

LRU

LFU

random 随机

ttl

volatile-ttl

noenviction


Redis性能高: 官方数据: 读:110000次/s 写:81000次/s

长期使用,key会不断增加,Redis作为缓存使用,物理内存也会满

内存与硬盘交换(swap) 虚拟内存 ,频繁IO 性能急剧下降

这里主要涉及maxmemory、expire数据结构、删除策略和逐出算法。

maxmemory

不设置的场景

Redis的key是固定的,不会增加

Redis作为DB使用,保证数据的完整性,不能淘汰 , 可以做集群,横向扩展

缓存淘汰策略:禁止驱逐 (默认)

maxmemory : 默认为0 不限制

设置的场景

Redis是作为缓存使用,不断增加Key

问题:达到物理内存后性能急剧下架,甚至崩溃

内存与硬盘交换(swap) 虚拟内存 ,频繁IO 性能急剧下降

设置多少? 与业务有关

例如:

1个Redis实例,保证系统运行 1G ,剩下的就都可以设置

或者设置成: 物理内存的3/4

slaver : 留出一定的内存

在redis.conf中

maxmemory 1024mb

命令: 获得maxmemory数

CONFIG GET maxmemory

设置maxmemory后,当趋近maxmemory时,通过缓存淘汰策略,从内存中删除对象

不设置maxmemory 无最大内存限制 maxmemory-policy noeviction (禁止驱逐) 不淘汰

设置maxmemory maxmemory-policy 要配置

expire数据结构

在Redis中可以使用expire命令设置一个键的存活时间(ttl: time to live),过了这段时间,该键就会自动被删除。

expire的使用

expire命令的使用方法如下: expire key ttl(单位秒)

127.0.0.1:6379> expire name 2 #2秒失效 (integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name zhangfei
OK
127.0.0.1:6379> ttl name #永久有效 (integer) -1
127.0.0.1:6379> expire name 30 #30秒失效 (integer) 1
127.0.0.1:6379> ttl name #还有24秒失效 (integer) 24
127.0.0.1:6379> ttl name #失效
(integer) -2

expire原理 

typedef struct redisDb {
    dict *dict;  -- key Value
    dict *expires; -- key ttl
    dict *blocking_keys;
    dict *ready_keys;
    dict *watched_keys;
    int id;
} redisDb;

上面的代码是Redis 中关于数据库的结构体定义,这个结构体定义中除了 id 以外都是指向字典的指针, 其中我们只看 dict 和 expires。

dict 用来维护一个 Redis 数据库中包含的所有 Key-Value 键值对,expires则用于维护一个 Redis 数据 库中设置了失效时间的键(即key与失效时间的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值