1、redis服务器中的数据库,都保存在服务器状态redisserver结构的db数组中,每一个项都是redisdb
dbnum : 服务器数据库数量,默认创建16个数据库
2、切换数据库
redisclient 保存着数据库的指针 select 2 ,切换到下标为2的数据库,通过修改Redisclient.db指针实现
3、数据库键空间
redisdb结构的dict字典保存了数据库中的所有键值对,将这个字典称为键空间(key space)
键空间中的键是一个字符串对象,值可以是字符串对象,列表对象,hash对象,集合对象,有序集合对象任意一种redis对象
3.1、redis支持 添加新键,删除键,对键取值,清空数据库
4、读写键空间时的维护
读取一个键后,服务器会根据键是否存在来更新服务器键空间命中(hit)次数或键空间不命中(miss)次数,值可以通过info stats 命令查询keyspace_hits 属性和keyspace_misses属性
读取后悔更新lru,最后一次使用时间,这个值可以用于计算键的空置时间,使用objectidletime key来查看key闲置时间
如果服务器读取一个键时发现该键过期,会先删除这个过期键,然后执行余下操作
如果客户端使用watch命令监视了某个键,那么服务器被监视的键修改之后,会将这个键标记为脏,从而让事务程序注意到已经被修改,每次修改,都会对脏键计数器增1
5、设置键的生存时间或过期时间 expire pexpire expireat pexpireat
5.1、保存过期时间,redisdb结构的expires字典保存了数据库中所有键的过期时间,我们称为字典的过期字典,键是一个指针,指向键空间中某个键对象,值是一个long类型整数,保存了键所指向的数据库的过期时间
6、移除过期时间 persist
7、过期键删除
定时删除,设置过期时间同时,创建一个定时器,让定时器在键的过期时间来临时,删除键,主动删除,耗CPU,节省内存
惰性删除,放任键过期不管,但是每次从键空间中获取时,都检查取得的键是否过期,如果过期就删除该键,如果没有过期,就返回该键,被动删除,耗内存,省CPU
定期删除:每个一段时间,就对数据库进行一次检查,删除里面的过期键,至于删除多少个数据库,则由算法决定 ,需要合理设置执行时长和执行频率
可以配合使用第一种和第二种
8、aof rdb 和复制功能对过期键的处理
执行save或者bgsave命令创建一个新的rdb文件时,程序会对数据库中的键进行检查,已过期键不会被保存到rdb文件中
当启动redis服务器时候,如果开启了rdb功能,,服务器将载入rdb文件
当服务器以aof持久化模式运行,某个过期键被删除,aof文件会追加(append)一条del命令,来显式地记录该键已被删除
复制
主服务器命令会同步到从服务器
9、数据库通知
网友评论