一、简介和应用
Redis是有C语言编写,支持网络、可持久化得k-v内存数据库。常用的类型主要是String、list、hash、set、zset这五种。
string:字符串整数或者浮点数 应用:缓存、限流、计数器、分布式锁、分布式session
list:链表,底层实现是quickList(快速列表,是ziplist压缩列表和linkedlist双端列表的组合)。redis中的列表支持两端插入和弹出。并可以获得指定位置(或范围)的元素,可以充当数组、队列。栈等 应用:存储简单队列列表
set:无序集合,底层是intset(整数集合)或者hashtable(字典) 应用:标签、关系等
hash:包含键值对的无序散列表,底层实现是ziplist(压缩列表)或者hashtable(字典哈希表)。hash对象之一满足1、哈希中元素量小于512个2、哈希中所以键值对的键和值字符串长度都小于64字节,才会使用ziplistlei,类似java中的hashMap. 应用:存储用户信息等一些组合查询
zet:有序键集合 应用:排行榜
二、内存模型
redis给每个k-v键值对分配一个dictEntry,里面有key和value指针。next指向下一个dictEntry形成链表。这个指正可以将多个hash值相同的键值对链接在一起。由此解决hash问题。
key以sds(简单的动态字符串)存储,简单字符串类似java的ArrayList<Character>,长度动态可变
value存储在redisObject中。有type字段指明了value对象的类型,ptr字段则指向对象所在的地址。redis对象的类型、内部编码、内存回收、共享对象等功能都需要redisObject支持。
三、持久化
1、RDB 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。rdb 保存的是dump.rdb文件。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
BGSAVE:Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。可以通过lastsave命令获取最后一次成功执行快照的时间。
将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。
2、AOF 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。Aof保存的是appendonly.aof文件。
AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof。
AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
三、redis sentinel(哨兵)原理
1、sentinel集群通过给定的配置文件发现master。通过向master发送info信息获得该服务器先的所有从服务器。
2、sentinel集群通过命令连接向被监视的从服务器发送hello信息(每秒一次),该信息包括sentinel本身的ip、端口、id等内容,以此来向其他sentinel宣告自己的存在。
3、sentinel集群通过订阅连接接收其他sentinel发送的hello消息,以此来发现监视同一个主服务器的其他sentinel;集群之间会相互创建命令连接用于通信,因为已经有主从服务器作为发送和接收hello消息的中介,sentinel之间不会创建订阅连接。
4、sentinel集群使用ping命令来检测实例的状态,如果在指定的时间内没有回复或返回错误的回复,那么该实例被判为下线。
5、当failover准备切换被触发后,failover并不会马上进行,好需要sentinel中的大多数sentinel授权后才可以进行failover,即进行failover的sentinel会去获得指定的quorum个的sentinel的授权,成功后进入odown状态。
6、sentinel向选为master的slave发送slaveof on one命令,选择slave的添加是sentinel首选会根据slaves的优先级来进行排序,优先级越小排名越靠前。
7、sentinel被授权后,它将会获得宕调的master的一份最新的配置版本号,宕failover执行结束后,这个版本号将用于最新的配置,通过广播的形式通知其他sentinel,其他的sentinel则更新对应的master的配置。