通用命令
exists
判断某个key是否存在。
exists key
时间复杂度:O(1)
返回值:key 存在的个数。
del
删除指定的 key,可以一次删除一个或者多个。
del key
时间复杂度:O(1)
返回值:删除掉的 key 的个数。
expire
为指定的key删除过期时间,以秒为单位。
EXPIRE key seconds
时间复杂度:O(1)
返回值:1 表⽰设置成功。0 表⽰设置失败。
时间到后,指定的key就会被删除。
pexpire 是设置毫秒级别的定时
ttl
获取指定 key 的过期时间,秒级。
ttl key
时间复杂度:O(1)
返回值:剩余过期时间。-1 表⽰没有关联过期时间,-2 表⽰ key 不存在。
pttl是支持毫秒级别的查询的
type
返回 key 对应的数据类型。
type key
时间复杂度:O(1)
返回值: none , string , list , set , zset , hash and stream .。
redis中key的数据类型都是string,value会存在多种数据类型。
定时器
在某个时间到达之后,执行指定任务。
基于优先级队列或者堆实现的
在redis过期key的场景中,依据过期时间越早,优先级就越高。现在假定有很多快要过期的key,把这些key加入到优先级队列中,按照过期时间早的先出队列,队首元素就是最早要过期的key。
此时定时器中,只需要分配一个扫描线程,去检查队首元素是否过期即可。次时只需要关注队首元素即可,扫描对首元素也不能过于频繁,可以根据当前时间与队首元素过期时间设置一个等待时间,等时间到了之后再去唤醒这个线程。
添加新任务时,可唤醒一下刚才的线程,然后重新检查队首元素,计算等待时间。
基于时间轮实现的定时器
把时间划分为很小段,划分的长度根据需求而定。每一小段都挂着一个链表,每个链表都代表一个要执行的任务。
指针会隔固定时间间隔去尝试执行格子上链表中的任务。
redis中并没有采取上述两种方案。
redis中的过期策略
定期删除
每次抽取一部分,检验过期时间。
redis是单线程工作,主要的任务是处理每个命令的任务,所以为保证不阻塞,每次只检查一部分保证执行足够快。
惰性删除
有些key已经到了过期时间,但key暂时还是存在,紧接着后面访问到这个key了,先执行删除key操作,同时再返回一个nil。