redis数据类型与消息队列(小节3)

298 阅读8分钟

redis数据类型与消息队列(小节3)

字符串(string):

字符串是所有编程语言中最常见的和最常用的数据类型,而且也是 redis 最基本的数据类型之一,而且 redis 中所有的 key 的类型都是字符串。

  1. 添加一个key:
192.168.1.101:6379> KEYS *
(empty list or set)    <--空列表
192.168.1.101:6379> set key1 value1
OK
192.168.1.101:6379> get key1
"value1"     <--key1对应的值
192.168.1.101:6379> TYPE key1
string
192.168.1.101:6379> KEYS *
1) "key1"

"ex 5"设置自动过期时间

#添加一个"key" 5秒后过期
192.168.1.101:6379> SET qwe 123 ex 5
OK
192.168.1.101:6379> get qwe
"123"
192.168.1.101:6379> get qwe
(nil)
  1. 获取一个key的内容
192.168.1.101:6379> get key1
"value1"     <--key1对应的值
  1. 删除一个key
192.168.1.101:6379> DEL key1
(integer) 1
  1. 批量设置多个key
192.168.1.101:6379> MSET name zhangsan age 18 job it
OK
192.168.1.101:6379> GET age
"18"
192.168.1.101:6379> GET name
"zhangsan"
  1. 批量获取多个key
192.168.1.101:6379> MSET name zhangsan age 18 job it
OK
192.168.1.101:6379> GET age
"18"
192.168.1.101:6379> GET name
"zhangsan"
  1. 追加数据
192.168.1.101:6379> APPEND name lisi
(integer) 12
192.168.1.101:6379> GET name
"zhangsanlisi"    <--在zhangsan后面追加了lisi
  1. 如不追加就想改值
192.168.1.101:6379> SET name lisi
OK
192.168.1.101:6379> get name
"lisi"    <--"zhangsanlisi"变成了"lisi"
  1. 数值递增
192.168.1.101:6379> set num 100
OK
192.168.1.101:6379> get num
"100"
192.168.1.101:6379> INCR num    #数值递增
(integer) 101
192.168.1.101:6379> get num
"101"
  1. 数值递减
192.168.1.101:6379> set num 10
OK
192.168.1.101:6379> get num
"10"
192.168.1.101:6379> DECR num    #数值递减
(integer) 9
192.168.1.101:6379> get num
"9"
  1. 返回字符串key长度
192.168.37.101:6379> SET key1 value1
OK
192.168.37.101:6379> STRLEN key1
(integer) 6

列表(list):

列表是一个双向可读写的管道, 其头部是左侧尾部是右侧,一个列表最多可以包含 2^32-1 个元素即4294967295 个元素。

  1. 生成列表并插入数据
192.168.1.101:6379> LPUSH list1 tom jack jhon  #根据顺序逐个写入list1,最后jhon会在列表的最左侧。
(integer) 3
192.168.1.101:6379> TYPE list1
list
192.168.1.101:6379> LPOP list1
"jhon"    <--列表最左侧jhon
192.168.1.101:6379> RPOP list1
"tom"    <--列表最右侧tom
  1. 向列表追加数据
#从左侧追加
192.168.1.101:6379> LPUSH list1 l1
(integer) 2
192.168.1.101:6379> LPOP list1
"l1"

#从右侧追加
192.168.1.101:6379> RPUSH list1 l2
(integer) 2
192.168.1.101:6379> RPOP list1
"l2"
  1. 获取列表长度
192.168.1.101:6379> LPUSH list1 tom jack jhon
(integer) 3
192.168.1.101:6379> LLEN list1
(integer) 3    <--获取列表长度
  1. 移除列表数据
192.168.1.101:6379> RPOP list1
"tom"
192.168.1.101:6379> LPOP list1
"jhon"

集合(set)

Set是String类型的无序集合。集合成员是唯一的,这就以为这集合中不能出现重复的数据。

  1. 生成集合key
192.168.1.101:6379> SADD set1 v1 v2
(integer) 2
192.168.1.101:6379> SADD set2 v2 v3
(integer) 2
192.168.1.101:6379> TYPE set1
set    #set 无序集合
192.168.1.101:6379> TYPE set2
set
  1. 追加数据; 追加的时候不能追加已经存在的数值
192.168.1.101:6379> SADD set1 v1 v2 v3 v4
(integer) 2
192.168.1.101:6379> SADD set1 v1 v2   #没有追加成功
(integer) 0
192.168.1.101:6379> TYPE set1
set
192.168.1.101:6379> TYPE set2
set
  1. 查看集合的所有数据
