发布与订阅

1. 服务器状态在pubsub_channels字典保存了所有频道的订阅关系:SUBSCRIBE命令负责将客户端和被订阅的频道关联到这个字典里面,而UNSUBSCRIBE命令则负责

解除客户端和被退订频道之间的关联。

2. 服务器状态在pubsub_patterns链表保存了所有模式的订阅关系:PSUBSCRIBLE命令负责将客户端和被订阅的模式记录到这个链表中,而PUNSBUSCRIBLE命令则负

责移除客户端和被退订模式在链表中的记录。

3. PUBLISH命令通过访问pubsub_channels字典来向频道的所有订阅者发送消息,通过访问pubsub_patterns链表来向所有匹配频道的模式的订阅者发消息。

4. PUBSUB命令的三个子命令都是通过读取pubsub_channels字典和pubsub_patterns链表中的信息来实现的。

5. 链表统一来管理订阅者。

事务

1. 事务提供了一种将多个命令打包,然后一次性、有序执行的机制

2. 多个命令被入队到事务队列中,然后按先进先出的顺序执行

3. 事务在执行过程中不会被中断,当事务队列中的所有命令都被执行完毕之后,事务才会结束。

4. 带有WATCH命令的事务会将客户端和被监控的键在数据库的watch_keys字典中进行关联,当键被修改时,程序会将所有监视被修改键的客户端的REDIS_DIRTY_CAS标志打开。

5. 只有在客户端的REDIS_IDRTY_CAS标志未被打开时,服务器才会执行客户端提交的事务,否则的话,服务器将拒绝执行客户端提交的事务。

6. Redis事务总是具有ACID中的原子性、一致性和隔离性,当服务器运行在AOF持久化模式下,并且appendfsync选项值为always时,事务也具有耐久性。

7. Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制,并且在事务执行期间,服务器

不会中断事务而去执行其他客户端请求,它会将事务中的所有命令都执行完。然后才会去处理其他客户端的命令请求。

8. 一个事务从开始到结束通常会经历一下三个阶段:

1). 事务开始:MULTI

2). 命令入队:

3). 事务执行:EXEC

9. 客户端切换到事务状态后,服务器会根据这个客户端发来的不同命令执行不同的操作:

1). 如果发的命令为:EXEC、DISCARD 、WATCH 、MULTI 四个命令中的一个,那么服务器立即执行这个命令

2). 如果不是上面几条命令,那么服务器并不会立即执行这个命令,而是将这个命令放入一个事务队列中,然后向客户端返回QUEUED回复。

10. WATCH命令是一个乐观锁,他可以在EXEC命令执行之前,监视任意数量的数据库键,并在EXEC命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是的话,服务器将拒绝执行事务。

      并向客户端返回代表事务执行失败的空回复。

11. 监视机制的触发:为被监视的键设置一个属性值,当被监视的键被修改时,改变属性,标记该键已被修改。事务执行前,检查该属性值。(思想)

12. Redis 不支持事务回滚机制,即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。

13. ACID : 

原子性(Atomicity):数据库将事务中的多个操作当做一个整体来执行,服务器要么执行事务中所有的操作,要么就一个操作都不执行。Redis事务是原子性的,但不保证所有执行命令都成功。

一致性(Consistency) : 如果数据库在执行事务之前是一致的,那么在事务执行之后,无论事务是否执行成功,数据库也应该仍然是一致的。

隔离性(Isolation): 即使数据库有多个事务并发执行,各个事务之间也不会互相影响,并且在并发状态下执行的事务和串行执行的事务产生的结果完全相同。Redis使用单线程的方式来执行事务。

持久性(Durability):当一个事务执行完毕时,执行这个事务所得的结果已经被保存到永久性介质(比如磁盘)里面了,即使服务器在事务执行完毕之后停机,执行事务所得的结果也不会丢失。

慢查询日志

1. Redis的慢查询日志功能用于记录执行时间超过指定时长的命令。用户可以通过这个功能产生的日志来监控和优化查询速度。

2. Redis服务器将所有的慢查询日志保存在服务器状态的slowlog链表中,每个链表节点都包含了一个slowlogEntry结构,每个slowlogEntry结构代表一个慢查询日志。

3. 打印和删除慢查询日志可以通过遍历slowlog链表来完成。

4. slowlog链表的长度就是服务器所保存慢查询日志的数量。

5. 新的慢查询日志会被添加到slowlog链表的表头,如果日志的数量超过slowlog-max-len选项的值,那么多出来的日志会被删除。

6. 服务器配置有两个和慢查询日志相关的选项:

1). slowlog-log-slower-than选项指定执行时间超过多少微秒的命令请求会被记录到日志上。

2). slowlog-max-len选项指定服务器最多保存多少条慢查询日志。服务器使用先进先出的方式保存多条慢查询日志,当服务器存储的慢查询日志数量等于slowlog-max-len选项的值时,服务器在添加

