一、redis数据库
1、redis数据库的数据结构
2、切换数据库
默认情况下,redis客户端的目标数据库为0号数据库,但客户端可以通过执行select命令来切换目标数据库
在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDB结构的指针。
3、数据库键空间
redisDb结构的dict字典保存了数据库中的所有键值对,这个字典称为键空间
键空间的键也就是数据库的键,每个键都是一个字符串对象
键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种redis对象。
所有针对数据库的操作,比如添加一个键值对到数据库,或者从数据库删除一个键值对,又或者在数据库获取某个键值对等,实际上都是通过对键空间字典进行操作来实现的。
4、数据库操作原理
添加新建set
实际上就是将新建值对添加到键空间字典里面,其中键为字符串对象,值为任意一种类型的redis对象
删除键 del
在键空间里面删除键所对应的键值对对象
更新建 set
对键空间里面键所对应的值对象进行更新,根据值对象的类型不同,更新的具体方法也会有所不同
对键取值 get/lrange
在键空间查找键,找到键之后接着取得该键所对应的字符串对象值,之后再返回值/列表对象所包含的字符串。
清空整个数据库 flushdb:删除键空间所有的键值对
随机返回数据库中的某个键randomkey:通过在键空间中随机返回一个键来实现
返回数据库数量dbsize:返回键空间中包含的键值对的数量。
二、设置键的生存时间或过期时间
1、设置过期键
expire <key> <ttl>命令用于将键key的生存时间设置为ttl秒
pexpire <key> <ttl>命令用于将键key的生存时间设置为ttl毫秒
expireat <key> <timestamp>命令用于将键key的过期时间设置为timestamp所指定的秒数时间戳
pexpireat <key> <timestamp>命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳
2、保存过期键
在数据库结构 redisDb 中的expires 字典保存了数据库中所有键的过期时间,这个字典成为过期字典.
过期字典是一个指针,指向键空间的某个键对象
过期字典的值是一个 long long 类型的整数,这个整数保存了键所指向的数据库键的过期时间–一个毫秒级的 UNIX 时间戳
3、移除过期时间
PERSIST 就是 EXPIRE命令的反操作: 在过期字典中查找给定的键,并解除键和值(过期时间)在过期字典中的关联。
4、计算并返回剩余生存时间
TTL 命令以秒为单位返回键的剩余生存时间, PTTL以毫秒为单位返回键的剩余生存时间.
5、过期键的删除策略
- 定时删除:在设置键的过期时间的同时,创建一个定时器,当过期时间到达时,由事件处理器自动执行键的删除操作。
- 惰性删除:放任键过期不管,但是在每次从键空间中获取键值时,都要检查取得的键是否过期,如果过期的话,就删除它,并返回空;如果没过期,就返回键值。
- 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。
6、Redis 使用的策略
Redis 使用的过期键删除策略是惰性删除加上定期删除, 这两个策略相互配合,可以很好地在合理利用 CPU 时间和节约内存空间之间取得平衡。