【面试官】Redis过期键删除策略是什么?
- 面试官:Redis的数据库知道吧?
- 面试官:那数据库的键空间呢?
- 面试官:一个键要怎么设置过期时间?
- 面试官:那键的过期时间知道用什么存储吗?
- 面试官:键的过期删除策略是什么?
- 面试官:Redis还有什么策略可以释放内存?
大家好,我是南哥。
一个Java学习与进阶的领路人,跟着南哥我们一起Java成长。
文章目录
- Redis数据库
- Redis数据库的理解
- 数据库的键空间
- 键过期时间
- 过期字典
- 内存回收策略
- 过期键删除策略
- 内存淘汰策略
1. Redis数据库
1.1 Redis数据库的理解
面试官:Redis的数据库知道吧?
我们可以把Redis的数据库和MySQL的数据库理解成同一个东西,不同数据库之间都是相互隔离的,在一个数据库中定义的键对其他数据库不可见。例如我们在Redis的数据库1设置键值对,在数据库1可以查询出来,而在数据库2中是查询不出来的。
# 示例命令
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set name JavaGetOffer
OK
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> get name
(nil)
127.0.0.1:6379[2]> select 1
OK
127.0.0.1:6379[1]> get name
"JavaGetOffer"
Redis默认会创建16个数据库,在业务上我们可以把不同业务所需键值对存储在不同Redis数据库,来达到根据业务划分不同数据库存储的作用。
# 查询一共有几个数据库
127.0.0.1:6379> config get databases
1) "databases"
2) "16"
另外Redis数据库主要由这两部分组成:dict字典即键空间、expires字典即过期字典,我们下文会讲到。
1.2 数据库的键空间
面试官:那数据库的键空间呢?
键空间顾名思义是存储键的容器,在Redis上字典存储了数据库中所有的键值对,这个字典也就是键空间。
大家记住不要把字典和Redis提供的哈希对象弄混淆了,前者是Redis的底层数据结构支持,而后者是Redis提供给外部使用的。
Redis对键值对的添加、删除、更新、查询操作都是基于键空间的基础上,先从dict字典查询出键,再根据键找到对应值进行操作。
1.3 键过期时间
面试官:一个键要怎么设置过期时间?
可以先设置键值对,后使用EXPIRE命令
来设置键的过期时间,过期时间的单位是秒。
127.0.0.1:6379> set name0 JavaOffer训练营
OK
127.0.0.1:6379> expire name0 66
(integer) 1
127.0.0.1:6379> ttl name0
(integer) 66
127.0.0.1:6379> get name0
"JavaOffer训练营"
另外也可以使用SETEX命令
一步到位,同时设置值和过期时间。
127.0.0.1:6379> setex name 66 JavaGetOffer
OK
127.0.0.1:6379> ttl name
(integer) 66
127.0.0.1:6379> get name
"JavaGetOffer"
大家回答面试官时补充企业实战的具体细节是可以加分的,例如对键值对设置过期时间,可以使用Jedis客户端的setex方法。
public String setex(String key, int seconds, String value) {
this.checkIsInMultiOrPipeline();
this.client.setex(key, seconds, value);
return this.client.getStatusCodeReply();
}
1.4 过期字典
面试官:那键的过期时间知道用什么存储吗?
既然所有键使用字典存储起来,那键的过期时间也可以使用字典存储起来,这个字典我们称它为过期字典。
因为键空间已经存储了所有的键值对,过期字典没必要再存储一次,所以过期字典的键地址指向的是键空间的指针。而过期字典的值是一个long long类型的整数,代表了过期日期的UNIX时间戳。
2. 内存回收
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
👉以面试官面试的形式,涵盖了你怒怼大厂面试官、拿下大厂面试所需掌握的核心知识、面试重点! 👉相信一定对你顺利通关面试、拿到理想Offer有所帮助! 👉花费大量精力去制作本专栏,创作不易,各位的支持就是我创作的最大动力!