设置键的生存时间或过期时间
Setex(单位s),expire(s),pexpire(ms)可以设置键的生存时间,
Expirate,pexpirate设置键的过期时间(timestamp的时间戳)
Ttl和pttl返回键的剩余生存时间
RedisDb结构的expires字典保存了数据库的所有键的过期时间,称为过期字典。键是指向键对象的指针,值是longlong类型的整数,一个ms精度的unix时间戳
Persist可以移除键的过期时间
判断过期键
如果过期字典存在键,unix时间戳大于过期时间,键已经过期
过期键删除策略:定时删除,惰性删除,定期删除
1.定时删除:使用定时器,过期时间来临时进行删除。
2.惰性删除:获取键时检测是否过期,过期则删除。
3.定期删除:每隔一段时间随机抽取一些设置了过期时间的键,检测键是否过期,清理过期键。
Redis使用的是惰性删除,定期删除两种策略:获取键时检查是否过期,周期性检查。
Redis在键的过期时间到达之后并不会立即清除,过期键可能仍然存在一段时间,直到Redis检查到过期执行删除操作。如果需要确保即时删除过期键,可以使用DEL命令主动删除过期键。
也可以通过配置参数 maxmemory来限制Redis使用的内存大小,当内存达到限制时,Redis会根据所采用的内存淘汰策略来淘汰一些数据以释放内存空间。
发布与订阅
客户端使用subscribe订阅频道或模式
订阅关系保存在服务器状态的pubsub_channels字典里,字典的键为被订阅的频道,值为客服端的链表
订阅频道
使用subscribe订阅频道,服务器会将客服端和被订阅的频道在pubsub_channels字典中关联。如果频道没有任何订阅者,需要在pubsub_channels字典中新建一个该频道的键。客服端(订阅者)会被添加到值的链表的末尾。
退订频道
使用unsubscribe退订频道,在pubsub_channels字典中会在链表中删除退订的客户端。如果频道没有任何订阅者,需要删除该频道。
发送消息
使用publish向频道发送消息时,会将消息发送给频道的所有订阅者,然后将消息发送给所有和频道相匹配的模式的订阅者