在redis中主要用到的数据结构包括了简单动态字符串(SDS),双端链表,字典,压缩列表,整数集合等。 在redis中没有直接使用这些数据结构来实现键值对数据库, 而是基于这些数据结构创建一个对象系统. 这个系统包含了字符串对象,列表对象,哈希对象,集合对象和有序集合对象五中类型。每种对象都用到了至少一种数据结构。 对象优点 通过这五中不同类型的对象, Redis可以在执行命令之前, 根据对象的类型来判断一个对象是否可以执行给定的领命。 可以针对不同的使用场景, 为对象设置多种不同的数据结构实现,从而优化对象在不同…

1 4 月, 2021 0条评论 161点热度 0人点赞 专注着 阅读全文

服务器 命令请求的执行过程 使用SET KEY VALUE命令为例, 客户端和服务器共需要执行以下操作: 客户端向服务器发送命令请求SET KEY VALUE 服务器接收并处理客户端发来的命令请求SET KEY VALUE, 在数据库中进行设置操作, 并产生命令回复OK 服务器将命令回复OK发送给客户端 客户端接收服务器返回的命令回复OK, 并将这个回复打印给用户观看 发送命令请求 Redis服务器的命令去请求来自Redis客户端, 当用户在客户端中键入一个命令请求时, 客户端将会将这个命令请求转换成协议格式, 然…

30 3 月, 2021 0条评论 200点热度 0人点赞 专注着 阅读全文

对象编码 哈希对象的编码可以是ziplist或者hashtable ziplist ziplist编码的哈希对象使用压缩列表作为实现, 每当有新的键值对要加入到哈希对象时, 程序会先将保存了键的压缩列表节点推入到压缩列表表尾, 然后再将保存了值的压缩列表节点推入到压缩列表表尾. 优点 保存了同一键值对的两个节点总是紧挨在一起, 保存键的节点在前, 保存值的节点在后. 先添加到哈希对象中的键值对会被放在压缩列表的表头方向, 后来添加到哈希对象中的键值对会被放在压缩列表的表尾方向. hashtable hashtabl…

29 3 月, 2021 0条评论 139点热度 0人点赞 专注着 阅读全文

集合对象的编码可以是intset或者hashtable. intset编码的集合 intset编码集合对象使用整数集合作为底层实现, 集合对象包含的所有元素都被保存在整数集合里面. hashtable hashtable编码的集合对象使用字典作为底层实现, 字典的每个键都是一个字符串对象, 每个字符串对象包含了一个集合元素。而字典的值全部被设置为NULL 编码转换 集合对象保存的所有元素都是整数值 集合对象保存的元素数量不超过512个 不能满足这两个条件的集合对象需要使用hashtable编码 编码转换条件设置 s…

29 3 月, 2021 0条评论 139点热度 0人点赞 专注着 阅读全文

列表对象编码 列表对象可以是ziplist或者linkedlist两种。 编码转换条件 列表对象保存的所有字符串元素的长度都小于64字节 列表对象保存的元素数量小于512个 不能满足这两个条件的列表对象需要使用linkedlist编码 编码转换条件修改 list-max-ziplist-value: 用于修改能够保存的最大的字节数 list-max-ziplist-entries: 用于修改压缩列表在达到最大节点时, 就将压缩列表转换为链表 # Similarly to hashes, small lists ar…

29 3 月, 2021 0条评论 130点热度 0人点赞 专注着 阅读全文

有序集合对象 编码 有序集合的编码可以是ziplist或者skiplist ziplist ziplist编码的压缩列表对象使用压缩列表作为底层实现, 每个集合元素使用两个紧挨在一起的压缩列表节点来保存, 第一个节点保存元素的成员(member), 第二个元素保存元素的分值(score) 压缩列表内的集合元素按分值从小到大进行排序, 分值较小的元素被放置在靠近表头的方向, 而分值较大的元素则被放置在靠近表尾的方向 有序集合压缩列表实现方式 skiplist编码的有集合对象使用zset结构作为底层实现, 一个zset…

28 3 月, 2021 0条评论 167点热度 0人点赞 专注着 阅读全文

redis字符串对象

28 3 月, 2021 0条评论 131点热度 0人点赞 专注着 阅读全文

RDB持久化 Redis数据状态: 保存在Redis数据库中的数据被称作数据状态。   RDB文件的创建与载入 有两个Redis命令可以用于生成RDB文件, 一个是SAVE, 另一个是BGSAVE   RDB文件创建 SAVE命令会阻塞Redis服务器进程, 知道RDB文件创建完毕为止, 在服务器进程阻塞期间, 服务器不能处理任何命令请求. BGSAVE派生出一个子进程, 然后由子进程创建RDB, 服务器进程继续处理命令请求.   RDB文件载入 RDB文件的载入工作时在服务器启动时自…

24 3 月, 2021 0条评论 172点热度 0人点赞 专注着 阅读全文

与RDB持久化通过保存数据库中的键值对来记录数据库状态不同, AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。 AOF持久化的实现 AOF持久化功能的实现可以分为命令追加(append),文件写入,文件同步(sync)三个步骤 命令追加 当AOF持久化功能处于打开状态时, 服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾:  struct redisServer {   // AOF缓冲区   sds aof_buf; } AOF文件的写…

21 3 月, 2021 1条评论 166点热度 0人点赞 专注着 阅读全文

什么是redis持久化 持久化就是把内存的数据写到磁盘中去, 防止服务宕机了内存数据丢失 redis 数据持久化方式 RDB rdb是Redis DataBase缩写 功能核心函数rdbSave和rdbLoad两个函数 rdbSave是将对象保存到RDB文件中 rdbLoad是将RDB文件中的数据加载到内存之中 AOF Aof 是Append-only file缩写 每当执行服务器任务或函数时, flushAppendOnlyFile函数会被调用, 这个函数执行以下两个工作 WRITE: 根据条件, 将aof_bu…

21 3 月, 2021 0条评论 177点热度 0人点赞 专注着 阅读全文