首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

redis 设计实现》--总结

Redis设计实现,以及关于Redis使用的总结 1.数据结构对象 1.简单动态字符串 Redis自己构建了简单动态字符串(Simple Dynamic String,SDS)来作为默认的字符串表示...Redis中跳跃表的实现: ?...升级后不支持降级 6.压缩列表 Redis中列表键和哈希键的底层实现之一。 7.对象 Redis使用上述的数据结构创建了一个对象系统。...底层模型:它们之间底层实现方式以及客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。...redis的瓶颈 Redis 主从复制 Redis 复制功能 Redis的定时机制怎么实现的,有哪些弊端,你将如何改进这个弊端 Redis是单线程的,为什么这么高效。

75621

redis 设计实现》--总结

Redis设计实现,以及关于Redis使用的总结 1.数据结构对象 1.简单动态字符串 Redis自己构建了简单动态字符串(Simple Dynamic String,SDS)来作为默认的字符串表示...Redis中跳跃表的实现: ?...升级后不支持降级 6.压缩列表 Redis中列表键和哈希键的底层实现之一。 7.对象 Redis使用上述的数据结构创建了一个对象系统。...底层模型:它们之间底层实现方式以及客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。...redis的瓶颈 Redis 主从复制 Redis 复制功能 Redis的定时机制怎么实现的,有哪些弊端,你将如何改进这个弊端 Redis是单线程的,为什么这么高效。

1.1K40
您找到你想要的搜索结果了吗?
是的
没有找到

Redis List 设计实现

前言 之前我们已经讨论过 Sorted Set 在 Redis实现,学习到了 Redis 在不同数据量的时候使用了不同的结构来优化存储和性能,并且使用两种不同的数据结构的组合来进一步优化。...group=list 老版本 在 Redis 的老版本中 list 的实现和 Sorted Set 策略类似,对于不同数据量的情况下实现是不一样的。...而新版本中 Redis 使用了 quicklist 来实现,所以我们主要讨论的是 quicklist 是如何实现的。...相对应的,从后向前查找时 ziplist 是一致的通过 element-tot-len 能找到前一个元素的位置,不会影响。...总结 在看 Redis List 实现之前,我经常会觉得,不就是个 list 的嘛,弄个数组一下不就搞定了?但对于追求极致性能和巨大内存压力的缓存来说,能优化一点就要尽力去优化一点。

11110

Redis设计实现》读书笔记(三十二) ——Redis事务设计实现

Redis设计实现》读书笔记(三十二) ——Redis事务设计实现 (原创内容,转载请注明来源,谢谢) 一、概述 redis的事务同数据库的事务概念一样,即多条命令都成功执行,才会生效...redis客户端中输入multi命令,然后中间的所有命令都不会立即生效,直到再输入exec命令。 二、redis事务实现 redis事务实现包括事务开始、事务入队、事务执行。...很多关系型数据库不同,redis不支持事务的回滚,因为redis的作者认为事务出错只有在开发环境中会有,生产环境没有。而回滚会导致redis代码复杂,设计初衷不符。...3、隔离性 隔离性是指多个事务并发进行,各个事务不会互相影响,并且并发状态下执行事务串行状态下执行事务结果完全相同。...4、watch命令通过数据库的redisDB结构体的watched_keys字典中,将字段要监视的客户端进行关联,当键被修改,则相应的监视该键的全部客户端的REDIS_DIRTY_CAS标识被打开。

95950

Redis设计实现》读书笔记(十) ——Redis对象相关其他设计实现

Redis设计实现》读书笔记(十) ——Redis对象相关其他设计实现 (原创内容,转载请注明来源,谢谢) 一、类型检查命令多态 redis对键操作的命令分为两种,一种是可以对任意键进行操作的命令...2、命令多态 redis每种数据类型,至少都有两种编码方式,命令多态就是指通过一个命令,可以执行不同的编码方式所提供的api。因此,redis的几乎每种操作命令都是多态的。...二、内存回收 由于实现redis的C语言,不具备垃圾回收功能,因此redis构建了一套内存回收机制,是基于引用计数技术实现的内存回收。...共享对象的默认数量,可以通过修改文件redis.h中的常量REDIS_SHARED_INTEGERS进行修改。...五、redis对象总结 1、redis数据库的每个键和值都是一个redisObject对象。

