Redis 常用命令
Redis 常用命令
README
更多命令查阅
首先这里不会记录所有命令,仅记录常用的。其他命令可以自己查:
见官网文档或在RedisInsight里查都是可以的
另外 Redis 非常好的一点是有自动提示,例如 输入 SET
后,后面就会提示个大概了
数据类型 (10种)
- 基本数据类型 (5种)
- 字符串 String
- 列表 List
- 集合 Set
- 有序集合 SortedSet
- 哈希 Hash
- 高级数据类型 (5种)
- 消息队列 Stream
- 地理空间 Geospatial
- HyperLogLog
- 位图 Bitmap
- 位域 Bitfield
String 字符串
- 用 Set 方式设置的则是字符串存储。无需额外加双引号。例如
SET age 25; GET age;
的输出为"25"
,是个字符串 - 区分大小写
- 存储不支持中文
整体
redis-cli # 进入redis命令行
> clear # 清空屏幕 (类似Linux命令行)
> quit # 退出。Ctrl+C 也行
> (方向键上下) # 切换上下一条命令 (类似Linux命令行)
增删改查 (字段)
SET、GET、DEL
> SET name geekhour # 增/改
OK
> SETNX Name geekhour # 增 - 若已存在则不进行任何操作
OK
> GET name # 查 - 获取值
"geekhour"
> EXISTS name # 查 - 是否存在
(integer) 1
> DEL name # 删
(nil)
增删改查 (多字段)
> KEYS * # 查 - 所有键 (高危,keys * 尽量不要用,数据量多容易崩)
1) "age"
2) "name"
> KEYS *me # 查 - 带筛选
1) "name"
> FLUSHALL # 删 - 所有键 (高危,删库跑路是吧)
OK
> KEYS *
(empty array)
过期时间
> TTS keyName # 查询键的过期时间,TTL = Time To Live。-1表示没有设置过期时间,-2表示已经过期
-1
> EXPIRE keyName 10 # 这里设置10s过期。已经过期的话。GET keyName 和 KEYS keyName 都无法找到
1
> SETEX name 5 geek # 增加键时可顺便添加过期时间
OK
中文问题
> SET name 一键三连
OK
> GET name
"\xe4\xb8\x80\xe9\x94\xae\xe4\xb8\x89\xe8\xbf\x9e"
> quit
redis-cli --raw
> GET name
一键三连
List 列表 (L/R+)
命令通常以 L/R 开头
整体
> LLEN letter # 查询列表长度
(integer) 3
增删改查 (字段)
LPUSH (Left-Push)、RPUSH (Right-Push) 分别添加到列表左侧和右测
LPOP、RPOP 分别在列表左侧和右侧删除
LRANGE、RRANGE 查看
# 增
> LPUSH letter a b c # 添加到列表左侧,可批量添加。需要注意本质还是一个个依次添加,注意顺序
(integer) 3 # 这里显示的是当前数组内有多少个元素,还是成功添加了多少个元素来着?
# 查
> LRANGE letter 0 -1 # 获取第一个到最后一个元素
1) "c"
2) "b"
3) "a"
# 删
> RPOP letter 2 # 删除列表左侧元素,可批量删除 (仅删除一个无需填数字)。需要注意本质还是一个个依次删除,注意顺序
1) "a"
2) "b"
> LTRIN letter 1 3 # 只保留索引 1、2、3 的三个元素,其他删掉 (注意他这个末尾索引居然是保留的,很反直觉)
妙用 (模拟队列与栈)
- 用
RPOP
+LPUSH
,就是一个简单的先进先出队列 (FILO) - 用
RPOP
+RPUSH
,就是一个简单的先进后出栈 (FIFO)
Set 集合 (S+)
Set 命令一般以 S 开头
底层一般为哈希表,所有元素为整数且少于512个时底层是intset
- SAdd
- SRem
- SIsMember
- SMembers
增删改查 (字段)
> SADD course Redis # 增。若重复添加则返回0
(integer) 1
> SMEMBERS course # 查 - 全部
1) "Redis"
> SISMEMBER course Redis # 查 - 是否在集合中。返回是则1,否则0
(integer) 1
> SREM course Redis # 删
(integer) 1
集合运算
集合可以运算
- SINTER
- SUNION
- SDIFF
- 等
SortedSet 有序集合 (也叫ZSet, Z+)
SortedSet 命令一般以 Z 开头
每个成员关联一个浮点数,由浮点数进行排序。集成员是不可重复的,但关联的浮点数是可重复的
分数的排序默认是从小到大排的
增删改查 (字段)
> ZADD result 680 清华 660 北大 650 复旦 640 浙大 # 增。可批量。前面数字后面字段
4
> ZRANGE result 0 -1 # 查 - 全部
浙大
复旦
北大
清华
> ZRANGE result 0 -1 WITHSCORES # 查 - 全部,连同分数
浙大
640
复旦
650
北大
660
清华
680
> ZSCORE result 清华 # 查 - 查看分数
680
> ZRANK result 清华 # 查 - 查看排名 (默认,从小到大)
3
> ZREVRANK result 清华 # 查 - 查看排名 (倒序,从大到小)
0
> ZREM result 清华 # 删
1
Hash 哈希 (H+)
键值对,命令均以 H 开头
整体
> HEKYS person # 查 - 获取所有键
name
> HLEN person # 查 - 键值对数量
1
增删改查 (字段)
> HSET person name laoyang # 增
1
> HSET person age 100
1
> HGET person name # 查
laoyang
> HGET person age
100
> HGETALL person # 查 - 获取对应内容的所有键值对
name
laoyang
age
100
> HEXISTS person name # 查 - 是否存在
1
> HDEL person age # 删
1
Stream 消息队列 (X+)
版本问题:5.0版本引入的一个新数据结构,轻量级的消息队列
可以用于解决发布订阅模式的一些局限性
学习先引:发布订阅模式
可以有多个订阅终端,同时订阅一个发布终端
发布订阅模式 缺点:消息无法持久化、记录历史消息。可以使用Stream流来解决这些问题
# 订阅终端 1~n
> SUBSCRIBE geekhour # 订阅频道
subscribe
geekhour
1 # 当发布终端进行发布时,这里会成功接收到
message
geekhour
redis
# 发布终端
> PUBLISH geekhour redis # 发布。这里表示发布一个'redis'消息
(integer) 1
增删改查
> XADD geekhour * course redis # 增。*表示自动添加一个id。内容为redis课程
# id也可以不用*而是自己写。格式为 `时间戳整数-递增序号整数`,需要递增序号手动保持递增
"1686495710450-0"
> XLEN geekhour # 查。长度
(integer) 3
> XRANGE geekhour - + # 查。所有消息,奇奇怪怪的语法糖
1) 1) "1686495710450-0"
2) 1) "course"
2) "redis"
> XDEL geekhour 1686495710450-0 # 删
(integer) 1
> XTRIM geek MAXLEN 0 # 删。这里的0表示删除所有信息
0
> XREAD COUNT 2 BLOCK 1000 STREAMS geekhour 0
# 查 - 读信息
# - 2表示一次读取两个信息
# - 1000表示若无消息则堵塞1000ms
# 这里若无则阻塞1s然后返回nil
# - 0表示从第一消息开始读取
# `$` 则表示从当前时间戳往后开始读取,通常与阻塞时间配合使用。这就就类似发布订阅模式模式了
# `>` 则表示读取最新消息
# 消息可以重复读取
(nil)
消费者组
(课程这里说得不好,没有说明有什么用)
版本问题:
(弹幕) 用电脑的exe安装redis5.0的各位 createconsumer 关键字 需要6.2以上才能使用。请大家注意!
> XGROUP CREATE geekhour group1 0 # 创建消费者组
"OK"
> XGROUP CREATECONSUMER geekhour group1 consumer1 # 将消费者加入到消费者组里
(integer) 1
> XINFO GROUPS geekhour # 查看消费者组的信息
1) 1) ...
> XREADGROUP GROUP group1 consumer1 COUNT 2 BLOCK 3000 STREAMS geekhour > # 查 - 消费者组版
Geospatial 地理空间 (Geo+)
版本问题:Redis 3.2 版本新特性,存储地理位置、支持对地理位置进行计算操作 (距离计算、经纬度获取、查找附近的人等)
地理空间命令一般以 Z 开头
增删改查
> GEOADD city 116.405285 39.904989 beijing # 增
(integer 1)
> GEOADD city 121.472644 31.231706 shanghai 114.085947 22.547 shenzhen
(integer 2)
> GEOPOS city beijing # 查 - 获取经纬度
1) 1) "116.40528291463851929"
2) "39.90498842291249559"
特殊运算
> GEODIST city beijing shanghai # 查 - 两地距离
"1067597.9668"
> GEODIST city beijing shanghai KM # 查 - 两地距离 (km单位)
"1067.5980"
> GEOSEARCH city FROMMEMBER shanghai BYRADIUS 300 KM # 查 (按经维/圆形/矩形来搜)
1) "hangzhou"
2) "shanghai"
HyperLogLog (PF+)
这是一种用来做基数统计的算法
原理:使用随机算法,牺牲部分精确度换取更小内存消耗
用途 :统计某个网站的UV,搜索词的次数
增删改查
> PFADD course git docker redis nginx # 增
(integer) 1
> PFCOUNT course # 查看基数
(integer) 4
合并
# 前面的基础上继续
> PFADD course2 python git go
(integer) 1
> PFMERGE result course course2 # 合并 (由于这两个课程中git是重复的,所以基数 = 4+3-1 = 6)
OK
> PFCOUNT result
(integer) 6
Bitmap 位图 (Bit+)
可以用String类型模拟数组,下标即偏移量。
实现:也是String的扩展,是String实现的(不过二进制存储),所以也可以用String方法进行操作
用途:记录用户在线状态、有没有点赞等
增删改查
> SETBIT dianzan 0 1 # 增/改
(integer) 0
> SETBIT dianzan 1 0
(integer) 0
> GETBIT dianzan 0 # 查
(integer) 1
> GETBIT dianzan 1
(integer) 0
> SET key dianzan "\xF0" # 增/改 - 字符串方法 11110000
> BITCOUNT dianzan # 查 - 为一的计数
(integer) 4
> BITPOS dianzan 0 # 查 - 第一个值为0的下标
(integer) 4
字符串方法
Bitmap的底层也是String,可能只是在此基础上重载了几个方法,如下标和计数等。
所以也能对字典使用字符串方法
> SET key dianzan "\xF0" # 这里等同 SETBIT 设置 11110000。话说这里是大端么
Bitfield 位域
作用:将多个小的整数存到一个位图中,可以节约空间
用途:例如,记录一个玩家的 level、money、exp
增删改查
> BITFIELD player:1 set u8 #0 1 # 写。#0表示第一个位置和约定为等级
1) (integer) 0
> GET player:1 # 读 - 字符串版。由于底层是字符串,这里也可以用字符串方法操作
"\x01"
> BITFIELD player:1 get u8 #0 # 读
1) (integer) 1
> BITFIELD player:1 set u32 #1 100 # 写。这次位置01用了32位无符号整数
1) (integer) 0
> GET palyer:1
"\x01\x00\x00\x00\x00\x00\x00d" # 不过怎么感觉这里对齐有问题……………………………………
> BITFIELD player:1 get u32 #1 # 读
1) (integer) 1
> BITFIELD player:1 incrby u32 #1 100 # 增加100
1) (integer) 200
小总结
记忆:SET or PUSH or ADD
- 非容器:set/get
- 连续容器 (自定义顺序):push/pop
- 离散容器 (无顺序/自动顺序):add/rem
哈希和字符串其实有点类似,哈希类似带组的字符串的感觉
除字符串外,一般都只能全查k2,而不能全查k1 (高危)
增 | 删 | 全查 | 查值 | |
---|---|---|---|---|
字符串 | SET k v | DEL k | KEYS * (高危) | k:EXISTS k v:GET k |
哈希 (H+) | HSET k k2 v2 | HDEL k k2 | k2:HEKYS k k2 v2:HGETALL k | k2:HEXISTS k1 k2 v2:HGET k1 k2 |
列表 (L/R+) | RPUSH k v | RPOP k num | v:RRANGE k 0 -1 | v:RRANGE k start end |
集合 (S+) | SADD k v | SREM k v | v:SMEMBERS k | v:SISMEMBER k v |
有序集合 (Z+) | ZADD k v2 k2 | ZREM k k2 | k2:ZRANGE k 0 -1 k2 v2:ZRANGE k 0 -1 WITHSCORES | v2:ZSCORE k k2 |
消息队列 (X+) | XADD | |||
地理空间 (Geo+) | ||||
HyperLogLog (PF+) | ||||
位图 (Bit+) | ||||
位域 |