192.168.1.101:6379> SMEMBERS set1
1) "v2"
2) "v1"
3) "v3"
4) "v4"
192.168.1.101:6379> SMEMBERS set2
1) "v2"
2) "v3"
  1. 获取集合的差集 差集:已属于A而不属于B的元素称为A与B的差(集)
192.168.1.101:6379> SDIFF set1 set2    #set1中有的set2中没有
1) "v4"
2) "v1"
  1. 获取集合的交集 交集:已属于A且属于B的元素称为A与B的交(集)
192.168.1.101:6379> SINTER set1 set2    #set1和set2都有
1) "v2"
2) "v3"
  1. 获取集合的交集 并集:已属于A或属于B的元素称为A与B的交(集)
192.168.1.101:6379> SUNION set1 set2    #set1和set2都有的数据、去重
1) "v2"
2) "v1"
3) "v3"
4) "v4"

sorted set(有序合集)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double(双精度浮点型)类型的分数,redis正式通过该分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score) 却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1),集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员).

  1. 生成有序集合:
192.168.1.101:6379> ZADD zset1 1 v1
(integer) 1
192.168.1.101:6379> ZADD zset1 2 v2
(integer) 1
192.168.1.101:6379> ZADD zset1 2 v3
(integer) 1
192.168.1.101:6379> ZADD zset1 3 v4
(integer) 1
192.168.1.101:6379> TYPE zset1
zset    #有序集合

#一次生成多个有序数据
192.168.1.101:6379> ZADD zset2 1 v1 2 v2 3 v3 4 v4 5 v5
(integer) 5
  1. 集合排行榜案例
192.168.1.101:6379> ZADD paihangbang 10 key1 20 key2 30 key3
(integer) 3

192.168.1.101:6379> ZRANGE paihangbang 0 -1   #显示集合内所有的key
1) "key1"
2) "key2"
3) "key3"

192.168.1.101:6379> ZRANGE paihangbang 0 -1 WITHSCORES   #显示指定集合内所有key和得分情况
1) "key1"
2) "10"
3) "key2"
4) "20"
5) "key3"
6) "30"
  1. 获取集合的长度数
192.168.1.101:6379> ZCARD paihangbang    #可以看到里面有多少数据
(integer) 3
  1. 基于索引返回数值
192.168.1.101:6379> ZRANGE paihangbang 1 2
1) "key2"
2) "key3"
192.168.1.101:6379> ZRANGE paihangbang 0 2
1) "key1"
2) "key2"
3) "key3"
  1. 返回某个数的索引;
192.168.1.101:6379> ZRANK paihangbang key1
(integer) 0
192.168.1.101:6379> ZRANK paihangbang key3
(integer) 2

哈希(hash)

hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,Redis 中每个 hash可以存储 2^32 - 1 键值对(40 多亿)

  1. 生成hash key:
192.168.1.101:6379> HSET hash1 name tom age 18
(integer) 2
192.168.1.101:6379> TYPE hash1
hash
  1. 获取hash key字段值
192.168.1.101:6379> HGET hash1 name
"tom"
192.168.1.101:6379> HGET hash1 age
"18"
  1. 删除一个hash key的字段
192.168.1.101:6379> HDEL hash1 age   #删除
(integer) 1
192.168.1.101:6379> HGET hash1 age   #hash1中的age没有了、被删除了
(nil)
192.168.1.101:6379> HKEYS hash1   #现在hash1中只有name
1) "name"
  1. 获取所有hash表中的字段
192.168.1.101:6379> HSET hash1 name tom age 18   #再次执行就覆盖了
(integer) 1
192.168.1.101:6379> HKEYS hash1   #获取所有hash1表中的字段、此时就有连个字段
1) "name"
2) "age"

消息队列

消息队列主要分为两种,分别是生产者消费者模式和发布者订阅者模式,这两种模式 Redis 都支持。

生产者消费者模式:

在生产者/消费者(Producer/Consumer)模式下, 上层应用接收到的外部请求后开始处理其当前步骤的操作,在执行完成后将已经完成的操作发送至指定的频道(channel)当中,并由其下层的应用监听该频道并继续下一步的操作, 如果其处理完成后没有下一步的操作就直接返回数据给外部请求,如果还有下一步的操作就再将任务发布到另外一个频道, 由另外一个消费者继续监听和处理。

模式介绍:

生产者消费者模式下, 多个消费者同时监听一个队里,但是一个消息只能被最先抢到消息的消费者消费, 即消息任务是一次性读取和处理, 此模式在分布式业务架构中非常常用, 比较常用的软件还有RabbitMQ、 Kafka、 RocketMQ、 ActiveMQ 等。

图片.png

队列介绍:

队列当中的 消息由不同的生产者写入也会有不同的消费者取出进行消费处理,但是一个消息一定是只能被取出一次也就是被消费一次。

