redis只要是由服务器和客户端组成的。
每一个服务器端都会有一个redisServer结构
struct redisServer{
redisDb *db;//一个数组,保存服务器所有的数据库
int sum;//数据库个数,默认是16个
}
每一个客户端都会有一个redisclient结构体
redisclient{
redisDb *db;//记录当前数据库,通过server传送过来的
}
redis是键值对数据库服务器,通过数据库空间,保存数据库键值对。
redisDb{
dict *dict;//通常是stringobject,因为键值对的键都是字符串对象,然后值可以是五种对象的任意一种
dict *expire;//设置某一个键值对的生存时间
};
键空间是通过字典实现的,键值对的增删查改是通过操作字典实现的。
设置生存时间或者过期时间
- expire expire key 5 该键值对秒后过期
- expireat expireat key XXX 该键值对在某时某刻过期,时间戳
- 通过TTL/PTTL查询该键值对剩余的生存时间
设置时间戳的底层实现
expire pexpire expireat都是转换为pexpireat来实现的。
当键值对从dict中删除时候,也要删除该键值对的过期 expire
persist命令移除一个键值对的过期值,pexpierat的反操作
判断过期健
- 检查给定的键值对(健)是否存在于过期字典中,如果不存在直接返回,如果存在,则获取过期时间。
- 检查当前时间UNIX是否大于给定时间,如果大于则过期
也可以通过TTL获取时间戳,查看该键值对所对应的值是否大于0.如果是则代表存活
重点是:因为它直接对字典进行操作,比执行一条指令所花费的时间更加少
过期键的删除策略
1.定时删除:
创建一个定时器,每一个键值对都创建一个定时器,定时器在键过期时间来临时,立即删除
2.定期删除:
每隔一段时间,对数据库进行一次检查,删除里面的过期键值对
3.懒惰删除:
放置不理,但每次查找时候,都会首先检查该键值对是否设定过期,如果设定则判断是否过期,如果过期删除键值对 以及时间过期。然后就返回空。
- 定是删除是对内存非常友好,但是对CPU不友好,降低吞吐量
- 懒惰删除是对内存不友好,对CPU友好,如果某一个键值对一直没有访问会造成内存溢出问题
- 适中选择 时间与内存
定期删除是expirecycle函数每次从一定的数据库中选取一定数量的键值对进行检查,一直轮询到检查完毕为止。
下面是接下来几章的预习吧
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
RDB AOF持久化功能 和 复制功能
1.生成RDB文件
save或bgsave存储的是redis中没有过期的键值对
2.载入RDB文件
有两种方法载入RDB文件:主服务器模式 从服务器模式
- 主服务器模式:是加载至主服务器的数据库中,加载之前先判断该键值对是否过期
- 从服务器模式:无脑加载至从服务器数据,但是主从同步时,先删除从服务器数据
3.AOF持久化功能(记录的是操作,非数据,增删查改)
- 如果数据库中某一个键值对过期,但是没有执行删除的话,对aof文件是没有影响的。
- 但是进行删除的话,要显示追加命令到aof文件中
get方法查询某个键值对时候
- 从数据库中删除键值对
- 追加一条DEL命令到AOF文件
- 对GET命令返回
4.AOF重写 aof一般保存的是操作命令(不保存查询命令),当积累过多时候,文件夹过大,就要进行AOF重写
程序会对数据库中的键值对进行检查,如果该键值对没有过期的话,会写一条类似插入键值对指令到aof文件中。过期的键值对是不会保存在aof文件中。
5.复制模式(主从复制模式,从只读,主读改)
- 主服务器在删除键值对的时候,会显示给从服务器发送删除键值对的指令,保证主从一致(从服务器接受指令后才会删除)
- 如果该键值对过期了,但是在主从服务器中都没有删除,客户端访问从服务器时候,就算该键值对过期也依然返回该值。
- 保证主从数据一致性