文章总结尚硅谷阳哥视频重点:
一 .几个重要问题:
Q1: what?
Redis 是 基于内存KV键值对 的内存数据库
Q2: why & do?
- 分布式缓存 , 减轻mysql等关系型数据库的访问压力
- KV键值对的 时复O(1) --查询 高效
- Redis 数据操作 主要集中 在 内存中
- 在计数器[微信朋友圈点赞] 、排行榜等场景 redis 明显优于 mysql
- 内存存储RDB 和 持久化AOF
- 支持 异步将内存中的数据 写入硬盘上 (重新重启 or 断电)不影响继续服务
- 高可用架构搭配选择 单机、主从、哨兵、集群
- 可以预防 穿透、击穿、雪崩
- 分布式锁
Q3: 具体优势是什么?
- 性能极高
- Read 速度 110000 次/秒
- Write 速度 81000 次/秒
- 数据类型丰富
- K_V
- 字符串 String 、 列表 List 、 哈希表 Hash 、 集合 Set
- 有序集合 ZSet 、 地理空间 GEO 、 基数统计 HyperLogLog
- 位图 bitmap 、 位域 bitfield 、 流 Stream
- 持久化
- 支持数据的 持久化 , 将内存中的数据保存在磁盘中 , 重启加载可用
- 数据备份
- 实现主从 master-slave 同步备份
address
- Redis 官网
- http://www.redis.cn/ 中文网址
- redis中文文档 中文文档
- GitHub - redis/redis: Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, Bitmaps .Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes, Streams, HyperLogLogs, Bitmaps. - redis/redishttps://github.com/redis/redis/源码地址
- Try Redis 在线测试
- Redis 命令参考 — Redis 命令参考Try RedisRedis 命令参考 — Redis 命令参考 常用命令
redis 7 的新特性
1. Redis function 相对于 以前使用的 lua脚本 会更加高效、 易用 、管理
2. Client - aviction 更好的达到 redis客户端连接数 和 性能 间的平衡
3. Multi-part AOF 优化异步读写 简化运维工作
4. ACL v2 更精细化的访问控制
5. 新增命令
6. listpack 替代 ziplist
7. 底层性能优化
二 . 安装
1.查看是否安装gcc
gcc -v
如果没有安装,执行
yum -y install gcc- c++
2.查看是否安装过redis
redis- server -v
3. 下载安装包
wget https://download.redis.io/releases/redis-7.0.0.tar.gz
解压安装包
tar -zxvf redis-7.0.0.tar.gz
[root@hecs-234257 redis-7.2.4]# make && make install
查看是否安装成功
[root@hecs-234257 bin]# cd /usr/local/bin
[root@hecs-234257 bin]# ll
total 38428
-rwxr-xr-x 1 root root 390 Jul 17 2023 cloud-id
-rwxr-xr-x 1 root root 394 Jul 17 2023 cloud-init
-rwxr-xr-x 1 root root 2108 Jul 17 2023 cloud-init-per
-rwxr-xr-x 1 root root 404 Jul 17 2023 easy_install
-rwxr-xr-x 1 root root 412 Jul 17 2023 easy_install-3.6
-rwxr-xr-x 1 root root 1005 Jul 17 2023 jsondiff
-rwxr-xr-x 1 root root 3860 Jul 17 2023 jsonpatch
-rwxr-xr-x 1 root root 1839 Jul 17 2023 jsonpointer
-rwxr-xr-x 1 root root 397 Jul 17 2023 jsonschema
-rwxr-xr-x 1 root root 424 Jul 17 2023 normalizer
-rwxr-xr-x 1 root root 9454208 Feb 17 18:54 redis-benchmark
lrwxrwxrwx 1 root root 12 Feb 17 18:54 redis-check-aof -> redis-server
lrwxrwxrwx 1 root root 12 Feb 17 18:54 redis-check-rdb -> redis-server
-rwxr-xr-x 1 root root 10184328 Feb 17 18:54 redis-cli
lrwxrwxrwx 1 root root 12 Feb 17 18:54 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 19664464 Feb 17 18:54 redis-server
4.修改redis.conf,并启动redis
[root@hecs-234257 myredis]# redis-server /myredis/redis7.conf
[root@hecs-234257 myredis]# ps -ef|grep redis|grep -v grep
root 92732 1 0 20:30 ? 00:00:00 redis-server *:6379
5.启动redis客户端
[root@hecs-234257 myredis]# redis-cli -a 111111 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
//docker中启动的话
[root@node02 ~]# docker exec -it f201aa970556 /bin/bash
root@1b63ffe35542:/data# redis-cli -h 172.28.46.151 -a 123456 -p 6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.28.46.151:6379>
查询启动的进程
[root@hecs-234257 ~]# ps -ef|grep redis
root 92732 1 0 20:30 ? 00:00:00 redis-server *:6379
root 100828 10854 0 20:32 pts/2 00:00:00 redis-cli -a 111111 -p 6379
root 105825 5682 0 20:33 pts/0 00:00:00 grep --color=auto redis
查看redis服务器是否安装成功
127.0.0.1:6379> ping
PONG
6.简单k-v测试
127.0.0.1:6379> set k1 helloworld
OK
127.0.0.1:6379> get k1
"helloworld"
7.关闭redis连接
7.1单实例关闭
127.0.0.1:6379> shutdown
not connected> quit
[root@hecs-234257 myredis]# lsof -i:6379
[root@hecs-234257 myredis]#
第二种关闭方式
[root@hecs-234257 myredis]# redis-cli -a 111111 shutdown
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
7.2 多实例关闭
关闭指定端口
redis-cli -p 6379 shutdown
三、redis 10 大数据类型
Redis 是 基于内存KV键值对 的内存数据库
其中key的类型都是字符串, value为值的数据类型
1.Which 10
(1)String 字符串
- String是redis的最基本的数据类型, 一个key 对应一个value , 一个redis中字符转value最多可以是512M
- String类型是二进制安全的, 即redis的String可以包含任何数据 (jpg图片 or 序列化对象)
0.最常用
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
0.1 nx & xx
172.28.46.151:6378> get k1
(nil)
// nx 创建未创建过的值
172.28.46.151:6378> set k1 v1 nx
OK
172.28.46.151:6378> set k1 v1 nx
(nil)
172.28.46.151:6378> get k1
"v1"
// xx 创建已创建的值
172.28.46.151:6378> set k1 v1xx xx
OK
172.28.46.151:6378> set k1 v1xx xx
OK
172.28.46.151:6378> set k1 v1xx xx
OK
172.28.46.151:6378> get k1
"v1xx"
0.2. get
172.28.46.151:6379> get k1
"v1xx"
// 命令执行了 ,先返回之前的 value
172.28.46.151:6379> set k1 v1 get
"v1xx"
172.28.46.151:6379> get k1
"v1"
0.3. EX 秒 | PX 毫秒 | exat 时间戳
//设置秒为单位的 过期时间
172.28.46.151:6379> set k1 v1 ex 10
OK
172.28.46.151:6379> ttl k1
(integer) 2
172.28.46.151:6379> ttl k1
(integer) -2
//设置毫秒为单位的 过期时间
172.28.46.151:6379> set k1 v1 px 8000
OK
172.28.46.151:6379> ttl k1
(integer) 3
//设置时间戳为单位的 过期时间
172.28.46.151:6379> set k1 va exat 1709721883
OK
172.28.46.151:6379> ttl k1
(integer) 229
0.4. keepttl
// 不 keep 的情况
172.28.46.151:6379> set k1 v1 ex 30
OK
172.28.46.151:6379> ttl k1
(integer) 23
172.28.46.151:6379> set k1 v11
OK
172.28.46.151:6379> ttl k1
(integer) -1
172.28.46.151:6379> del k1
(integer) 1
// keepttl
172.28.46.151:6379> set k1 v1 ex 70
OK
172.28.46.151:6379> ttl k1
(integer) 66
172.28.46.151:6379> set k1 v1keepttl keepttl
OK
172.28.46.151:6379> ttl k1
(integer) 36
1. 同时 设置 / 获取 多个键值 [mset /mget /msetnx]
//多个set 合并的批处理 操作
> set k1 v1
OK
> set k2 v2
OK
> mset k1 v1 k2 v2 k3 v3
OK
> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
//对于未创建 键 进行创建 -- 一旦有个键存在 则不执行操作
> msetnx k1 v1 k4 v4
(integer) 0
> get k1
"v1"
> get k4
(nil)
2. 获取指定区间返回内的值【getrange / setrange】
> set k1 abcd1234
OK
> getrange k1 0 -1
"abcd1234"
> getrange k1 0 3
"abcd"
> getrange k1 2 5
"cd12"
> setrange k1 1 yangli~~~
10
> get k1
>
"ayangli~~~"
3. 数值增减[ incr / incrby / decr / decyby ]
> incr k1
(integer) 101
> incr k1
(integer) 102
> incrby k1 3
(integer) 105
> decr k1
(integer) 104
> decrby k1 50
(integer) 54
4. 获取字符串长度 和 内容追加 (STRLEN key / APPEND key value)
> set k1 abcd
OK
> STRLEN k1
(integer) 4
> APPEND k1 yangli
10
> get k1
"abcdyangli"
5.分布式锁(setnx key value / setex(set with expire)键秒值 / setnx(set id not exist))
> setex k1 30 v11
OK
> ttl k1
(integer) 25
> setnx k1 v11
(integer) 1
> get k1
"v11"
> setnx k1 v11
(integer) 0
6.getset(先get 再set)
> getset k1 haha
"v11"
> get k1
"haha"
7.应用场景
(1)抖音无限的点赞某个视频或视频 点一下加一次
(2)是否喜欢的文章
(2)List 列表
- 最简单的字符串列表 列表的顺序为插入顺序
- 可以添加一个元素到列表的头部或尾部
- 底层实际上是双端列表,最多可以包含 (2^32 -1)个元素 大约40亿个元素
0.常用
1.单key多value
2.简单说明
一个双端列表 的结构
对两端的操作 性能 会 很高 , 通过索引下标的方式 操作中间节点 的 性能会较差
主要功能有 push/pop , 一般用在栈、队列、消息队列 等 场景
left 、 right 都可以 插入 、添加
- if key不存在 , 创建 新的链表
- if key存在 , 新增内容
- 如果 值全部移除 , 对应的key 也就消失了
3.案例
3.1 lpush / rpush / lrange /
> lpush list1 1 2 3 4 5
(integer) 5
> rpush list2 11 22 33 44 55
(integer) 5
> type list1
"list"
> lrange list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
> lrange list2 0 -1
1) "11"
2) "22"
3) "33"
4) "44"
5) "55"
3.2 lpop / rpop
> lrange list1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
> lpop list1
"5"
> rpop list1
"1"
3.3 lindex
> lrange list1 0 -1
1) "4"
2) "3"
3) "2"
> lindex list1 0
"4"
> lindex list1 1
"3"
3.4 llen list
> llen list1
(integer) 3
> llen list2
(integer) 5
3.5 lrem
> lrange list1 0 -1
1) "-1"
2) "0"
3) "5"
4) "4"
5) "3"
6) "3"
7) "2"
8) "2"
9) "2"
10) "1"
11) "1"
12) "1"
13) "1"
> lrem list1 2 1
(integer) 2
> lrange list1 0 -1
1) "-1"
2) "0"
3) "5"
4) "4"
5) "3"
6) "3"
7) "2"
8) "2"
9) "2"
10) "1"
11) "1"
3.6 ltrim
截取指定返回的值再赋给 key
> lrange list 0 -1
1) "-1"
2) "0"
3) "5"
4) "4"
5) "3"
6) "3"
7) "2"
8) "2"
9) "2"
10) "1"
11) "1"
> ltrim list 2 6
OK
> lrange list 0 -1
1) "5"
2) "4"
3) "3"
4) "3"
5) "2"
3.7 rpoplpush 源列表、 目的列表
> lrange list2 0 -1
1) "CC"
2) "B"
3) "AA"
> lrange list3 0 -1
1) "f"
2) "ee"
3) "dd"
> rpoplpush list2 list3
"AA"
> lrange list2 0 -1
1) "CC"
2) "B"
> lrange list3 0 -1
1) "AA"
2) "f"
3) "ee"
4) "dd"
3.8 lset 相当于修改操作
> lrange list1 0 -1
1) "CC"
2) "BB"
3) "AA"
> lset list1 1 redis
OK
> lrange list1 0 -1
1) "CC"
2) "redis"
3) "AA"
3.9 linert key before/after 已有值 插入的新值
> lrange list1 0 -1
1) "CC"
2) "redis"
3) "AA"
> linsert list1 before redis mysql
4
> lrange list1 0 -1
1) "CC"
2) "mysql"
3) "redis"
4) "AA"
> linsert list1 after mysql relation
5
> lrange list1 0 -1
1) "CC"
2) "mysql"
3) "relation"
4) "redis"
5) "AA"
(3)Hash 哈希表
- hash是一个 string 类型的 field(字段) 和 value (值)的映射表,hash特别适合用于存储对象
- 每个hash可以存储 (2^32 - 1)键值对(40多亿个)
- 现在 k1 [field v1] vs 以前 k1 v1
1.KV模式不变, 但V是一个键值对
Map<String,Map<Object,Object>>
2.案例
2.1 hset \ hget \ hmset \ hmget \ hgetall \ hdel
> hset user:001 id 11 name z3 age 25
3
> hget user:001 id
"11"
> hget user:001 name
"z3"
> HMSET user:001 id 12 name li4 age 26
OK
> HMGET user:001 id name age
1) "12"
2) "li4"
3) "26"
> HGETALL user:001
1) "id"
2) "12"
3) "name"
4) "li4"
5) "age"
6) "26"
> HDEL user:001 age
(integer) 1
> HGETALL user:001
1) "id"
2) "12"
3) "name"
4) "li4"
2.2 hlen 获取某个key内的 全部数量
> hlen user:001
2
> hgetall user:001
1) "id"
2) "12"
3) "name"
4) "li4"
2.3 hexists key 在key里面的 某个值
> hgetall user:001
1) "id"
2) "12"
3) "name"
4) "li4"
> hexists user:001 name
(integer) 1
> hexists user:001 score
(integer) 0
2.4 hkeys / hvals
> hkeys user:001
1) "id"
2) "name"
> hvals user:001
1) "12"
2) "li4"
> hgetall user:001
1) "id"
2) "12"
3) "name"
4) "li4"
2.5 hincrby / hincrbyfloat 对于数据 key 的操作
> hgetall user:001
1) "id"
2) "12"
3) "name"
4) "li4"
5) "age"
6) "25"
7) "score"
8) "99.5"
> hincrby user:001 age 1
(integer) 26
> hincrby user:001 age 5
(integer) 31
> hincrbyfloat user:001 score 0.5
100.0
2.6 hsetnx
> hsetnx user:001 email isyangli@126.com
(integer) 1
> hsetnx user:001 email isyangli@126.com
(integer) 0
不存在的话新建成功、存在的话新建失败
3.应用场景
//这种大厂已经不用了 , 但是中小厂任然在用!
(4)Set 集合
- Set是String类型的无序集合
- 由于集合中的成员时唯一的, 意味着集合中不能出现重复的元素
- 集合对象的编码可以是 inset 或者 hashtable
- Set 集合是通过哈希表实现的, 即 增删查 的 时复为 O(1)
- 每个hash可以存储 (2^32 - 1)键值对(40多亿个)
0.特点:单值多value,且无重复
1.案例
1.1 SADD key member [member...] 添加元素
> SADD set1 1 1 1 2 2 2 3 4 5
(integer) 5
1.2 smembers key 遍历集合中的所有元素
> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
1.3 sismember key member 判断元素是否在集合中
> sismember set1 x
(integer) 0
> sismember set1 4
(integer) 1
1.4 srem key member[member ... ]删除元素
> srem set1 y
0
> srem set1 1
1
1.5 scard key 获取集合里面的元素个数
> smembers set1
1) "2"
2) "3"
3) "4"
4) "5"
> scard set1
4
1.6 srandmember key [数字] 从集合中随机展现设置的 数字个数,元素不删除
> smembers set1
1) "2"
2) "3"
3) "4"
4) "5"
> srandmember set1 3
1) "4"
2) "2"
3) "5"
1.7 spop key [数字] 从集合随机弹出元素 同时会删除元素
> smembers set1
1) "2"
2) "3"
3) "4"
4) "5"
> spop set1 2
1) "5"
2) "4"
> smembers set1
1) "2"
2) "3"
1.8 smove key1 key2 将key1 里存在的某个值 赋给key2
> smembers set1
1) "2"
2) "3"
> SADD set2 a b c
(integer) 3
> smove set1 set2 3
(integer) 1
> smembers set1
1) "2"
> smembers set2
1) "a"
2) "b"
3) "3"
4) "c"
2.集合运算
2.1 sdiff key1 key2 集合差集 (A-B) —— A的是缺圆的
> sadd set1 a b c 1 2
(integer) 5
> sadd set2 1 2 3 a x
(integer) 5
> sdiff set1 set2
1) "b"
2) "c"
> sdiff set2 set1
1) "x"
2) "3"
2.2 sunion key1 key2 ... 并集运算 (A U B)
> sunion set1 set2
1) "1"
2) "2"
3) "x"
4) "c"
5) "a"
6) "b"
7) "3"
2.3 sinter set1 set2 ... 交集运算 (A N B)
> sinter set1 set2
1) "1"
2) "2"
3) "a"
2.4 sintercard numkeys key [key ... ] limit
不返回结果集,只返回结果的基数(去重统计数)
返回由 所有给定集合的交集 产生集合的基数
> sinter set1 set2
1) "1"
2) "2"
3) "a"
> sintercard 2 set1 set2
(integer) 3
> sintercard 2 set1 set2 limit 1
(integer) 1
3. 场景应用
3.1 微信抽奖小程序
sadd 用户ID ==>录入用户
scard key ==>统计多少人参与抽奖
srandmember key 2 ==》抽取2人 元素不删除
spop key 1/2/3 ==>表示抽取一等奖1个、二等奖2个、3等奖3个,删除
3.2 微信朋友圈点赞 查看 同赞朋友
ssad pub msgID ==> 新增点赞
snew pub msgID ==> 取消点赞
smember pub msgID ==> 展现所有点赞过的用户
scard pub msgID ==>点赞用户数统计
sismember pub msgID ==> 判断某个朋友是否对楼主点过赞
3.3 QQ内推 可能认识的人
sunion s1 s2
(5)sorted set \ ZSet
- zset 和 set 一样也是 string类型 元素的集合 + 不允许有重复的集合成员
- 不同的是每个圆度都会 关联一个double类型的分数
- redis正是通过分数来为 集合中的成员进行 从小到大的排序
- zset的成员时唯一的 但分数(score)却可以重复
- k1 [score v1、score v2]
- 不同的是每个圆度都会 关联一个double类型的分数
- zset也是通过哈希表来实现的 即增删查的复杂度均为 O(1)
- 每个hash可以存储 (2^32 - 1)键值对(40多亿个)
(6)GEO 地理空间
- GEO 主要用于存储地理位置信息 , 并对存储的信息进行操作
- 添加地理位置坐标
- 获取地理位置坐标
- 计算两个位置之间的距离
- 根据用户给定的经纬度 来获取 指定范围内 的地理位置集合
- 美团点击查看附近的酒店
(7)HyperLogLog 基数统计
- HyperLogLog 是用来做基数统计的算法 它的优点是 :
- 在输入元素的数量 或者 体积非常非常大时
- 计算基数所需要的空间总是固定 & 很小的
- 在输入元素的数量 或者 体积非常非常大时
统计淘宝or天猫首页的访问量 怎么在节约内存的情况下 精确的统计呢?
(8)bitmap 位图
每日钉钉打卡 今天来了值为0 没有来的话值为1
有利于完成签到打卡、点击率分析的 业务场景
(9)bitfield 位域
- 通过 bitfield 命令可以一次性操作多个比特位域(指的是连续的多个比特位)
- 它会执行一系列操作 并返回 一个响应数组
- 这个数组中的元素 对应参数列表中 相应操作的执行结果
- 即 通过bitfield命令 我们可以一次性 对多个比特位域 进行操作(比如说:实时数据的替换 + 查找)
- 它会执行一系列操作 并返回 一个响应数组
(10)stream 流
- 5.0版本 后 + 数据结构
- Redis Stream 主要用于消息队列(MQ)
- 可以通过Redis 的 发布订阅 (pub/sub) 来实现消息队列的功能
- 缺点是消息无法持久化
- 比如: 网络断开连接、redis 宕机等 消息会被丢弃
- 即 发布订阅(pub/sub)可以分发消息, 但是无法记录历史消息
- 可以通过Redis 的 发布订阅 (pub/sub) 来实现消息队列的功能
- Redis Sream 提供了消息的 持久化 和 主备复制功能
- 可以让任何客户端访问任何时刻的数据 并且记住每个客户端的访问位置 还能保证消息不丢失
2.常见数据类型操作命令
2.1 文档
(1)官方
(2)中文
http://www.redis.cn/commands.html
2.2 Redis键(key)
1.查看当前库中所有的key =》keys *
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
4) "x"
2.判断某个key是否存在 =》 exists key
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k11
(integer) 0
127.0.0.1:6379> EXISTS k1 k1
(integer) 2
127.0.0.1:6379> EXISTS k1 k2 x
(integer) 3
127.0.0.1:6379> EXISTS k1 k2 x k7
(integer) 3
3.查看某个key是什么类型 =>type key
127.0.0.1:6379> type k1
string
127.0.0.1:6379> lpush list 1 2 3
(integer) 3
127.0.0.1:6379> type list
list
4.删除指定的key => del key
127.0.0.1:6379> del k3
(integer) 1
127.0.0.1:6379> del k2 x
(integer) 2
5.非阻塞删除 =>unlink key (因为删除大文件时 ,会发生阻塞, 影响系统性能)
仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作
127.0.0.1:6379> unlink k5
(integer) 1
6. 查看还有多少秒过期 =》ttl key
-1表示永不过期 -2表示已过期
127.0.0.1:6379> ttl k6
(integer) -1
127.0.0.1:6379> EXPIRE k6 20 // 设置过期时间
(integer) 1
127.0.0.1:6379> ttl k6
(integer) 12
127.0.0.1:6379> ttl k6
(integer) 9
127.0.0.1:6379> ttl k6
(integer) 7
7. 将当前数据库的key 移动到给定的 数据库db中 =》 move key index[0-15]
127.0.0.1:6379> keys *
1) "k4"
2) "k1"
3) "list"
4) "k3"
5) "k2"
127.0.0.1:6379> move list 3
(integer) 1
127.0.0.1:6379> keys *
1) "k4"
2) "k1"
3) "k3"
4) "k2"
8.切换数据库【0-15】 默认值为0 =》 select dbindex
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> keys *
1) "list"
9.查看当前数据库key数量 =》 dbsize
127.0.0.1:6379> keys *
1) "k4"
2) "k1"
3) "k3"
4) "k2"
127.0.0.1:6379> DBSIZE
(integer) 4
10. 清空当前库 =》 flushdb
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
11. 通杀全部库 => flushall
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> k
2.3 数据类型及落地应用
(0)帮助命令 help @ 类型
172.28.46.151:6378> help @string
APPEND key value
summary: Append a value to a key
since: 2.0.0BITCOUNT key [start end]
summary: Count set bits in a string
since: 2.6.0
四、Redis 实现发布订阅
4.1 what?
是一种消息通信模式,发送者(PUBLISH)发送消息,订阅者(SUBSCRIBE)接收消息,可以实现进程间的消息传递
- Redis 可以实现 消息中间件MQ 功能,通过发布订阅 实现消息的引导 和 分流
4.2 how ?
Redis 客户端 可以订阅 任意数量的 频道,类似 微信关注 多个公众号
发布/订阅 其实是一个 轻量级的队列,只不过 数据不会被 持久化,一般用来处理实时性 较高的异步消息。
4.3 pub/sub 常用命令
1.subscribe channel
订阅给定的 一个或多个频道的 消息
推荐 先执行订阅后在发布 , 订阅成功之前发布的消息收不到
订阅的客户端每次可以收到 3 个参数的 反馈消息
(1)消息的种类
(2)始发频道的名称
(3)实际的消息内容
“message”
“c1”
“hello_c1_message”
2. publish channel message
发布消息到指定的频道
3.psubscribe pattren [pattern ...]
按照模式批量订阅,订阅一个或多个符合给定模式(支持*号?号之类的)频道
4. pubsub subcommand [argument [argument ...]]
查看订阅与发布系统状态
(1) pubsub channels
由活跃频道组成的列表
(2) pubsub numsub [channel [channel ...]]
某个频道有几个订阅者
(3) pubsub numpat
只统计使用psubscribe 命令执行的,返回客户端订阅的 唯一模式的数量
5.unsubscribe[channel[channel ...]]
取消订阅
6.punsubscribe[pattern[pattern]]
退订所有给定模式的 频道
4.4 案例演示
(1) 开启3个 客户端 ,演示客户端A、B 订阅消息 , 客户端C 发布消息
(2)演示 批量订阅 和 发布
(3)取消订阅