【微服务】第34节:Redis的内存回收

  IT领域往往都是面试造火箭,实际工作拧螺丝。为了更好的应对面试,让大家能拿到更高的offer✉,我们接下来就讲讲“造火箭”的事情🧑‍🚀。

🔥🔥🔥 包括以下几方面🔽 🎈:

🌈 - Redis - 高级:

  • 📛 -Redis主从

  • 🤿 - Redis哨兵

  • 🧩 - Redis分片集群

  • 👨‍💻 - Redis数据结构

  • ♻️ - Redis内存回收(◀️)

  • ✅ - Redis缓存一致性

1.Redis内存回收

Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能。

我们可以通过修改redis.conf文件📄,添加下面的配置来配置Redis的最大内存:

maxmemory 1gb

当内存达到上限,就无法存储更多数据了。因此,Redis内部会有两套内存回收的策略:

  • ✡️ 内存过期策略

  • ✡️ 内存淘汰策略

1.1.内存过期处理

存入Redis中的数据可以配置过期时间,到期后再次访问会发现这些数据📚都不存在了,也就是被过期清理了。

1.1.1.过期命令

Redis中通过expire命令可以给KEY设置TTL(过期时间),例如:

# 写入一条数据
set num 123
# 设置20秒过期时间
expire num 20

不过set命令本身也可以支持过期时间的设置:

# 写入一条数据并设置20s过期时间
set num EX 20

当过期时间到了以后,再去查询数据,会发现数据已经不存在。

1.1.2.过期策略

那么问题来了:

  • ⭕ Redis如何判断一个KEY是否过期呢?

  • ⭕ Redis又是何时删除过期KEY的呢?

Redis不管有多少种数据类型,本质是一个KEY-VALUE的键值型数据库,而这种键值映射底层正式基于HashTable来实现的,在Redis中叫做Dict.

来看下RedisDB的底层源码:

typedef struct redisDb {
    dict dict;                 / The keyspace for this DB , 也就是存放KEY和VALUE的哈希表*/
    dict *expires;              /* 同样是哈希表,但保存的是设置了TTL的KEY,及其到期时间*/
    dict *blocking_keys;        /* Keys with clients waiting for data (BLPOP)*/
    dict *ready_keys;           /* Blocked keys that received a PUSH */
    dict *watched_keys;         /* WATCHED keys for MULTI/EXEC CAS /
    int id;                     / Database ID, 0 ~ 15 /
    long long avg_ttl;          / Average TTL, just for stats /
    unsigned long expires_cursor; / Cursor of the active expire cycle. */
    list *defrag_later;         /* List of key names to attempt to defrag one by one, gradually. */
} redisDb;

现在回答第一个问题:

✅ 面试题:Redis如何判断KEY是否过期呢?

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫蜜柚子茶

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值