图片.png

  1. 生产者发布消息:

从左侧写入

[root@redis ~]# /apps/redis/bin/redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> LPUSH channel msg1
(integer) 1
127.0.0.1:6379> LPUSH channel msg2
(integer) 2
127.0.0.1:6379> LPUSH channel msg3
(integer) 3
127.0.0.1:6379> KEYS *
1) "channel"
  1. 查看队列所有消息
127.0.0.1:6379> LRANGE channel 0 -1
1) "msg1"
2) "msg2"
3) "msg3"
  1. 消费者消费消息
127.0.0.1:6379> RPOP channel
"msg3"
127.0.0.1:6379> RPOP channel
"msg2"
127.0.0.1:6379> RPOP channel
"msg1"
127.0.0.1:6379> RPOP channel
(nil)
  1. 再次验证队列消息
127.0.0.1:6379> LRANGE channel 0 -1
(empty list or set)     #队列中的消息已经被全部消费完毕

发布者订阅模式

模式介绍:

     在发布者订阅者模式下,发布者将消息发布到指定的channel里面,凡是监听该channel的消费者都会收到
同样的一份消息,这种模式类似于是收音机的广播模式,即凡是收听某个频道的听众都会收到主持人发布的
相同的消息内容。
   此模式常用语群聊天,群通知、群公告等场景。
   Subscriber:订阅者
   Publisher:发布者
   Channel:频道

图片.png

订阅者和发布者连接到同一个redis

  1. 发布者发布消息:
[root@redis ~]# redis-cli
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> PUBLISH clannel1 test1  #发布者发布消息
(integer) 0
127.0.0.1:6379> PUBLISH clannel1 test2
(integer) 0
127.0.0.1:6379> KEYS *
(empty list or set)
  1. 订阅者监听频道
127.0.0.1:6379> SUBSCRIBE channel1  #订阅者订阅指定的频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chann*"
3) (integer) 1
  1. 各订阅者验证消息
[root@client1 ~]# redis-cli -h 192.168.1.101
192.168.1.101:6379> AUTH 123456
OK
192.168.1.101:6379> PUBLISH channel1 test1
(integer) 1
192.168.1.101:6379> PUBLISH channel1 test2
(integer) 1

结果

127.0.0.1:6379> SUBSCRIBE channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"    <--
2) "channel1"
3) "test1"
1) "message"    <--
2) "channel1"
3) "test2"
  1. 订阅多个频道
127.0.0.1:6379> SUBSCRIBE channel1 channel2  #订阅channel1和channel2频道
  1. 订阅所有频道
127.0.0.1:6379> PSUBSCRIBE *   #订阅所有频道
  1. 订阅匹配的频道
127.0.0.1:6379> PSUBSCRIBE dhann*   #匹配订阅多个频道

redis其他命令

CONFIG命令用于查看当前 redis 配置、以及不重启更改 redis 配置等

  1. CONFIG SET

(1)更改最大连接数:maxclients

127.0.0.1:6379> CONFIG set maxclients 1024
OK
127.0.0.1:6379> CONFIG get maxclients
1) "maxclients"
2) "1024"

(2)设置连接密码:requirepass

192.168.1.101:6379> CONFIG set requirepass 123
OK
127.0.0.1:6379> CONFIG GET requirepass
(error) NOAUTH Authentication required.    #需要验证
192.168.1.101:6379> AUTH 123     #输入密码 123
OK 
192.168.1.101:6379> CONFIG get requirepass
1) "requirepass"
2) "123"
  1. INFO

显示当期节点redis运行状态消息

127.0.0.1:6379> INFO
# Server
redis_version:5.0.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:603babe9921ca653
redis_mode:standalone
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:3546
run_id:054eb7961b11d6977712784992544b2c0dda4f97
tcp_port:6379
uptime_in_seconds:18415
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:8928603
executable:/apps/redis/bin/redis-server
config_file:/apps/redis/etc/redis.conf
...
  1. SELECT:

切换数据库

127.0.0.1:6379> SELECT 1
OK
  1. keys

查看当前库下所有key

127.0.0.1:6379> KEYS *
(empty list or set)
  1. BGSAVE

手动在后台执行RDB持久化操作

127.0.0.1:6379> BGSAVE
Background saving started
  1. DBSIZE

返回当前库下的所有key数量

127.0.0.1:6379> DBSIZE
(integer) 0
  1. FLUSHDB

强制清空当前库中的所有key

127.0.0.1:6379> FLUSHDB
OK
  1. FLUSHALL

强制清空当前redis服务器所有数据库中的所有key,即删除所有数据

127.0.0.1:6379> FLUSHALL
OK