81660

redis设计实现》读后总结

参考 《redis设计实现》 1. redis 协议 1.1 redis请求回复协议格式 参考 redis请求回复协议格式 请求同一为: * CR LF...协议并执行 剖析Redis协议 按照redis协议格式编写.ptl文件 ,然后用管道命令交给Redis一并执行。...2. redis载入保存 2.1 保存 2.1.1 rdb模式 SAVE 阻塞服务器进程 BGSAVE fork子进程保存,完成后通知主进程。...服务端 5.1 命令请求的步骤 一个命令请求从发送到完成主要包括以下步骤: 客户端将命令请求发送给服务器; 服务器读取命令请求,并分析出命令参数; 命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复...考虑如何用hset实现对象存储

53560

Redis事物的设计实现

Redis 通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 四个命令来实现事务功能, 本章首先讨论使用 MULTI 、 DISCARD 和 EXEC 三个命令实现的一般事务, 然后再来讨论带有...WATCH 的事务的实现。...以下示例展示了一个执行失败的事务例子: redis> WATCH name OK redis> MULTI OK redis> SET name peter QUEUED redis> EXEC...下文就来介绍 WATCH 的实现机制,并且看看事务系统是如何检查某个被监视的键是否被修改,从而保证事务的安全性的。...WATCH 命令的实现 在每个代表数据库的 redis.h/redisDb 结构类型中, 都保存了一个 watched_keys 字典, 字典的键是这个数据库被监视的键, 而字典的值则是一个链表, 链表中保存了所有监视这个键的客户端

54920

Redis设计实现》简读

一、数据结构对象 简单动态字符串(SDS) 相比C字符串增加记录字符串长度的,获取字符串长度复杂度为O(1) 相比C字符串增加记录已分配内存空间,可以避免缓冲区溢出 空间预分配和空间惰性释放 二进制安全...(整数值) 使用整数值实现的字符串对象 REDIS_STRING REDIS_ENCODING_EMBSTR(小于32字节字符串) 使用embstr编码的简单动态字符串实现的字符串对象 REDIS_STRING...513,查看命令:CONFIG GET list-max-ziplist*) 使用压缩列表实现的列表对象 REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用双端链表实现的列表对象...:CONFIG GET set-max-intset-entries) 使用整数集合实现的集合对象 REDIS_SET REDIS_ENCODING_HT 使用字典实现的集合对象 REDIS_ZSET...发布订阅 发布订阅分为频道发布订阅和模式发布订阅两种 服务器状态在pubsubchannels字典保存所有频道订阅关系,在pubsubpatterns链表保存所有模式订阅关系 事务 事务是提供了一种将多个命令打包然后一次性按先进先出顺序执行的机制

1.3K50

Redis设计实现》笔记3

参考《Redis设计实现》 1.发布订阅 发布订阅指客户端可以订阅一个或多个频道,每当有其他客户端向频道发送消息时,频道的所有订阅者都会收到这条消息,如下: image.png 发布订阅分为两种...:频道的订阅退订、模式的订阅退订 image.png 1.1 频道的订阅退订 频道的订阅命令为subscribe,打开第一个终端,输完命令后会处于等待状态 127.0.0.1:6379> subscribe...unsubscribe 127.0.0.1:6379> unsubscribe news 1) "unsubscribe" 2) "news" 3) (integer) 0 127.0.0.1:6379> redis...numsub news 1) "news" 2) (integer) 3 127.0.0.1:6379> pubsub numpat (integer) 2 127.0.0.1:6379> 2.事务 实现事务...(transaction)的命令包括multi、exec、watch,事务开启后必须要所有命令都执行完毕才会去执行其他客户端的命令请求 a@aMacBook-Pro-92 ~ % redis-cli -

16930

Redis设计实现》简读

