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是否过期呢?
答: