Redis 管理实战(redis实战的例子和教程)
mhr18 2024-11-13 11:09 21 浏览 0 评论
Redis发布消息通常有两种模式:
- 队列模式(queuing)
- 发布-订阅模式(publish-subscribe)
1、任务队列
顾名思义,就是“传递消息的队列”。与任务队列进行交互的实体有两类,一类是生产者(producer),另一类则是消费者(consumer)。生产者将需要处理的任务放入任务队列中,而消费者则不断地从任务独立中读入任务信息并执行。
1、任务队列的好处
1、松耦合
生产者和消费者只需按照约定的任务描述格式,进行编写代码。
2、易于扩展
多消费者模式下,消费者可以分布在多个不同的服务器中,由此降低单台服务器的负载。
3、Redis 发布订阅
其实从Pub/Sub的机制来看,它更像是一个广播系统,多个Subscriber可以订阅多个Channel,多个Publisher可以往多个Channel中发布消息。可以这么简单的理解:
- Subscriber:收音机,可以收到多个频道,并以队列方式显示
- Publisher:电台,可以往不同的FM频道中发消息
- Channel:不同频率的FM频道
1、发布订阅模型
1、一个Publisher,多个Subscriber模型
如下图所示,可以作为消息队列或者消息管道。
主要应用:通知、公告。
2、多个Publisher,一个Subscriber模型
可以将PubSub做成独立的HTTP接口,各应用程序作为Publisher向Channel中发送消息,Subscriber端收到消息后执行相应的业务逻辑,比如写数据库,显示等等。
主要应用:排行榜、投票、计数。
3、多个Publisher,多个Subscriber模型
故名思议,就是可以向不同的Channel中发送消息,由不同的Subscriber接收。
主要应用:群聊、聊天。
2、实践发布订阅
发布订阅实践命令
命令 | 描述 |
PUBLISH channel msg | 将信息 message 发送到指定的频道 channel |
SUBSCRIBE channel [channel ...] | 订阅频道,可以同时订阅多个频道 |
UNSUBSCRIBE [channel ...] | 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道 |
PSUBSCRIBE pattern [pattern ...] | 订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类 |
PUNSUBSCRIBE [pattern [pattern ...]] | 退订指定的规则, 如果没有参数则会退订所有规则 |
PUBSUB subcommand [argument [argument ...]] | 查看订阅与发布系统状态 |
注意:使用发布订阅模式实现的消息队列,当有客户端订阅 channel 后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须 Provider 和 Consumer 同时在线。
3、消息队列系统对比
客户端在执行订阅命令之后进入了订阅状态,只能接收 SUBSCRIBE 、PSUBSCRIBE、 UNSUBSCRIBE 、PUNSUBSCRIBE 四个命令。
开启的订阅客户端,无法收到该频道之前的消息,因为 Redis 不会对发布的消息进行持久化。
和很多专业的消息队列系统(例如Kafka、RocketMQ)相比,Redis的发布订阅略显粗糙,例如无法实现消息堆积和回溯。但胜在足够简单,如果当前场景可以容忍的这些缺点,也不失为一个不错的选择。
4、Redis 事务管理
- redis中的事务跟关系型数据库中的事务是一个相似的概念,但是有不同之处。
- 关系型数据库事务执行失败后面的sql语句不在执行,而redis中的一条命令执行失败,其余的命令照常执行。
- redis中开启一个事务是使用multi,相当于begin\start transaction,exec提交事务,discard取消队列命令(非回滚操作)。
1、Redis 于 MySQL 对比
MySQL | Redis | |
开启 | start transaction/begin | multi |
语句 | 普通SQL | 普通命令 |
失败 | rollback 回滚 | discard 取消(不叫回滚,是队列里面的命令不执行,队列里面的任务根本就没有执行。而不是执行了也可以撤回来) |
成功 | commit | exec |
2、 Redis 事务命令
命令 | 描述 |
DISCARD | 取消事务,放弃执行事务块内的所有命令。 |
EXEC | 执行所有事务块内的命令。 |
MULTI | 标记一个事务块的开始。 |
UNWATCH | 取消 WATCH 命令对所有 key 的监视。 |
WATCH key [key ...] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
1、事务执行举例
ZADD salary 2000 user1
ZADD salary 3000 user2
ZRANGE salary 0 -1 WITHSCORES
MULTI
ZINCRBY salary 1000 user1
ZINCRBY salary -1000 user2
EXEC
3、Redis 中事务中的锁机制
举例:我正在买票 Ticket -1 , money -100
而票只有1张, 如果在我 multi 之后,和 exec 之前, 票被别人买了,即 ticket 变成0了。
我该如何观察这种情景,并不再提交:
- 悲观的想法:
- 世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]
- 乐观的想法:
- 没有那么人和我抢,因此,我只需要注意,有没有人更改 ticket 的值就可以了 [乐观锁]
Redis的事务中,启用的是乐观锁,只负责监测 key 没有被改动.
4、Redis服务管理命令
命令 | 描述 |
BGREWRITEAOF | 异步执行一个 AOF(AppendOnly File) 文件重写操作 |
BGSAVE | 在后台异步保存当前数据库的数据到磁盘 |
CLIENT KILL ip:port | 关闭客户端连接 |
CLIENT LIST | 获取连接到服务器的客户端连接列表 |
CLIENT GETNAME | 获取连接的名称 |
CLIENT PAUSE timeout | 在指定时间内终止运行来自客户端的命令 |
CLIENT SETNAME connection-name | 设置当前连接的名称 |
CLUSTER SLOTS | 获取集群节点的映射数组 |
COMMAND | 获取 Redis 命令详情数组 |
COMMAND COUNT | 获取 Redis 命令总数 |
COMMAND GETKEYS | 获取给定命令的所有键 |
TIME | 返回当前服务器时间 |
COMMAND INFO command-name [command-name ...] | 获取指定 Redis 命令描述的数组 |
CONFIG GET parameter | 获取指定配置参数的值 |
CONFIG REWRITE | 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写 |
CONFIG SET parameter value | 修改 redis 配置参数,无需重启 |
CONFIG RESETSTAT | 重置 INFO 命令中的某些统计数据 |
DBSIZE | 返回当前数据库的 key 的数量 |
DEBUG OBJECT key | 获取 key 的调试信息 |
DEBUG SEGFAULT | 让 Redis 服务崩溃 |
FLUSHALL | 删除所有数据库的所有key |
FLUSHDB | 删除当前数据库的所有key |
INFO [section] | 获取 Redis 服务器的各种信息和统计数值 |
LASTSAVE | 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示 |
MONITOR | 实时打印出 Redis 服务器接收到的命令,调试用 |
ROLE | 返回主从实例所属的角色 |
SAVE | 异步保存数据到硬盘 |
SHUTDOWN NOSAVE | 异步保存数据到硬盘,并关闭服务器 |
SLAVEOF host port | 将当前服务器转变为指定服务器的从属服务器(slave server) |
SLOWLOG subcommand [argument] | 管理 redis 的慢日志 |
SYNC | 用于复制功能(replication)的内部命令 |
5、Redis 慢日志查询
- Slow log 是 Redis 用来记录查询执行时间的日志系统。
- slow log 保存在内存里面,读写速度非常快
可以通过改写 redis.conf 文件或者用 CONFIG GET 和 CONFIG SET 命令对它们动态地进行修改
slowlog-log-slower-than 10000 # 超过多少微秒
CONFIG SET slowlog-log-slower-than 100
CONFIG SET slowlog-max-len 1000 # 保存多少条慢日志
CONFIG GET slow*
SLOWLOG GET
SLOWLOG RESET
相关推荐
- Team IDE 集成管理工具
-
Team·IDE工具简介TeamIDE工具集成SSH、FTP、MySql、Redis、Zookeeper、Kafka、Elasticsearch等管理工具Team·IDE功能模块目录结...
- MySQL大数据表处理策略,原来一直都用错了……
-
场景当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题。数据的插入,查询时长较长后续业务需求的扩展,在表中新增字段,影响较大表中的数据并不是所有的都为有效数...
- Java程序员你真的甘心只做增删改查吗
-
各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题最近...
- Java后端开发除了增删改查还有什么?
-
后端的追求:接口稳定、架构合理、业务逻辑清晰、模块拆分合理、支持高并发等。软件本身归根到底都是由算法+数据结构构成的,进一步细化之后,其实就是通过一系列的增删改查操作,构成算法,对数据结构进行操作,赋...
- 基于shiro实现session持久化和分布式共享
-
前言本文写下session持久化和分布式共享基于shiro框架对session的管理机制来实现必要性一直处于登陆状态:你登陆微信不可能三天两头就让你重新登陆吧?而是一直处于登陆状态除非主动退出...
- 为啥工作那么多年,你还是只会增删改查?
-
你以为没有这样的感觉,工作中领导和同事都非常认可你的能力,但是你想更进一步,却不被认可。想出去看看,跳槽面试,却也是屡屡碰壁。面试的过程中,面试官问技术方案,明明心里很清楚,或者说印象还行,可就是说不...
- Java程序员除了做增删改查还能干嘛?
-
就以Java后端开发为例,说说不同级别程序员干的事情。1初级开发,大概是有3年Java开发经验。22年底,上海,这批程序员如果学历是本科,薪资一般是8k到2w,当然如果能进好公司或互联网大厂,薪资能...
- Java面试题及答案总结(2025版持续更新)
-
大家好,我是Java面试分享面对Java后端岗位的激烈竞争,掌握系统化的知识体系至关重要。本文整理了覆盖主流技术栈的高频面试题,助你高效备战,内容包含:Java基础、并发编程、Spring生态、数据库...
- 微服务架构之API网关——在微服务项目中的技术框架和用法实践
-
API网关技术实战在介绍了API网关的相关理论之后,大家可以了解到API网关的作用和优缺点,接下来将为大家介绍API网关在微服务项目中的技术框架和用法实践。Zuul网关其实API网关并不是很难的技术,...
- 带小白黑客入门,你也可以跟我们一起成为黑客大牛
-
小编这几天一直在做关于ssrf的实验,这篇文章可以带纯小白黑客入门。靶机ip地址:192.168.2.138查看靶机运行的redis服务。攻击机为ip192.168.2.112.用客户端redis-c...
- Python最常见的170道面试题全解析答案(二)
-
60.请写一个Python逻辑,计算一个文件中的大写字母数量答:withopen(‘A.txt’)asfs:count=0foriinfs.read():ifi.isupper...
- Spring Boot项目集成Redis,原来这么简单!
-
在现代软件开发的“快车道”上,SpringBoot无疑是许多开发者手中的“神兵利器”。它以其“约定大于配置”的理念,大大简化了Java应用的开发和部署过程,让开发者能够将更多精力聚焦于业务逻辑本身。...
- Apache Commons Pool——优化你的java内存
-
大家好,我是吉森。我会持续分享一些开发技巧、经验和技术,如果你也热爱各种开发技术,欢迎关注我。今天我们继续介绍ApacheCommons工具包,今天的主角是:CommonsPool。简单地说,它是...
- 码农成长系列-基于WebSocket的后台消息提醒
-
场景描述当用户对app有某些业务操作时,需要将该操作友好地提醒给,有接收提醒权限的后台管理者。技术场景分析经分析,要实现上述业务,业务拆解后可能需要解决如下业务①.触发提醒待推送数据的监听②.提醒时接...
- 百度直播消息系统的实践和演进
-
导读:直播业务的核心功能有两个,一个是实时音视频推拉流,另一个是直播间消息流的收发。本文主要介绍百度直播服务内的消息服务系统的设计实践和演化。一、背景直播间内用户聊天互动,形式上是常见的IM消息流;...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)