写在前面的话

上一节谈了 Redis 的安装以及五种基本数据类型的一些简单的操作,本章节主要看看 Redis 的另外一些特征,虽然可能不常用,但是还是需要了解的。对于我们运维人员来讲,这些东西更像拓展的知识,可能我们工作很多年都不会用到,但是当你慢慢的需要往运维开发方向发展以后,这些东西就会成为你解决问题的又一方案。另外一种思路。

发布订阅

Redis 发布消息一般有两种方式,消息队列和发布订阅。

对于消息队列,其角色包含:生产者 --> 消息队列 --> 消费者

生产者讲需要处理的任务放到队列中,消费者再不断的从队列中读取任务然后执行。其好处在于解耦合,易于横向扩展。

对于发布订阅,我们可以看成广播FM,我们只有在一个频道,就能收听到广播,调到这个频道的过程就是订阅。

和广播的原理类似,订阅者需要先将频道打开到指定频道,然后另外一个窗口开始发布消息:

SUBSCRIBE fm110

结果如图:

此时另外一个窗口开始往 fm110 的频道发布消息:

PUBLISH fm110 "hello"

结果如图:

此时查看订阅者窗口:

这就有点像QQ群聊天,只允许群主发言,其它可以多个人接收。

# 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
UNSUBSCRIBE [channel ...] # 订阅一个或多个符合给定模式的频道,以 * 作匹配符,如 it* 匹配以 it 开头的频道(it.news 、 it.blog等等)
PSUBSCRIBE pattern [pattern ...] # 退订指定的规则, 如果没有参数则会退订所有规则
PUNSUBSCRIBE [pattern [pattern ...]] # 查看订阅与发布系统状态
PUBSUB subcommand [argument [argument ...]]

当然,Redis 的消息队列发布订阅其实是很粗糙的,如果真需要这样的内容,可以选择 RabbitMQ,Kafka 等。

事务处理

在 MySQL 中知道开启一个事务后,如果不 commit 的话是不会将修改刷写到磁盘的,在 Redis 中也存在这样的操作。

在 MySQL 中使用 start transaction 或者 begin 开启一个事务,在 Redis 则使用 multi。

在 MySQL 中取消回滚可以使用 rollback,Redis 则使用 discard 取消,不叫回滚,运维 Redis 并未执行。

在 MySQL 中提交采用 commit,在 Redis 中则使用 exec。

在 Redis 中采用的是乐观锁,可以通过模拟网上买票来测试:

在窗口1执行:

127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set ticket 0
QUEUED

暂时不执行它,然后取窗口2执行:

127.0.0.1:6379> get ticket
""
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set ticket 0
QUEUED
127.0.0.1:6379> exec
1) OK

此时再去窗口1执行:

127.0.0.1:6379> exec
(nil)

发现票以及被别人买走了!其中 watch 的作用在于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

其它全局操作

常用的命令如下:

# 显示连接的客户端
CLIENT LIST # 杀掉客户端
CLIENT KILL id 10 # 获取所有系统配置
CONFIG GET * # 获取匹配的配置
CONFIG GET log* # 在线修改配置
CONFIG SET requirepass helloworld # 登录
AUTH helloworld # 将修改的配置写入 redis.conf
CONFIG REWRITE # 显示当前库中key数量
DBSIZE # 打印redis收到的命令
MONITOR # 删除当前库所有key
FLUSHDB # 删除所有库的key
FLUSHALL # 当前时间
TIME # 手动持久化
SAVE # 异步执行一个 AOF(AppendOnly File) 文件重写操作
BGREWRITEAOF # 在后台异步保存当前数据库的数据到磁盘
BGSAVE

结果如下:

127.0.0.1:6379> CLIENT LIST
id=5 addr=127.0.0.1:48567 fd=8 name= age=15091 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
id=8 addr=127.0.0.1:48573 fd=9 name= age=660 idle=600 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=exec
id=10 addr=127.0.0.1:48577 fd=10 name= age=14 idle=14 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=keys
127.0.0.1:6379> CLIENT KILL id 10
(integer) 1
127.0.0.1:6379> CONFIG GET log*
1) "logfile"
2) "/data/services/redis/logs/redis-6379.log"
3) "loglevel"
4) "notice"
127.0.0.1:6379> CONFIG SET requirepass helloworld
OK
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH helloworld
OK
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "helloworld"
127.0.0.1:6379> CONFIG REWRITE
OK
127.0.0.1:6379> DBSIZE
(integer) 1
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> TIME
1) ""
2) ""
127.0.0.1:6379> MONITOR
OK
1573022218.974627 [0 127.0.0.1:48573] "AUTH" "helloworld"
1573022226.451991 [0 127.0.0.1:48573] "keys" "*"
1573022268.293698 [0 127.0.0.1:48573] "FLUSHDB"
1573022292.090727 [0 127.0.0.1:48573] "FLUSHALL"
1573022355.256531 [0 127.0.0.1:48573] "TIME"