一条新日志前,会现将旧的一条慢查询日志删除。

7. 使用SLOWLOG GET 命令查看服务器所保存的慢查询日志

8. 添加新日志:在每次执行命令之前和之后,程序都会记录微秒格式的UNIX时间戳,这两个时间戳之间的差就是服务器执行命令所耗费的时长,服务器根据这个时长决定是否保存这条查询日志。

监视器:

1. 客户端通过执行MONITOR命令,将客户端转换成监视器,接收并打印服务器处理每个命令请求的相关信息。

2. 当一个客户端从普通客户端变成监视器时,该客户端的REDIS_MONITOR标识会被打开。

3. 服务器将所有监视器都记录在monitors链表中。

4. 每次处理命令请求时,服务器都会遍历monitors链表,将相关信息发送给监视器。

redis 笔记06 发布与订阅、事务、慢查询日志、监视器的更多相关文章

  1. StackExchange.Redis学习笔记(五) 发布和订阅

    Redis命令中的Pub/Sub Redis在 2.0之后的版本中 实现了 事件推送的  发布订阅命令 以下是Redis关于发布和订阅提供的相关命令 SUBSCRIBE channel [channe ...

  2. Redis中的发布与订阅

    redis中实现发布与订阅相对于zookeeper非常简单.直接使用publish和subscribe就行. subscrible news; 订阅news这个channel publish news ...

  3. Redis的消息发布和订阅

    Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...

  4. Redis消息之发布与订阅

    "发布/订阅"可以实现进程间的消息传递 发布的消息不会持久化,只能收到订阅后的消息,执行subscribe命令后客户端会进入"订阅"状态,处于此状态下的客户端不 ...

  5. .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用

    环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...

  6. Redis学习笔记九:独立功能之慢查询日志

    Redis 的慢查询日志用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度. 服务器配置有两个相关选项: slowlog-log-slower-than 选项指 ...

  7. Redis | 第10章 二进制数组、慢查询日志和监视器《Redis设计与实现》

    目录 前言 1. 二进制位数组 1.1 位数组的表示 1.2 GETBIT 命令的实现 1.3 SETBIT 命令的实现 1.4 BITECOUNT 命令的实现 1.5 BITOP 命令的实现 2. ...

  8. redis 实现消息发布和订阅

    1,打开二个客户端机器 一个用于发布,一个用于接受 2,发布一个channel1 3,用另外一个客户端收听上面的客户端 4,当再次在发布的redis客户端 发布一个消息  其他所有订阅的客户端会自动收 ...

  9. Redis 之消息发布与订阅(publish、subscribe)

    使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 一般做群聊,聊天室,发布公告信息等.

随机推荐

  1. I.MX6 WIFI wireless_tools 移植

    /******************************************************************************** * I.MX6 WIFI wirel ...

  2. iOS 并发编程之 Operation Queues

    现如今移动设备也早已经进入了多核心 CPU 时代,并且随着时间的推移,CPU 的核心数只会增加不会减少.而作为软件开发者,我们需要做的就是尽可能地提高应用的并发性,来充分利用这些多核心 CPU 的性能 ...

  3. oracle ORA-00001:违反唯一约束条件

    --获取约束信息 select * from information_schema.constraint_column_usage---可以获取指定数据库中的所有约束的信息以及约束与列的对应关系 go ...

  4. mvc理念和thinkphp的语法特征 thinkphp引入模板

    mvc即模型(model)-视图(view)-控制器(controller)的缩写 控制器很重要,功能性的东西要靠它实现,模型我还没接触到,只知道它对数据库负责,类似一个大控件吧... 速度... 一 ...

  5. 九个uname命令获取Linux系统详情的实例

    当你在控制台模式下,无法通过“鼠标右键 > 关于”获取操作系统的信息.这时,在Linux下,你可以使用uname命令,帮助你完成这些工作. Uname是unix name的缩写.在控制台中实际使 ...

  6. C# MySqlHelper

    1.MySql官方提供ADO.NET访问模式的MySql.Data.dll,下载地址:http://dev.mysql.com/downloads/connector/net/ 2.MySqlHelp ...

  7. python_字典

    1. 字典的定义 字典由多个键及其对应的值构成(我们也把键/值对称为项).键是唯一的,值不唯一.键可以是数字.字符串甚至是元组. 2. 字典的创建 (1) phonebook = {"} 名 ...

  8. PHP编码规范(转)

    一.文件格式 1. 对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 "?>" .这是为了防止多余的空格或者其它字符影响到代码.例如:<?php$foo = ' ...

  9. iOS符号表

    https://docs.bugtags.com/zh/symbols/ios/find.html 发红包的限制 1.发送频率规则 ◆ 每分钟发送红包数量不得超过1800个: ◆ 同一个商户号,每分钟 ...

  10. Python xml

    第一部分:读 ######## ## # -*- coding:utf-8 -*- """ * User: not me * Date: 11-11-9 * Time: ...