首页 > 其他 > 详细

redis设计与实现第二章读书笔记

时间:2019-12-10 15:55:46      阅读:84      评论:0      收藏:0      [点我收藏+]

第九章数据库

Redis将所有数据库都保存在redisServer结构体的db数组中,db数组的每一项都是一个redisDb结构,代表一个数据库。    

struct redisServer{
//
... redisDb * db; int dbnum //要创建的服务器数量,默认16 //... }

1.每个redis客户端都有自己的target数据库,默认情况下都是0号库,可以使用SELECT X来切换数据库。
2.redis是一个键值对数据库服务器,每个数据库对应一个redisDb结构体,redisDb结构体中的dict字典保存了所有的键值对,称为键空间。键空间的键是字符串对象,值可以是5大对象中的任意一个。对数据库的增删改查其实就是对这个dict字典进行增删改查。

typedef struct redisDb{
    //...
    //数据库键空间,保存着数据库所有键值对
    dict *dict;
//过期字典,保存这键的过期时间
dict *expires;
//... }redisDb;

3.当使用redis命令对数据库读写时,不仅会对键空间进行指定的操作,还会执行一些额外操作:

 

1.在读取一个键之后,会根据键是否存在来更新服务器键空间中的命中次数和不命中次数
2.在读取一个键之后,服务器会更新键的LRU时间(最后一次使用时间),以计算键的闲置时间
3.如果服务器在读取一个键的时候发现该键已经过期,则会先删除这个过期的键
4.如果有客户端使用WATCH监视了某个键,那么服务器会对被监视的键进行修改后,将其标记为dirty来让事务程序注意到键已被修改
5.服务器每修改一个键都会对dirty计数器+1,会触发持久化和复制操作

 

4.通过EXPIRE和PEXPIRE可以用秒或者毫秒对key设置生存时间,服务器会自动删除生存时间(TTL)为0的key。
还可以通过EXPIREAT和PEXPIREAT对key设置过期时间,过期时间是UNIX时间戳,如1377257300,当时间到了就自动删除key。可以使用PERSIST移除一个key的过期时间。
以上4个关于过期时间的命令实际上都是通过PEXPIREAT来实现的。

5.redisDb结构中的expires字典保存了所有键的过期时间,称为过期字典。

6.过期键的删除策略
1.定时删除:在设置key的过期时间的同时,创建一个定时器,让定时器在过期时间到的时候删除。属于主动删除
2.惰性删除:过期就过期了,但是每次在键空间要访问该key时检查是否过期,如果过期了就删除。属于被动删除
3.定期删除:每个一定时间对数据库检查一次,删除过期的键。属于主动删除
7.定时删除:对内存最友好,但是对CPU时间不友好,会影响吞吐量和响应时间,而且创建定时器是O(n)的操作,所以大规模的定时删除是不现实的。
8.惰性删除:对CPU时间最友好,就是费内存,而且如果某些过期键不会被访问的话就永远不会被删除了,相当于内存泄漏。
9.定期删除是前两种方法的折中,难点是怎么确定定期删除的时长和频率。如果删除操作太频繁,就退化成定时删除了,如果执行的太少,就会浪费内存。
10.redis的过期键删除策略:
1.redis实际使用的是惰性删除和定期删除两种策略,通过结合使用这两种能在cpu时间和内存方面取得平衡的效果。
2.惰性删除没啥特殊的,就是在访问某key的时候如果过期了就由expireIfNeeded函数删除,然后返回不存在,如果没过期就正常访问。
3.定期删除:activeExpireCycle函数会周期执行,在规定时间内多次遍历服务器中的每个数据库,在expires字典中随机检查一部分key的过期时间,并删除过期的。
11.AOF、RDB和复制功能对过期键的处理(RDB,AOF等之后会详细讲):
1.执行SAVE或者GBSAVE命令会创建一个新的RDB文件,程序会对数据库中的key进行检查,不会把过期的键保存在RDB文件中。当启动redis服务器时,如果开启了RDB功能,则会对RDB文件进行载入,如果是主服务器(master),程序会对文件中保存的key进行检查,未过期的key才会载入到数据库,所以未过期的key对master是不会造成影响的。如果是从服务器(slave),不论是否过期,所有的key都会被载入。不过因为master在数据同步的时候slave会被清空,所以说到底也没啥影响。
2.当服务器已AOF持久化模式运行时,如果某个键已经过期,但是还没有被惰性删除或者定期删除,那么AOF文件不会因为这个过期键而产生影响。当这个键被删除后,程序会向AOF文件append一条DEL命令来记录这个键已经被删除。在执行AOF重写时,会对数据库的键进行检查,过期的键不会保存到重写后的AOF文件中。
3.当服务器运行在复制模式下时,slave的过期删除动作由master控制。master在删除一个过期键后,会显式的向所有slave发送一个DEL命令来删除这个过期键。slave在执行客户端的读命令时,就算键过期了也不会删除,只有收到master的DEL命令之后才会删除。这样可以保证主从服务器的数据一致性。

 

 

redis设计与实现第二章读书笔记

原文:https://www.cnblogs.com/love17311706/p/12016785.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!