一、对象
1. Redis数据库中的每个键值对的键和值都是一个对象
2. Redis共有字符串(string),哈希(hash),列表(list),集合(set),有序集合(zset)五种类型的对象,每种类型的对象都至少包含两种或以上的编码方式,不同的编码方式可以在不同的使用场景上优化对象的使用效率。
3. 内存回收:
因为C语言并不支持内存的自动回收功能, 所以Redis在自己的对象系统中构建了一个引用计数技术实现的内存回收机制,通过这一机制, 程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。
4. 对象共享:
对象共享可以很大程度上节约内存,Redis只对包含整数值(0~9999)的字符串对象进行共享。
如果键A创建了一个包含整数值100的字符串对象,键B也创建了一个整数值100的字符串对象,那么在Redis中键A与键B将共享同一个整数值100的字符串对象,如下图:
二、Redis过期键删除策略
如果一个键过期了,那么一般会有以下几种不同的删除策略:
1. 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间到达时,立即执行键的删除操作。
2. 惰性删除:只有在获取键的时候,才检查键是否过期,如果过期就删除,否则返回该键。
3. 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。
以上三种删除策略某种程度上都存在一定的问题,定时删除可以最大程度的释放内存,但是如果过期键比较多的时候,在删除的时候会占用相当一部分的CPU时间,会造成服务器在响应时间与吞吐量会下降。惰性删除对CPU时间来说是友好的,但如果相当一部分键长时间未被访问,那么就会存在内存泄漏的问题。定期删除的难点是需要制定一个合理的执行时长与执行频率。
那其实Redis服务器实际使用的惰性删除与定期删除策略的结合,通过这两种策略的结合可以很好的合理使用CPU时间与和避免内存浪费之间取得平衡。
三、数据库
1. Redis数据库是由dict和expires两个字典组成,其中dict字典负责保存键值对,而expires字典负责保存键的过期时间。
2. 当主服务器删除一个过期键时,它会向所有从服务器发送一条DEL命令来显示的删除过期键。
3. 从服务器即使发现过期键也不会主动删除它,而是等待主节点发来DEL命令,这种删除策略保证了主从服务器数据的一致性。
四、数据持久化
1. RDB持久化:
RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行,该功能可以将某个时间点的数据库状态保存到RDB文件中,避免数据意外丢失。
RDB文件的创建可以通过SAVE与BGSAVE两个命令来生成,SAVE命令会阻塞Redis服务器进程,在SAVE命令执行期间,客户端发送的任何请求都会被服务器拒绝。而BGSAVE命令则不会阻塞,因为BGSAVE命令的保存工作是由子进程来完成的,在 执行BGSAVE命令的时候客户端的SAVE, BGSAVE, BGREWRITEAOF命令都会被阻塞。
RDB文件载入,服务器在载入RDB文件时会一直处于阻塞状态,直到载入完成。
自动间隔性保存配置:
save 900 1
save 300 10
save 60 10000
只要满足以上任何一个条件BGSAVE就会被执行。
2. AOF持久化
与RDB持久化通过保存数据库中的键值对来记录数据库状态不同的是,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。