您的位置:首页 > 理论基础 > 数据结构算法

Redis核心数据结构和实现

2017-02-16 00:00 204 查看

数据结构和对象

不同对象及使用的数据结构

名称Type编码使用的数据结构
字符串stringREDIS_STRINGint/embstr/raw
列表listREDIS_LISTziplist/linkedlist
哈希hashREDIS_HASHziplist/hashtable
集合setREDIS_SETintset/hashtable
有序集合zsetREDIS_ZSETziplist/skiplist
数据结构定义

名称object encoding编码作用
整数intREDIS_ENCODING_INT
embstr编码简单动态字符串SDSembstrREDIS_ENCODING_EMBSTR专门处理短字符串(<=39字节)
简单动态字符串rawREDIS_ENCODING_RAW
字典hashtableREDIS_ENCODING_HT
双端链表linkedlistREDIS_ENCODING_LINKEDLIST
压缩列表ziplistREDIS_ENCODING_ZIPLIST
整数集合intsetREDIS_ENCODING_INTSET
跳跃表和字典skiplistREDIS_ENCODING_SKIPLIST

数据库存储结构

Redis的三级索引结构

graph TD
A[数据库db] --> B(数据库键空间dict)
B --> C{键空间的值}
C --> D[ListObject]
C --> E[HashObject]
C --> F[StringObject]

键空间的维护

增(SET)/删(DEL)/改()/查(GET)/设置过期时间(EXPIRE)

过期键采用“定期删除 + 惰性删除”策略

RDB文件不包含过期键

AOF文件显示追加一条DEL命令

主从模式,从服务器只有等主服务器发送DEL命令,才会删除自己的过期键,保证一致性

数据持久化

RDB

其实就是内存快照,一个经过压缩的二进制文件,可以通过SAVE或者BGSAVE命令来创建,SAVE是阻塞命令,BGSAVE是非阻塞命令

AOF(Append Only File)

其实就是日志记录,通过持久化执行的命令来记录数据库状态。分为:命令追加、文件写入、文件同步三步完成。

事件

Redis服务器是事件驱动的,分为时间事件和文件事件

时间事件分为周期性事件和定时事件

文件事件是对socket操作的抽象:socket状态变化,产生相应的事件

主从

SLAVEOF命令,设置主从服务器关系

2.8之前通过sync实现复制,2.8之后,通过psync实现复制

psync的复制通过<偏移量、缓冲区、运行ID>来实现部分重新同步

主服务器向从服务器传播命令来更新从服务器状态,保持主从一致

从服务器向主服务器心跳检测,防止丢失命令

哨兵

Sentinel是运行在特殊状态下的Redis服务器,每10s一次检测主服务器是否存活

判断主服务器下线后,选举从服务器作为新的主服务器

选举方法:Raft

集群

查看集群状态:

> CLUSTER NODES
> CLUSTER INFO


添加集群节点:

> CLUSTER MEET <ip> <port>


查看key所在的slot,一共16384个slot

> CLUSTER KEYSLOT <key>


设置从节点

> CLUSTER REPLICATE <node_id>

其他

发布订阅

PUBLISH,SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE


事务

MULTI, EXEC, WATCH
redis 事务不支持回滚


慢查询日志

> SLOWLOG GET


成为Monitor,监视所有的操作命令

> MONITOR
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: