文章目录
前言
大家好,我是小卷聊开发。春暖花开即将到来,整理了13道Redis高频面试题,有些不全面还请谅解,感谢观看!!!
1. Redis过期键的删除策略
- 定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键 的过期时间来临时,立即执行对键的删除操作。
- 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是 否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
- 定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键
2. Redis的淘汰策略
redis 内存数据集大小上升到一定大小的时候,就会施行 数据淘汰策略 。redis 提供6种数据淘汰策略:
通过淘汰策略也能保证Redis中缓存的都是热点数据。
一个客户端运行了新的命令,添加了新的数据。Redi 检查内存使用情况,如果大于 maxmemory 的限制, 则根据设定好的策略进行回收。
注意这里的 6 种机制,volatile 和 allkeys 规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的 lru、ttl 以及 random 是三种不同的淘汰策略,再加上一种 no-enviction 永不回收的策略。
使用策略规则:如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allkeys-lru;如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用:
allkeys-random
3. Redis分布锁的实现
Redis的分布式缓存特性使其成为了分布式锁的一种基础实现。通过Redis中是否存在某个锁ID,则可以判断是否上锁。为了保证判断锁是否存在的原子性,保证只有一个线程获取同一把锁,Redis有 SETNX (即SET if Note Exists)和 GETSET (先写新值,返回旧值,原子性操作,可以用于分辨是不是首次操作)操作。
(1)关于setnx:
- 将 key 的值设为 value ,当且仅当 key 不存在,返回值为1。
- 若给定的 key 已经存在,则setnx不做任何动作,返回值为0。
(2)关于set:一般操作
- ex seconds - seconds:设置失效时长,单位秒
- px - milliseconds:设置失效时长,单位毫秒
- nx - key不存在时设置value,成功返回OK,失败返回(nil)
- xx - key存在时设置value,成功返回OK,失败返回(nil)
为了防止主机宕机或网络断开之后的死锁,Redis没有ZK那种天然的实现方式,只能依赖设置超时时间来规避。所以如果使用setnx来实现分布式锁,则实现步骤如下:
- 先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。
- 如果在 setnx 之后,执行 expire 之前进程意外 crash 或重启维护, 那么就需要把 setnx 和 expire 合成一条指令来用。
Redis 的 setnx 命令是当 key 不存在时设置 key ,但 setnx 不能同时完成 expire 设置失效时长,不能保证 setnx 和 expire 的原子性。我们可以使用 set 命令完成 setnx 和 expire 的操作,并且这种操作是原子操作。举个例子如下:
案例:设置name=p7+,失效时长100s,不存在时设置
1.1.1.1:6379> set na