文章目录
一、Redis常用命令
参考连接:http://redisdoc.com
INFO
- 显示当前节点redis运行状态信息
127.0.0.1:6379> info
SELECT
- 切换数据库,相当于在Mysql的use database指令
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> select 16
(error) ERR DB index is out of range
- 注意:在redis cluster模式下不支持多个数据库,会出现下面错误
127.0.0.1:6379> info cluster
# Cluster
cluster_enabled:1
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> select 1
(error) ERR SELECT is not allowed in cluster mode
KEYS
- 查看当前库下的所有key,此命令慎用!
命令 | 时间复杂度 |
---|---|
keys | O(n) |
dbsize | O(1) |
del | O(1) |
exists | O(1) |
expire | O(1) |
type | O(1) |
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> keys *
127.0.0.1:6379> select 1
OK
127.0.0.1:6379> keys *
# 一次设置4个key
127.0.0.1:6379[1]> mset one 1 two 2 three 3 four 4
OK
127.0.0.1:6379[1]> keys *o*
BGSAVE
- 手动在后台执行RDB持久化操作
# 交互式执行
127.0.0.1:6379[1]> bgsave
Background saving started
ll /apps/redis/data
# 非交互式执行
redis-cli -a centos --no-auth-warning bgsave
ll /apps/redis/data
DBSIZE
- 返回当前库下的所有key数量
127.0.0.1:6379[1]> dbsize
FLUSHDB
- 强制清空当前库中的所有key,此命令慎用!
127.0.0.1:6379> select 1
127.0.0.1:6379[1]> dbsize
127.0.0.1:6379[1]> flushdb
127.0.0.1:6379[1]> dbsize
FLUSHALL
- 强制清空当前redis服务器所有数据库中的所有key,即删除所有数据,此命令慎用!
127.0.0.1:6379> flushall
# 生产建议修改配置/etc/redis.conf 禁用或改为别名
rename-command FLUSHALL ""
SHUTDOWN
- shutdown 命令执行以下操作:
- 停止所有客户端
- 如果由至少一个保存点在等待,执行SAVE命令
- 如果AOF选项被打开,更新AOF文件
- 关闭redis服务器server
- 如果持久化被打开的话,shutdown命令会保证服务器正常关闭而不丢失任何数据
- 另一方面,假如只是单纯地执行save命令,然后再执行quit命令,则没有这一保证因为在执行save之后、执行quit之前的这段时间中间,其他客户端可能正在和服务器进行通讯,这时如果执行quit就会造成数据丢失。
二、redis 数据类型
字符串 string
字符串是所有编程语言中最常见的和最常用的数据类型,而且也是redis最基本的数据类型之一,而且redis中所有的key的类型都是字符串。常用于保存session信息常见,此数据类型比较常用
- 添加一个key
- set 指令可以创建一个key 并赋值,使用格式
127.0.0.1:6379> set key1 value1
127.0.0.1:6379> set title ceo ex 5 #设置自动过期时间为5秒
127.0.0.1:6379> get title
"ceo"
127.0.0.1:6379> get title
(nil)
127.0.0.1:6379> set NAME eagle #大小写敏感
OK
127.0.0.1:6379> get name
(nil)
# key不存在才设置,相当于add
127.0.0.1:6379> set name eagle
OK
127.0.0.1:6379> get name
"eagle"
127.0.0.1:6379> set name sls nx # 不存在才设置
(nil)
127.0.0.1:6379> get name
"eagle"
# key存在才设置,相当于update
127.0.0.1:6379> get name
"eagle"
127.0.0.1:6379> set name sls xx # 存在才设置 进行覆盖
OK
127.0.0.1:6379> get name
"sls"
127.0.0.1:6379> get age
(nil)
# key不存在不设置,存在才覆盖
127.0.0.1:6379> set age 18 xx
(nil)
127.0.0.1:6379> get age
(nil)
- 获取一个key的内容
127.0.0.1:6379> get name
127.0.0.1:6379> get name NAME
(error)
127.0.0.1:6379> mget name NAME
- 删除一个或多个key
127.0.0.1:6379> del name
127.0.0.1:6379> get name
127.0.0.1:6379> del age NAME
- 批量设置多个key
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
- 批量获取多个key
127.0.0.1:6379> mget k1 k2
127.0.0.1:6379> keys *
127.0.0.1:6379> keys k*
- 追加数据
127.0.0.1:6379> append k2 " append new value"
127.0.0.1:6379> get k2
"v2 append new value"
- 设置新值并返回旧值
127.0.0.1:6379> set name eagle
127.0.0.1:6379> getset name sls
"eagle"
127.0.0.1:6379> get name
"sls"
- 返回字符串key对应值的字节数
127.0.0.1:6379> set name eagle
127.0.0.1:6379> strlen name # 返回字节数
127.0.0.1:6379> set hello "世界"
OK
127.0.0.1:6379> strlen hello
(integer) 6
- 判断key是否存在
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:637> exists NAME
(integer) 0
- 查看key的过期时间
- ttl key # 查看key的剩余生存时间,如果key过期后,会自动删除
- -1 #返回值表示永不过期,默认创建的key是永不过期,重新对key复制,也会从有剩余生命周期变成永不过期
- -2 #返回值表示没有key
- num #key的剩余有效期
- ttl key # 查看key的剩余生存时间,如果key过期后,会自动删除
127.0.0.1:6379> ttl age
(integer) -2
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379>set name eagle ex 20
OK
127.0.0.1:6379>ttl name
(integer) 18
127.0.0.1:6379> ttl k1
(integer) -1
- 重新设置key的过期时间
127.0.0.1:6379> set name eagle ex 20
127.0.0.1:6379> expire name 30
(integer) 1
127.0.0.1:6379> ttl name
(integer) 29
- 取消key的过期时间
127.0.0.1:6379> ttl name
(integer) 11
127.0.0.1:6379> persist name # 使键永久存在
(integer) 1
127.0.0.1:6379> ttl name
(integer) -1
- 数值递增
- 利用INCR命令簇(INCR DECR INCRBYIDECRBY) 来把字符串当作原子计数器使用
127.0.0.1:6379> set num 21
OK
127.0.0.1:6379> incr num
(integer) 22
127.0.0.1:6379> get num
"20"
- 数值递减
127.0.0.1:6379> set num 21
OK
127.0.0.1:6379> decr num
(integer) 20
127.0.0.1:6379> get num
"20"
- 数值增加
将key对应的数字加decrement(可以是负数。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
127.0.0.1:6379> set num 30
OK
127 .0.0.1:6379> incrby num 20
(integer) 50
127.0.0.1:6379> get num
"50"
127.0.0.1:6379> incrby num -20
(integer) 30
127.0.0.1:6379> get num
"30"
127.0.0.1:6379> get num1
(nil)
127 .0.0.1:6379> incrby num1 5
(integer) 5
127.0.0.1:6379> get num1
"5"
列表 list
列表是一个双向可读写的管道,其头部是左侧,尾部是右侧,一个列表最多可以包含2^32-1 (4294967295) 个元素,下标0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。也可以使用负数下标,以-1表示列表的最后一个元素, -2 表示列表的倒数第二个元素,元素值可以重复,常用于存入日志等场景,此数据类型比较常用
- 列表特点:
- 有序
- 可重复
- 左右都可以操作
- 生成列表并插入数据
- LPUH和RPUSH都可以插入列表
127.0.0.1:6379> del name
127.0.0.1:6379> lpush name eagle cs xwz tj
(integer) 4
127.0.0.1: 6379>type name
list
127.0.0.1: 6379>llen name
127.0.0.1:6379> rpush course 1inux python go
(integer) 3
127.0.0.1: 6379> type course
list
- 向列表追加数据
127.0.0.1:6379> lpush name abc
(integer) 5
127.0.0.1:6379> rpush name tom
(integer) 6
- 获取列表长度(元索个数)
127.0.0.1: 6379>llen name
(integer) 6
- 获取列表指定位置数据
127.0.0.1:6379>lpush listl a b c d
(integer) 4
127.0.0.1:6379> lindex list1 0 #获取0编号的元素
"d"
127.0.0.1:6379> lindex listl 3 #获取3编号的元素
"a"
127.0.0.1:6379> lindex list1 -1 #获取最后一个的元素
"a"
127.0.0.1:6379> lrange 1ist1 1 2
1) "c"
2) "b"
127.0.0.1:6379> lrange 1ist1 0 3 #所有元素
1)"d"
2)"c"
3)"b"
4)"a"
127.0.0.1:6379> lrange 1ist1 0 -1 #所有元素
1)"d"
2)"c"
3)"b"
4)"a"
- 修改列表指定索引值
127.0.0.1:6379>lrange list1 0 -1
1)"d"
2)"c"
3)"b"
4)"a"
127.0.0.1:6379> rpush listkey a b c d e f
(integer) 6
127.0.0.1:6379> lrange listkey 0 -1
1)"a"
2)"b"
3)"c"
4)"d"
5)"e"
6)"f"
127.0.0.1:6379> lset listkey 2 redis
OK
127.0.0.1:6379> 1range listkey 0 -1
1)"a"
2)"b"
3)"redis"
4)"d"
5)"e"
6)"f"
- 移除列表数据
127.0.0.1:6379>lpush list1 a b c d
(integer) 4
127.0.0.1:6379>lrange list1 0 3
1)"d"
2)"c"
3)"b"
4)"a"
127.0.0.1:6379>lpop 1ist1 #弹出左边第一个元素,即删除第一个
"d"
127.0.0.1: 6379>rpop list1#弹出右边第一个元素,即删除最后一个
"a"
127.0.0.1:6379> llen list1
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1)"c"
2)"b"
* LTRIM对一个列表进行修剪(trim),让列表只保留指定区雨内的元素,不在指定区间之内的元素都将被删除
127.0.0. l:6379>lrange list1 0 3
1)"d"
2)"c"
3)"b"
4)"a"
127.0.0.1:6379> ltrim list1 1 2
OK
127.0.0.1:6379> lrange list1 0 -1
1)"c"
2)"b"
- 删除list
127.0.0.1:6379> del list1
(integer) 1
127.0.0.1:6379> exists list1
(integer) 0
集合 set
Set是String类型的无序集合,集合中的成员是唯一的, 这就意味着集合中不能出现重复的数据,可以在两个不同的集合中对数据进行对比并取值,常用于取值判断,统计,交集等场景
- 集合特点
- 无序
- 无重复
- 集合间操作
- 生成集合key
127.0.0.1:6379> sadd set1 v1
(integer) 1
127.0.0.1:6379> sadd set2 v2 v3
(integer) 2
127.0.0.1:6379> type set1
set
127.0.0.1:6379> type set2
set
- 追加数值
- 追加时,只能追加不存在的数据,不能追加已经存在的数据
127.0.0.1:6379> sadd set1 v1 #已存在的值, 无法再次添加
(integer) 0
127.0.0.1:6379> sadd set1 V3 V4 v5
(integer) 3
- 查看集合的所有数据
127 .0.0.1:6379> smembers set1
1) "v3"
2) "v5"
3) "v4"
4) "v1"
127 .0.0.1:6379> smembers set2
- 删除集合中的元素
127.0.0.1:6379> sadd goods mobile car laptop
(integer) 3
127.0.0.1:6379> srem goods car
(integer) 1
127.0.0.1:6379> smembers goods
1) "mobile"
2) "laptop"
- 获取集合的交集
- 交集:已属于A且属于B的元素称为A与B的交集
127.0.0.1:6379> smembers set1
1) "v3"
2) "v5"
3) "v4"
4) "v1"
127.0.0.1:6379> smembers set2
1) "v3"
2) "v2"
127.0.0.1:6379> sinter set1 set2
1) "v3"
- 获取集合的并集
- 并集:已属于A或属于B的元素称为A与B的并集
127.0.0.1:6379> sunion set1 set2
1) "v1"
2) "v4"
3) "v5"
4) "v3"
5) "v2"
- 获取集合的差集
- 差集:已属于A而不属于B的元素称为A与B的差(集)
127.0.0.1:6379> sdiff set1 set2
1) "v1"
2) "v4"
3) "v5"
有序集合 sorted set
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double(双精度浮点型)类型的分数,redis正是通过该分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1), 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员),经常用于排行榜的场景
- 有序集合特点
- 有序
- 无重复元素
- 每个元素是由score和value组成
- score 可以重复
- value 不可以重复
- 生成有序集合
127.0.0.1:6379> zadd zset1 1 v1 #分数为1
(integer) 1
127.0.0.1:6379> zadd zset1 2 v2
(integer) 1
127.0.0.1:6379> zadd zset1 2 v3 #分数可重复,元素值不可以重复
(integer) 1
127.0.0.1:6379> zadd zset1 3 v4
(integer) 1
127.0.0.1:6379> type zset1
zset
127.0.0.1:6379> zadd zset2 1 v1 2 v2 3 v3 4 v4 5 v5 #一次生成多个数据
(integer) 5
- 有序集合实现排行榜
127.0.0.1:6379> zadd phb 90 xwz 95 tj 30 sg
(integer) 3
127.0.0.1:6379> zrange phb 0 -1
#正序排序后显示集合内所有的key,score从小到大显示
1) "sg"
2) "xwz"
3) "tj"
127.0.0.1:6379> zrevrange phb 0 -1
#倒叙排序后显示集合内所有的key,score从大到小显示
1) "tj"
2) "xwz"
3) "sg"
127.0.0.1:6379> zrevrange phb 0 -1 withscores
#正序显示指定集合内所有key和得分情况
1) "tj"
2) "95"
3) "xwz"
4) "90"
5) "sg"
6) "30"
- 获取集合的个数
127.0.0.1:6379> zcard phb
(integer) 3
- 基于索引返回数值
127.0.0.1:6379> zrange phb 0 2
1) "sg"
2) "xwz"
3) "tj"
127.0.0.1:6379> zrange phb 0 -1
1) "sg"
2) "xwz"
3) "tj"
- 返回某个数值的索引(排名)
127.0.0.1:6379> zadd phb 90 sls 95 tj 30 sg
(integer) 3
127.0.0.1:6379> zrange phb 0 -1
1) "sg"
2) "xwz"
3) "tj"
127.0.0.1:6379> zrank phb sg
(integer) 0
127.0.0.1:6379> zrank phb tj
(integer) 2
- 获取分数
127.0.0.1:6379> zscore phb tj
"95"
127.0.0.1:6379> zscore phb sg
"30"
- 删除元素
127.0.0.1:6379> zrem phb sg tj
(integer) 2
127.0.0.1:6379> zrange phb 0 -1
1) "xwz"
哈希 hash
hash 是一个string类型的字段(field)和值(value)的映射表,Redis 中每个 hash 可以存储 2^32 -1 键值对,类似于字典,存放了多个k/v 对,hash特别适合用于存储对象场景
- 生成 hash key
127.0.0.1:6379> hset 9527 name sg age 30
(integer) 2
127.0.0.1:6379> type 9527
hash
127.0.0.1:6379> hgetall 9527
1) "name"
2) "sg"
3) "age"
4) "30"
#增加字段
127.0.0.1:6379> hset 9527 gender man
(integer) 1
127.0.0.1:6379> hgetall 9527
1) "name"
2) "sg"
3) "age"
4) "30"
5) "gender"
6) "man"
- 获取hash key的对应字段的值
127.0.0.1:6379> hget 9527 name
"sg"
127.0.0.1:6379> hget 9527 gender
"man"
127.0.0.1:6379> hmget 9527 age gender #获取多个值
1) "30"
2) "man"
- 删除一个hash key 的对应字段
127.0.0.1:6379> hdel 9527 age
(integer) 1
127.0.0.1:6379> hget 9527 age
(nil)
- 批量设置hash key的多个field和value
127.0.0.1:6379> hmset 1024 name xls age 28 city changzhou
OK
127.0.0.1:6379> hgetall 1024
1) "name"
2) "xls"
3) "age"
4) "28"
5) "city"
6) "changzhou"
- 获取hash中指定字段的值
127.0.0.1:6379> hmget 1024 name city
1) "xls"
2) "changzhou"
- 获取hash中的所有字段名field
127.0.0.1:6379> hkeys 1024
1) "name"
2) "age"
3) "city"
- 获取hash key对应所有field的value
127.0.0.1:6379> hvals 1024
1) "xls"
2) "28"
3) "changzhou"
- 获取指定hash key 的所有field及value
127.0.0.1:6379> hgetall 1024
1) "name"
2) "xls"
3) "age"
4) "28"
5) "city"
6) "changzhou"
- 删除 hash
127.0.0.1:6379> del 1024
(integer) 1
127.0.0.1:6379> hmget 1024 name age
1) (nil)
2) (nil)
127.0.0.1:6379> exists 1024
(integer) 0
三、消息队列
- 消息队列: 把要传输的数据放在队列中
- 功能: 可以实现多个系统之间的解耦,异步,削峰/限流等
- 常用的消息队列应用: kafka,rabbitMQ,redis
消息队列主要分为两种,这两种模式Redis都支持
- 生产者/消费者模式
- 发布者/订阅者模式
生产者消费者模式
在生产者/消费者(Producer/Consumer)模式下,上层应用接收到的外部请求后开始处理其当前步骤的操作,在执行完成后将已经完成的操作发送至指定的频道(channel,逻辑队列)当中,并由其下层的应用监听该频道并继续下一步的操作,如果其处理完成后没有下一步的操作就直接返回数据给外部请求,如果还有下一步的操作就再将任务发布到另外一个频道,由另外一个消费者继续监听和处理。此模式应用广泛
模式介绍
生产者消费者模式下,多个消费者同时监听一个队列,但是一个消息只能被最先抢到消息的消费者消费,即消息任务是一次性读取和处理,此模式在分布式业务架构中很常用,比较常用的消息队列软件还有RabbitMQ、Kafka、RocketMQ、ActiveMQ等。
队列介绍
队列当中的消息由不同的生产者写入,也会有不同的消费者取出进行消费处理,但是一个消息一定是只能被取出一次也就是被消费一次。
- 生产者发布消息
[root@localhost ~]# redis-cli
127.0.0.1:6379> auth centos
OK
127.0.0.1:6379> lpush channel1 msg1
(integer) 1
127.0.0.1:6379> lpush channel1 msg2
(integer) 2
127.0.0.1:6379> lpush channel1 msg3
(integer) 3
127.0.0.1:6379> lpush channel1 msg4
(integer) 4
127.0.0.1:6379> lpush channel1 msg5
(integer) 5
- 查看队列所有消息
127.0.0.1:6379> lrange channel1 0 -1
1) "msg5"
2) "msg4"
3) "msg3"
4) "msg2"
5) "msg1"
- 消费者消费消息
127.0.0.1:6379> rpop channel1
"msg1"
127.0.0.1:6379> rpop channel1
"msg2"
127.0.0.1:6379> rpop channel1
"msg3"
127.0.0.1:6379> rpop channel1
"msg4"
127.0.0.1:6379> rpop channel1
"msg5"
127.0.0.1:6379> rpop channel1
(nil)
发布者订阅模式
模式简介
在发布者订阅者模式下,发布者将消息发布到指定的channel里面,凡是监听该channel的消费者都会收到同样的一份消息,这种模式类似于是收音机的广播模式,即凡是收听某个频道的听众都会收到主持人发布的相同的消息内容。此模式常用于群聊天、群通知、群公告等场景
-
Publisher:发布者
-
Subscriber:订阅者
-
Channel:频道
-
订阅者监听频道
127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
- 发布者发布消息
127.0.0.1:6379> publish channel1 test1
(integer) 1 #订阅者个数
127.0.0.1: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
- 订阅所有频道
127.0.0.1:6379> psubscribe * #支持通配符*
- 订阅匹配的频道
127.0.0.1:6379> psubscrib chann* #匹配订阅多个频道 1
- 取消订阅
127.0.0.1:6379> unsubscribe channel1
1) "unsubscribe"
2) "channel1"
3) (integer) 0