Redis~数据库中键的操作与生存时间、过期时间和过期删除策略

} redisDb;

  • 键空间和用户所见的数据库是直接对应的:

键空间的键就是数据库的键,每个键都是一个字符串对象

键空间的值就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象

redis> SET message “hello world”

OK

redis> RPUSH alphabet “a” “b” “c”

(integer) 3

redis> HSET book name “Redis in Action”

(integer) 1

redis> HSET book author “Josiah L. Carlson”

(integer) 1

redis> HSET book publisher “Manning”

(integer) 1

在这里插入图片描述

  • 所以服务器中一个数据库就是一个大的字典, 也就是表空间, 而这个字典底层是一个hash类型, 所以我们操作数据库的时候, 其实就是操作这个数据库中这个hash表的kay和value

  • 添加一个新键值对到数据库,实际上就是将一个新键值对添加到键空间字典里面,其中 键为字符串对象,而值则为任意一种类型的Redis对象

  • 删除数据库中的一个键,实际上就是在键空间里面删除键所对应的键值对对象

  • 对一个数据库键进行更新,实际上就是对键空间里面键所对应的值对象进行更新

  • 对一个数据库键进行取值,实际上就是在键空间中取出键所对应的值对象

键的生存时间或过期时间


  • 生存时间:在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键, 比如设置存活10毫秒, 那么等降到0的时候就会删除他

  • 过期时间:是一个时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键, 比如设置10分钟后删除, 等时间到了就会删除他

设置键生存/过期时间

  • 设置生存时间:

EXPIRE :用于将键key的生存时间设置为ttl秒

PEXPIRE :用于将键key的生存时间设置为ttl毫秒

  • 设置过期时间:

EXPIREAT :用于将键key的过期时间设置为timestamp所指定的秒数时间戳

PEXPIREAT :用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳

过期时间的保存

  • redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:

typedef struct redisDb {

// …

dict *expires;//过期字典,保存着键的过期时间

// …

} redisDb;

  • 过期字典的键是一个指针,这个指针指向键空间中的某个键对象(也即是某个数据库键)

  • 过期字典的值是一个long long类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的时间戳

  • 为了展示方便,下图的键空间和过期字典中重复出现了两次alphabet键对象和book键对 象。在实际中,键空间的键和过期字典的键都指向同一个键对象,所以不会出现任何重复对 象,也不会浪费任何空间

在这里插入图片描述

  • PERSIST命令就是PEXPIREAT命令的反操作:PERSIST命令在过期字典中查找给定的键,并解除键和值(过期时间)在过期字典中的关联

  • 通过过期字典,程序可以用以下步骤检查一个给定键是否过期:

  1. 检查给定键是否存在于过期字典:如果存在,那么取得键的过期时间

  2. 检查当前UNIX时间戳是否大于键的过期时间:如果是的话,那么键已经过期;否则 的话,键未过期

过期删除策略


  • 如果一个键过期了,可以有下面3个过期删除策略:

①定时删除(Redis不支持)

②惰性删除

③定期删除

  • 在这3种策略中,第①种和第③种为主动删除策略,而第②种则为被动删除策略

  • Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以 很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡

定时删除(Redis不支持)

  • 在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作

  • Redis服务器没有使用这种策略

  • 因为其虽然对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽 可能快地被删除,并释放过期键所占用的内存, 但是它对CPU时间是最不友好的, 因为redis是超快速,高刷新率,高扩展性的数据库服务器在过期键在某一时间比较多的情况下,删除过期键这一操作可能会占用相当一部分CPU时间,redis是非常喜欢用空间换取时间效率的, 所以在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响

惰性删除


  • 放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键

  • 对CPU时间来说是最友好的:程序只会在取出键时才对键进行过期检查, 发现过期了就删除, 这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何CPU时间

  • 所以它对内存是最不友好的:如果一个键已经过期,而这个键又仍 然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放

定期删除


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值