Redis数据库里面的每个键值对都是由对象组成的,其中:
1、数据库键总是一个字符串对象
2、数据库键的值可以是字符串对象、列表对象、哈希对象、集合对象、有序集合对象这五种中的任意一种
Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库;而数据库的数量则由redisServer.dbnum属性保存
一、修改数据库
通过修改redisClient.db指针,让它指向服务器中不同的数据库,从而实现切换目标数据库的功能——这就是SELECT命令的实现原理
数据库主要由dict字典和expires两个字典构成,对数据库的操作都是建立在对字典的操作之上。其中dict字典负责保存键值对,而expires字典则负责保存键的过期时间。
数据库的键总是一个字符串对象,而值可以是任意一种Redis对象类型,包括字符串对象、哈希表对象、集合对象、列表对象和有序集合对象,分别对应字符串键、哈希键、集合键、列表键和有序集合键。
expires字典的键指向数据库当中的某个键,而值则记录了数据库键的过期时间,过期时间是一个以毫秒为单位的UNIX时间戳。
二、惰性删除和定期删除
Redis使用惰性删除和定期删除两种策略来删除过期的键:
1.1 惰性删除只是在碰到过期键的时候才进行删除操作
1.2 定期删除就是每隔一定时间主动查找并删除过期的键
执行SAVE命令或者BGSAVE命令所产生的新RDB文件不会包含已经过期的键;执行BGREWRITEAOF命令所产生的重写AOF文件不会包含已经过期的键
当一个过期键被删除之后,服务器会追加一条DEL命令到现有AOF文件的末尾,显示地删除过期键;当主服务器删除一个过期键过后,它会向所有的从服务器发送一条DEL命令,显示地删除过期键;而从服务器即使发现过期键也不会自作主张地删除它,而是等待主节点发来DEL命令,这种统一、中心化的过期键删除策略可以保证主从服务器数据的一致性
当Redis命令对数据库进行修改后服务器会根据配置向客户端发送数据库通知。
三、RDB持久化
因为Redis是内存数据库,它将自己的数据库状态存储在内存里面,如果不想办法将存储在内存中的数据库状态保存到磁盘上,那么一旦服务器进程退出,服务器中的数据库状态就会不见。
因此Redis提供了RDB持久化功能,这个功能可以将存储在内存中的数据库状态保存到磁盘上,避免数据意外丢失。
1、RDB文件的创建与载入
有两个命令可以用于生成RDB文件,一个是SAVE,一个是BGSAVE
1.1 SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成为止,在服务器进程