redis数据类型与消息队列(小节3)
字符串(string):
字符串是所有编程语言中最常见的和最常用的数据类型,而且也是 redis 最基本的数据类型之一,而且 redis 中所有的 key 的类型都是字符串。
- 添加一个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)
- 获取一个key的内容
192.168.1.101:6379> get key1
"value1" <--key1对应的值
- 删除一个key
192.168.1.101:6379> DEL key1
(integer) 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"
- 批量获取多个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"
- 追加数据
192.168.1.101:6379> APPEND name lisi
(integer) 12
192.168.1.101:6379> GET name
"zhangsanlisi" <--在zhangsan后面追加了lisi
- 如不追加就想改值
192.168.1.101:6379> SET name lisi
OK
192.168.1.101:6379> get name
"lisi" <--"zhangsanlisi"变成了"lisi"
- 数值递增
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"
- 数值递减
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"
- 返回字符串key长度
192.168.37.101:6379> SET key1 value1
OK
192.168.37.101:6379> STRLEN key1
(integer) 6
列表(list):
列表是一个双向可读写的管道, 其头部是左侧尾部是右侧,一个列表最多可以包含 2^32-1 个元素即4294967295 个元素。
- 生成列表并插入数据
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
- 向列表追加数据
#从左侧追加
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"
- 获取列表长度
192.168.1.101:6379> LPUSH list1 tom jack jhon
(integer) 3
192.168.1.101:6379> LLEN list1
(integer) 3 <--获取列表长度
- 移除列表数据
192.168.1.101:6379> RPOP list1
"tom"
192.168.1.101:6379> LPOP list1
"jhon"
集合(set)
Set是String类型的无序集合。集合成员是唯一的,这就以为这集合中不能出现重复的数据。
- 生成集合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
- 追加数据; 追加的时候不能追加已经存在的数值
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
- 查看集合的所有数据
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"
- 获取集合的差集 差集:已属于A而不属于B的元素称为A与B的差(集)
192.168.1.101:6379> SDIFF set1 set2 #set1中有的set2中没有
1) "v4"
2) "v1"
- 获取集合的交集 交集:已属于A且属于B的元素称为A与B的交(集)
192.168.1.101:6379> SINTER set1 set2 #set1和set2都有
1) "v2"
2) "v3"
- 获取集合的交集 并集:已属于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多亿个成员).
- 生成有序集合:
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
- 集合排行榜案例
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"
- 获取集合的长度数
192.168.1.101:6379> ZCARD paihangbang #可以看到里面有多少数据
(integer) 3
- 基于索引返回数值
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"
- 返回某个数的索引;
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 多亿)
- 生成hash key:
192.168.1.101:6379> HSET hash1 name tom age 18
(integer) 2
192.168.1.101:6379> TYPE hash1
hash
- 获取hash key字段值
192.168.1.101:6379> HGET hash1 name
"tom"
192.168.1.101:6379> HGET hash1 age
"18"
- 删除一个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"
- 获取所有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 等。
队列介绍:
队列当中的 消息由不同的生产者写入也会有不同的消费者取出进行消费处理,但是一个消息一定是只能被取出一次也就是被消费一次。
- 生产者发布消息:
从左侧写入
[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"
- 查看队列所有消息
127.0.0.1:6379> LRANGE channel 0 -1
1) "msg1"
2) "msg2"
3) "msg3"
- 消费者消费消息
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)
- 再次验证队列消息
127.0.0.1:6379> LRANGE channel 0 -1
(empty list or set) #队列中的消息已经被全部消费完毕
发布者订阅模式
模式介绍:
在发布者订阅者模式下,发布者将消息发布到指定的channel里面,凡是监听该channel的消费者都会收到 同样的一份消息,这种模式类似于是收音机的广播模式,即凡是收听某个频道的听众都会收到主持人发布的 相同的消息内容。 此模式常用语群聊天,群通知、群公告等场景。 Subscriber:订阅者 Publisher:发布者 Channel:频道
订阅者和发布者连接到同一个redis
- 发布者发布消息:
[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)
- 订阅者监听频道
127.0.0.1:6379> SUBSCRIBE channel1 #订阅者订阅指定的频道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chann*"
3) (integer) 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"
- 订阅多个频道
127.0.0.1:6379> SUBSCRIBE channel1 channel2 #订阅channel1和channel2频道
- 订阅所有频道
127.0.0.1:6379> PSUBSCRIBE * #订阅所有频道
- 订阅匹配的频道
127.0.0.1:6379> PSUBSCRIBE dhann* #匹配订阅多个频道
redis其他命令
CONFIG命令用于查看当前 redis 配置、以及不重启更改 redis 配置等
- 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"
- 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
...
- SELECT:
切换数据库
127.0.0.1:6379> SELECT 1
OK
- keys
查看当前库下所有key
127.0.0.1:6379> KEYS *
(empty list or set)
- BGSAVE
手动在后台执行RDB持久化操作
127.0.0.1:6379> BGSAVE
Background saving started
- DBSIZE
返回当前库下的所有key数量
127.0.0.1:6379> DBSIZE
(integer) 0
FLUSHDB
强制清空当前库中的所有key
127.0.0.1:6379> FLUSHDB
OK
FLUSHALL
强制清空当前redis服务器所有数据库中的所有key,即删除所有数据
127.0.0.1:6379> FLUSHALL
OK