Redis 极速上手

文章总结尚硅谷阳哥视频重点:

 

一 .几个重要问题:

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

  1. Redis  官网
  2. http://www.redis.cn/   中文网址
  3. redis中文文档    中文文档
  4. 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/redisicon-default.png?t=N7T8https://github.com/redis/redis/源码地址
  5. Try Redis   在线测试
  6. 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]
  • 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 Sream  提供了消息的   持久化  和  主备复制功能
    • 可以让任何客户端访问任何时刻的数据        并且记住每个客户端的访问位置     还能保证消息不丢失

2.常见数据类型操作命令

2.1 文档

(1)官方

https://redis.io/commands/

(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.0

  BITCOUNT key [start end]
  summary: Count set bits in a string
  since: 2.6.0

四、Redis 实现发布订阅

官网:Redis Pub/Sub | Docs

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)取消订阅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值