Redis设计与实现——独立功能的实现
发布和订阅
频道的订阅和退订
struct redisServer{
//键是被订阅者频道 ,键是一个链表,记录所有订阅这个频道的客户端
dict *publish_channels
}
订阅实现: 退订实现:
模式的订阅和退订
模式指定的topic通配化。
发送消息
事务
事务首先以一个MULTI命令为开始,接着将多个命令放在事务中,最后由EXEC命令将这个事务提交(commit)给服务器执行。
事务从开始到结束会经历3个阶段:事务开始,命令入队,事务执行。
watch命令的实现
watch命令是一个乐观锁,它可以在EXEC命令执行前,监视任意数量的数据库键,在EXEC执行时,检查被监视的键是否被另一个client修改过,如果是的话,则拒绝事务,并向client返回事务失败的空回复。
一个完整的WATCH事务执行过程
1) c10086 > WATCH "name"
2)之后c10086 > MULTI
SET “name” "Peter"
3)之后c999 > SET “name” “john”
4)c999执行的这个SET命令,使得正在监视“name”键的所有客户端柏阔c10086的REDIS_DIRTY_CAS标识被打开,之后c10086执行EXEC命令因此失败,服务器拒绝执行事务。只有REDIS_DIRTY_CAS标识未被打开,服务器才会执行客户端提交的事务。
事务ACID
慢查询日志
监视器
通过执行MONITOR命令,client可以将自己变成监视器,实时地接收并打印出服务器当前处理的命令请求相关信息。
成为监视器
向监视器发送命令信息
服务器在每次处理命令请求之前,都会调用replicationFeedMonitors函数,由这个函数将被处理的命令请求的相关信息发送给各个监视器。
总结:
Redis设计与实现——独立功能的实现的更多相关文章
- Redis设计与实现-附加功能
发布与订阅 redis订阅分为精准的频道订阅与模糊匹配的模式订阅: redis将所有频道的订阅关系都保存在服务器状态pubsub_channels字典里,键是频道名,值是一个记录所有订阅此频道的客户端 ...
- Redis笔记(4)独立功能的实现
1.前言 本节记录一下redis的一些功能上的实现,包括发布订阅.事务.Lua脚本.排序.二进制位数组.慢查询日志和监视器. 2.发布订阅 上一章介绍sentinel的时候说到了sentinel会订阅 ...
- Redis(四):独立功能的实现
发布与订阅 Redis 的发布与订阅功能有PUBLISH命令,SUBSCRIBE命令,PSUBSCRIBE命令,PUBSUB命令等组成. 客户端可以通过SUBSCRIBE命令订阅一个或多个频道,当其它 ...
- 《Redis设计与实现》读书笔记
<Redis设计与实现>读书笔记 很喜欢这本书的创作过程,以开源的方式,托管到Git上进行创作: 作者通读了Redis源码,并分享了详细的带注释的源码,让学习Redis的朋友轻松不少: 阅 ...
- 《Redis设计与实现》
<Redis设计与实现> 基本信息 作者: 黄健宏 丛书名: 数据库技术丛书 出版社:机械工业出版社 ISBN:9787111464747 上架时间:2014-6-3 出版日期:2014 ...
- 《Redis 设计与实现》读书笔记(四)
独立功能的实现 十八.发布和订阅 发布和订阅由下面几条命令组成 PUBLISH,发布消息,例如PUBLISH SUBSCRIBE,订阅某个频道 SUBSCRIBE UNSUBSCRIBE 退订某个频道 ...
- 探索Redis设计与实现13:Redis集群机制及一个Redis架构演进实例
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现12:浅析Redis主从复制
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- 探索Redis设计与实现4:Redis内部数据结构详解——ziplist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
随机推荐
- windows docker xshell 默认登录密码
boot2docker用户和密码 用户 密码 进入方式 docker tcuser ssh root command:sudo -i (docker用户下执行)
- vue学习(四) v-on:事件绑定
//html <div id="app"> <input type="button" value="ok" v-bind: ...
- Eclipse创建Web项目后新建Servlet时报红叉错误 or 导入别人Web项目时报红叉错误 的解决办法
如图,出现类似红叉错误. 1.在项目名称上点击右键->Build Path->Configure Build Path 2.在弹出来的框中点击Add Library,如图 3.接下来选择U ...
- 一个文本框的andriod教程
https://blog.csdn.net/androidmsky/article/details/49870823
- ES搜索引擎-一篇文章就够了
toc: true title: 一周一个中间件-ES搜索引擎 date: 2019-09-19 18:43:36 tags: - 中间件 - 搜索引擎 前言 在众多搜索引擎中,solr,es是我所知 ...
- Apache常用配置详解
Apache配置文件:conf/httpd.conf.(注意:表示路径时使用‘/’而不使用‘\’,注释使用‘#’) 1. ServerRoot:服务器根目录,也就是Apache的安装目录,其他的目录配 ...
- CentOS6.5安装Oracle11g
安装前必读: 1. 安装Oracle的虚拟机需要固定IP. 2. 注意安装过程中root用户与oracle用户的切换(su root/su oracle) 3. 环境变量 ...
- Python os.minor() 方法
概述 os.minor() 方法用于从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field ).高佣联盟 www.cgewang.com 语法 minor ...
- PHP fgetc() 函数
定义和用法 fgetc() 函数从打开的文件中返回一个单一的字符. 语法 fgetc(file) 参数 描述 file 必需.规定要检查的文件. 提示和注释 注释:该函数处理大文件非常缓慢,所以它不用 ...
- luogu P4166 [SCOI2007]最大土地面积 凸包 旋转卡壳
LINK:最大土地面积 容易想到四边形的边在凸包上面 考虑暴力枚举凸包上的四个点计算面积. 不过可以想到可以直接枚举对角线的两个点找到再在两边各找一个点 这样复杂度为\(n^3\) 可以得到50分. ...