redis只要是由服务器和客户端组成的。

每一个服务器端都会有一个redisServer结构

struct redisServer{
redisDb *db;//一个数组,保存服务器所有的数据库
int sum;//数据库个数,默认是16个
}
每一个客户端都会有一个redisclient结构体
redisclient{
redisDb *db;//记录当前数据库,通过server传送过来的
}

redis是键值对数据库服务器,通过数据库空间,保存数据库键值对。

redisDb{
dict *dict;//通常是stringobject,因为键值对的键都是字符串对象,然后值可以是五种对象的任意一种
dict *expire;//设置某一个键值对的生存时间
};

键空间是通过字典实现的,键值对的增删查改是通过操作字典实现的。

 

设置生存时间或者过期时间

  1. expire  expire key 5    该键值对秒后过期
  2. expireat    expireat key  XXX   该键值对在某时某刻过期,时间戳
  3. 通过TTL/PTTL查询该键值对剩余的生存时间

设置时间戳的底层实现

expire  pexpire  expireat都是转换为pexpireat来实现的。

 

当键值对从dict中删除时候,也要删除该键值对的过期 expire  

persist命令移除一个键值对的过期值,pexpierat的反操作

 

判断过期健

  1. 检查给定的键值对(健)是否存在于过期字典中,如果不存在直接返回,如果存在,则获取过期时间。
  2. 检查当前时间UNIX是否大于给定时间,如果大于则过期

也可以通过TTL获取时间戳,查看该键值对所对应的值是否大于0.如果是则代表存活  

重点是:因为它直接对字典进行操作,比执行一条指令所花费的时间更加少

 

过期键的删除策略

1.定时删除:

创建一个定时器,每一个键值对都创建一个定时器,定时器在键过期时间来临时,立即删除

2.定期删除:

每隔一段时间,对数据库进行一次检查,删除里面的过期键值对

3.懒惰删除:

放置不理,但每次查找时候,都会首先检查该键值对是否设定过期,如果设定则判断是否过期,如果过期删除键值对 以及时间过期。然后就返回空。

  1. 定是删除是对内存非常友好,但是对CPU不友好,降低吞吐量
  2. 懒惰删除是对内存不友好,对CPU友好,如果某一个键值对一直没有访问会造成内存溢出问题
  3. 适中选择   时间与内存

 

定期删除是expirecycle函数每次从一定的数据库中选取一定数量的键值对进行检查,一直轮询到检查完毕为止。

 

下面是接下来几章的预习吧

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

RDB AOF持久化功能  和  复制功能

1.生成RDB文件

save或bgsave存储的是redis中没有过期的键值对

2.载入RDB文件

有两种方法载入RDB文件:主服务器模式  从服务器模式

  1. 主服务器模式:是加载至主服务器的数据库中,加载之前先判断该键值对是否过期
  2. 从服务器模式:无脑加载至从服务器数据,但是主从同步时,先删除从服务器数据

3.AOF持久化功能(记录的是操作,非数据,增删查改)

  1. 如果数据库中某一个键值对过期,但是没有执行删除的话,对aof文件是没有影响的。
  2. 但是进行删除的话,要显示追加命令到aof文件中

get方法查询某个键值对时候

  1. 从数据库中删除键值对
  2. 追加一条DEL命令到AOF文件
  3. 对GET命令返回

4.AOF重写   aof一般保存的是操作命令(不保存查询命令),当积累过多时候,文件夹过大,就要进行AOF重写

程序会对数据库中的键值对进行检查,如果该键值对没有过期的话,会写一条类似插入键值对指令到aof文件中。过期的键值对是不会保存在aof文件中。

 

5.复制模式(主从复制模式,从只读,主读改)

  1. 主服务器在删除键值对的时候,会显示给从服务器发送删除键值对的指令,保证主从一致(从服务器接受指令后才会删除)
  2. 如果该键值对过期了,但是在主从服务器中都没有删除,客户端访问从服务器时候,就算该键值对过期也依然返回该值。
  3. 保证主从数据一致性