一、数据结构对象 简单动态字符串(SDS) 相比C字符串增加记录字符串长度的,获取字符串长度复杂度为O(1) 相比C字符串增加记录已分配内存空间,可以避免缓冲区溢出 空间预分配和空间惰性释放 二进制安全...(整数值) 使用整数值实现的字符串对象 REDIS_STRING REDIS_ENCODING_EMBSTR(小于32字节字符串) 使用embstr编码的简单动态字符串实现的字符串对象 REDIS_STRING...513,查看命令:CONFIG GET list-max-ziplist*) 使用压缩列表实现的列表对象 REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用双端链表实现的列表对象...:CONFIG GET set-max-intset-entries) 使用整数集合实现的集合对象 REDIS_SET REDIS_ENCODING_HT 使用字典实现的集合对象 REDIS_ZSET...发布订阅 发布订阅分为频道发布订阅和模式发布订阅两种 服务器状态在pubsubchannels字典保存所有频道订阅关系,在pubsubpatterns链表保存所有模式订阅关系 事务 事务是提供了一种将多个命令打包然后一次性按先进先出顺序执行的机制

1.3K80

Redis设计实现-总结

Redis设计实现(1)-SDS简单动态字符串 Redis设计实现(2)-链表 Redis设计实现(3)-字典 Redis设计实现(4)-跳跃表 Redis设计实现(5)-整数集合...Redis设计实现(6)-压缩列表 整体的感悟吧, 觉得 Redis 的作者, 对每一块内存非常吝啬, 为了节省内存而制造出各种各样的编码和技巧....源码的注释版, 真的很好, Redis的代码读起来也还是比较亲切....里面逐行调试才知道的. --- 这本书的后面几部分, 最开始是几个底层数据结构, 然后是对象, 第二部分是单机数据库, 包括 RDB 持久化 和 AOF 持久化, 事件, 客户端和服务端; 第三部分是多机数据库的实现..., Redis 集群等, 这一块我还没实践过; 第四部分是比较杂的功能, 包含了发布订阅, 事务, Lua 脚本, 慢日志以及一些命令的实现.

10700

Redis设计实现》读书笔记(三十二) ——Redis集发布订阅设计实现

Redis设计实现》读书笔记(三十二) ——Redis集发布订阅设计实现 (原创内容,转载请注明来源,谢谢) 一、概述 redis的发布订阅由publish、subscribe、...二、频道订阅退订 1、订阅 当客户端执行subscribe命令,客户端和频道之间就形成订阅的关系,redis将所有频道的订阅关系放在redisServer结构体的pubsub_channels字典中...四、发送消息 redis任一客户端执行publish ,表示其发送消息,其会将消息发送给频道订阅者模式订阅者。...2、发送给模式订阅者 由于pubsub_patterns是一个链表形式,记录所有的模式订阅者的信息,因此redis会遍历该链表,找到所有当前channel匹配的模式,并将消息发送给这些模式的客户端。...该命令是通过返回pubsub_patterns链表的长度来实现的。 六、总结 1、订阅分为频道订阅和模式订阅。

76880

Redis设计实现》读书笔记(三十四) ——Redis Lua脚本环境设计实现

Redis设计实现》读书笔记(三十四) ——Redis Lua脚本环境设计实现 (原创内容,转载请注明来源,谢谢) 一、创建lua环境 为了在redis服务器执行lua脚本,redis服务器内嵌了一个...redis服务器会保存所有eval命令执行过的脚本,以及所有script load命令加载过的lua脚本。 ? 该字典有两个作用,一个是实现scripts exists命令,一个是实现脚本复制功能。...三、eval命令的实现 eval执行过程分为3个步骤: 1)根据客户端给定的lua脚本,在lua环境中定义一个lua函数。...这样做的好处在于,执行脚本步骤非常简单,只要调用脚本相对应的函数,每个脚本有一个唯一的函数;另外,函数的局部性让环境保持清洁,避免全局变量;还有,脚本本定义过一次后,服务器后续再调用脚本,不需要知道脚本本身...五、脚本管理命令的实现 redis关于lua脚本管理的命令有四个:script flush、script exists、script load、script kill。

1K50