到此,简单的命令我们就学的差不多的,真正会用的其实没几个,接下来的内容才是我们运维更加在意的东西!那就是调优和架构方面的设计。

Redis for OPS 02:消息订阅和事务管理的更多相关文章

  1. python redis 实现简单的消息订阅

    python + redis 实现简单的消息订阅 订阅端 import redis from functools import wraps class Subscribe: def __init__( ...

  2. Linux+Redis实战教程_day02_消息订阅与发布_多数据库_redis批量操作-事务_redis持久化

    5.扩展知识-消息订阅与发布(了解) 订阅新闻,新闻发布 subscribe channel:订阅频道,例:subscribe mychat,订阅mychat这个频道 psubscribe chann ...

  3. redis 笔记06 发布与订阅、事务、慢查询日志、监视器

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

  4. Redis(二)-- 发布订阅、事务、安全、持久化

    一.Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 打开两个窗口:session1 和 session2 在sess ...

  5. Redis | 第8章 发布订阅与事务《Redis设计与实现》

    目录 前言 1. 发布订阅 1.1 频道的订阅与退订 1.2 模式的订阅与退订 1.3 发送消息 1.4 查看订阅消息 2. 事务 2.1 事务的实现 2.2 WATCH 命令的实现 2.3 事务的 ...

  6. Redis数据库之KEY的操作与事务管理

    目的 了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,主要培养对KEY的操作命令运用的能力.重点掌握对KEY信息的管理.事务常规管理和事务回滚操作. KEYS命令的练习,对K ...

  7. 理解 Redis(9) - Publish Subscribe 消息订阅

    在窗口1开通一个名为 redis 的通道: 127.0.0.1:6379> SUBSCRIBE redis Reading messages... (press Ctrl-C to quit) ...

  8. 详谈:Redis事务和消息订阅

    一.Redis事务 1.概念 可以一次执行多个命令,本质是一组命令的集合.一个事务中的 所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 事务能做的事: 一个队列中,一次性.顺序 ...

  9. Redis的消息订阅及发布及事务机制

    Redis的消息订阅及发布及事务机制 订阅发布 SUBSCRIBE PUBLISH 订阅消息队列及发布消息. # 首先要打开redis-cli shell窗口 一个用于消息发布 一个用于消息订阅 # ...

随机推荐

  1. Map随笔:最常用的Map——HashMap

    目录 Map随笔:最常用的Map--HashMap 前言: 1,HashMap的结构 2,HashMap的一些属性(JDK8) 3,HashMap的构造函数(JDK8) 4,HashMap的一些方法( ...

  2. 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)

    点此看题面 大致题意: 有\(n\)个人相互开枪,每个人有一个仇恨度\(a_i\),每个人死后会开枪再打死另一个还活着的人,且第一枪由你打响.设当前剩余人仇恨度总和为\(k\),则每个人被打中的概率为 ...

  3. java之四种权限修饰符

    java权限修饰符piublic.protected.private.置于类的成员定义前,用来限定对象对该类成员的访问权限. 修饰符 类内部 同一个包 子类 任何地方 private yes     ...

  4. Codeforces Round #590 D. Distinct Characters Queries

    CF上给的标签是数据结构.但给的题解里的方法是很巧的暴力,用vector<set>维护每个字母出现的下标,每次修改加下标,擦下标.每次询问对每个字母分别lower_bound查找区间内是否 ...

  5. Bootstrap 基于Bootstrap和JQuery实现动态打开和关闭tab页

    基于Bootstrap和JQuery实现动态打开和关闭tab页   by:授客 QQ:1033553122 1.   测试环境 JQuery-3.2.1.min.j Bootstrap-3.3.7-d ...

  6. Cobalt Strike系列教程第三章:菜单栏与视图

    通过前两章的学习,我们掌握了Cobalt Strike教程的基础知识,及软件的安装使用. Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  7. 从0系统学Android--2.6 Activity 的最佳实践

    从0系统学Android--2.6 Activity 的最佳实践 本系列文章目录:更多精品文章分类 本系列持续更新中.... 实践中的技巧 2.6.1 知晓当前是在哪个 Activity 这个其实很简 ...

  8. xBIM 综合使用案例与 ASP.NET MVC 集成(一)

    XbimWebUI是一个Javascript库,可用于BIM模型的Web表示.它使用WebGL并且独立于任何第三方WebGL框架.查看器的数据格式为WexBIM.不能直接加载IFC文件. 一.将IFC ...

  9. more than 120 seconds|hung_task_timeout_secs 什么鬼?

    //2019/7/31 18:41:14掐指一算应该resore完了呀,是不是天热想罢工?不过已经差不多30个小时了无意间一查 tail -500f /var/log/messages 发现有些“mo ...

  10. Python numpy tensorflow 中的 点乘 和 矩阵乘法

    1)点乘(即“ * ”) ---- 各个矩阵对应元素做乘法  若 w 为 m*1 的矩阵,x 为 m*n 的矩阵,那么通过点乘结果就会得到一个 m*n 的矩阵. 若 w 为 m*n 的矩阵,x 为 m ...