redis设计实现-对象系统

1.redis并没有直接使用前面的数据结构实现键值对数据库,而是基于数据结构创建了一个对象系统,字符串对象/列表对象/哈希对象/集合对象/有序集合对象都用到了至少一种前面的数据结构 2.针对不同的使用场景...,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率 3.redis的对象系统实现了基于引用计数的内存回收机制,通过引用计数实现了对象共享机制,多个键共享同一个对象节约内存 4.redis...等进行测试 15.集合对象的编码可以是intset或者hashtable,intset的集合对象使用整数集合作为底层,当元素数量不超过512个,所有元素都是整数的时候;hashtable编码的使用字典作为底层实现...ziplist编码的,第一个节点保存元素的成员,第二个节点保存元素的分值;skiplist底层使用zset结构同时包含一个字典和一个跳跃表,对有序集合的范围操作比如zrank,zrange是通过跳跃表实现...;取给定成员的分值,是通过字典实现的 保存元素小于128个,所有成员长度小于64字节的使用ziplist,其他使用skiplist

49030

Redis设计实现(2)-链表

链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层实现...除了链表键之外, 发布订阅, 慢查询, 监视器等功能也用到了链表, Redis 服务器还使用链表保存多个客户端的状态信息, 以及使用链表来构建客户端输出缓冲区(output buffer). 1....重点回顾 链表被广泛用于实现 Redis 的各种功能, 比如列表键, 发布订阅, 慢查询, 监视器, 等等; 每个链表节点由一个 listNode 结构来表示, 每个节点都有一个指向前置节点和后置节点的指针..., 所以 Redis 的链表实现是双端链表; 每个链表使用一个 list 结构来表示, 这个结构带有表头节点指针, 表尾节点指针, 以及链表长度等信息; 因为链表表头节点的前置节点和表尾节点的后置节点都指向...NULL , 所以 Redis 的链表实现是无环链表; 通过为链表设置不同的类型特定函数, Redis 的链表可以用于保存各种不同类型的值.

10410

Redis设计实现(3)-字典

Redis 的数据库使用字典实现, 对数据库的增, 删, 查, 改也是构建在对字典的操作之上的....字典是哈希键的底层实现之一: 当一个哈希键包含的键值对比较多, 又或者键值对中的元素都是比较长的字符串时, Redis 将会使用字典作为哈希键的底层实现. 1....哈希表 Redis 的字典使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保存了字典中的一个键值对....总结 字典被广泛用于实现 Redis 的各种功能, 其中包括数据库和哈希键; Redis 中的字典使用哈希表作为底层实现, 每个字典带有两个哈希表, 一个用于平时使用, 另一个仅在进行 rehash 时使用...当字典被用作数据库的底层实现, 或者哈希键的底层实现时, Redis 使用 MurmurHash2 算法来计算键的哈希值; 哈希表使用链地址法来解决键冲突, 被分配到同一个索引上的多个键值对会连接成一个单向链表

13710

Redis 设计实现读书笔记

之下的链表也都会出现 (5) 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素 (6) 通过一个随机函数,来决定将这个结点插入到哪几级索引中 五、整数集合 参考链接 集合键的底层实现...intset; 升级操作(不支持降级): 触发条件:当添加一个新的数据超出了当前编码类型的长度时 操作:扩容 + 将现有数据转化到其他的位置 + 添加新元素到末尾 优势:灵活、节省内存 六、压缩列表 用于实现...七、Redis 对象 Redis的每种对象其实都由对象结构(redisObject) 对应编码的数据结构组合而成 redisObject 是 Redis 类型系统的核心, 数据库中的每个键、值, 以及...,减少了客户端Redis实例的连接数 缺点 无法平滑地扩容/缩容,因为路由规则的原因当业务需要增加 Redis 实例时工作量非常大(一致性 hash 算法增加 slot 需要迁移数据) 每个请求都经过...Twemproxy代理才能到达Redis服务器 Redis Cluster(3.0 上) 原理:Redis Cluster是一种服务器 Sharding 技术(分片和路由都是在服务端实现),采用多主多从

21240
领券