Redis-常用命令
Redis-常用命令
Redis的命令也是不区分大小写的,但key是区分大小写的,例如k1
和K1
是两个不同的键
使用help @类型
命令,获取帮助文档
注:在一般的编程语言中,例如python和java,字符串的截取一般都用于左闭右开
原则,而Redis采用左闭右闭
原则
注2:如果存在中文乱码,则在客户端连接时加入参数--raw
Key相关命令
命令 | 功能 |
---|---|
keys * | 查看当前库中的所有key |
exists key | 判断某个key是否存在 |
type key | 查看你的key是什么类型 |
del key | 删除指定的key |
unlink key | 非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作 |
ttl key | 查看还有多少秒过期,-1为永不过期,-2表示已经过期 |
expire key 时间(s) | 为给定的key设置过期时间 |
move key dbindex | 将当前数据库的key移动到给定的数据库db当中,默认有16个数据库 |
select dbindex | 切换数据库到 [0-15] |
dbsize | 查看当前数据库key的数量 |
flushdb | 清空当前库 |
flushall | 通杀数据库(16个库) |
十大数据类型的常用命令
String相关命令
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |
EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
NX
-- 仅设置尚不存在的key,当key已存在,返回nil**(分布式锁能用到)**XX
-- 仅设置已存在的key,当key不存在,返回nilEX
seconds -- 设置指定的到期时间,以秒为单位(正整数)(分布式锁能用到)PX
milliseconds -- 设置指定的过期时间,以毫秒为单位(正整数)EXAT
timestamp-seconds -- 设置key过期的指定 Unix 时间,以秒为单位(正整数)PXAT
timestamp-milliseconds -- 设置key过期的指定 Unix 时间,以毫秒为单位(正整数)KEEPTTL
-- 修改时,保留与key关联的生存时间GET
-- 返回存储在 key 中的旧字符串,如果 key 不存在,则返回 nil。如果存储在 key 的值不是字符串,则返回并中止错误
UNIX时间戳
Long.toString(System.currentTimeMills()/1000L) // 获取Unix时间戳,以秒为单位
命令 | 功能 |
---|---|
MSET key value [key value ...] | 批量添加 |
MGET key [key ...] | 批量获取 |
MSETNX key value [key value ...] | 批量添加,如果有任何一个元素已经存在,则执行失败 |
GETRANGE key start end | 遍历字符串(下标从0开始)类似java的SubString字符串截取 |
SETRANGE key offset value | 选取字符串覆盖(下标从0开始) |
INCR key | 将存储的数字递增 1 |
INCRBY key increment | 将储存的数字递增,步长为increment |
DECR key | 将存储的数字递减 1 |
INCRBY key increment | 将储存的数字递减,步长为increment |
STRLEN key | 获取字符串长度 |
APPEND key value | 字符串追加 |
SETEX key seconds value | 添加数据的同时设置过期时间(被set参数实现了) |
SETNX key value | 添加数据的同时检测数据是否存在,若不存在则添加成功(被set参数实现了) |
GETSET key value | set新值的同时返回老值(被set参数实现了) |
List相关命令
List的实现就是单Key多Value
一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿
主要功能有push/pop等,一般用在栈、队列、消息队列等场景
left、right都可以插入添加
-
如果键不存在,创建新的链表
-
如果键已存在,新增内容
-
如果值全移除,对应的键也就消失了
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
命令 | 功能 |
---|---|
LPUSH key element [element ...] | 头部插入 |
RPUSH key element [element ...] | 尾部插入 |
LRANGE key start stop | 遍历链表(如果参数是0 和-1 ,就遍历此表) |
LPOP key [count] | 头部删除 |
RPOP key [count] | 尾部删除 |
LINDEX key index | 查找元素(以0为第一个元素) |
LLEN key | 获取List长度 |
LREM key count element | 删除List中count 数量的element 元素 |
LTRIM key start stop | 截取List中strat 到stop 的元素,其余元素删除 |
RPOPLPUSH source destinatin | 删除source 的尾部元素,将此元素添加到destination 的头部 |
LSET key index element | 修改元素 |
LINSERT key <BEFORE | AFTER> pivot element | 插入元素,pivot 为被插入元素而不是index |
尾部插入,正向遍历,就会得到正序的结果
很多命令的start参数可以为-1,从尾部开始操作
Hash相关命令
Map<String,Map<Object,Object>>
命令 | 功能 |
---|---|
HSET key field value [field value ...] | 创建Hash元素 |
HGET key field | 获取键中指定属性的值 |
HGETALL key | 获取键中所有的键值对(属性和值) |
HMSET key field value [field value ...] | 创建Hash元素(貌似看起来和set一摸一样呢) |
HMGET key field [field ...] | 获取键中指定多个属性的值 |
HDEL key field [field ...] | 删除键中属性 |
HLEN key | 获取键中属性的数量 |
HEXISTS key field | 判断键中是否存在属性(存在返回1,不存在返回0) |
HKEYS key | 遍历键中所有属性(只有属性) |
HVALS key | 遍历键中所有属性的值(只有值) |
HINCRBY key field increment | 将键中整形属性的数字递增increment |
HINCRBYFLOAT key field increment | 将键中浮点型属性的数字递增increment |
HSETNX key field value | 添加数据的同时检测数据是否存在,若不存在则添加成功 |
Set相关命令
Set是一个无序无重复的列表,也同样实现了一个Key多个Value
命令 | 功能 |
---|---|
SADD key member [member ...] | 添加元素,当元素重复时则只添加一个 |
SMEMBERS key | 遍历set |
SISMEMBER key member | 判断集合中是否存在该元素 |
SREM key member [member ...] | 删除元素(成功返回1,失败返回0) |
SCARD key | 统计集合中有多少个元素 |
SRANDMEMBER key [count] | 随机显示count 个set元素,不会改变原有set |
SPOP key [count] | 随机删除count 个set元素,并显示删除的元素 |
SMOVE source destination member | 将source 集合中的member 元素移到destination 集合中 |
集合运算
现存在以下集合:
A:abc12
B:123ax
SDIFF A B的结果是"b" "c"
SDIFF B A的结果是"3" "x"
SUNION A B的结果是:"a" "b" "c" "1" "2" "3" "x"
SINTER A B 的结果是:"a" "1" "2"
命令 | 功能 |
---|---|
SDIFF key [key ...] | 求两个集合中的差集 |
SUNION key [key ...] | 求两个集合的并集 |
SINTER key [key ...] | 求两个集合的交集 |
SINTERCARD numkeys key [key ...] [LIMIT limit] | 返回交集的结果集个数,limit控制返回的个数为 < 结果 |
ZSet相关命令
Zset是有序的set集合,其实现方法是在每一个value前加上字段score,根据字段score可进行排序
命令 | 功能 |
---|---|
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...] | 添加元素 |
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES] | 遍历元素*WITHSCORES 带有分数遍历* |
ZREVRANGE key start stop [WITHSCORES] | 反向遍历元素*WITHSCORES 带有分数遍历* |
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] | 以分数筛选*默认范围是包含min和max,如果不想包含,则使用() *修饰 |
ZCARD key | 返回元素数量 |
ZREM key member [member ...] | 删除元素 |
ZINCRBY key increment member | 将键中元素递增increment |
ZCOUNT key min max | 返回以分数min 到max 范围内的元素数量 |
ZMPOP numkeys key [key ...] <MIN | MAX> [COUNT count] | 从分数min 或max 弹出COUNT 个元素,可以从多个key中弹出,numkeys 标识要多少个key |
ZRANK key member [WITHSCORE] | 正序获得元素的下标不是分数 |
ZREVRANK key member [WITHSCORE] | 逆序获得元素的下标不是分数 |
在查询中,Limit的作用是添加返回的条件,类似于MySql中的Limit来分页
BitMap相关命令
由0和1状态表现得二进制位的bit数组,其底层实现也是String类型
命令 | 功能 |
---|---|
SETBIT key offset value | 在键中的offset 设置value |
GETBIT key offset | 通过key 中的offset 获取到value |
STRLEN key | 此命令是String的命令,获取到BitMap类型的键所占用内存字节数 |
BITCOUNT key [start end [BYTE | BIT]] | 统计键中value 为1的数量 |
BITOP <AND | OR | XOR | NOT> destkey key [key ...] | 对数据进行按位运算,将运算结果储存到destkey 中 |
实际场景应用于标记签到打卡信息
将日期作为key
我们可以将偏移量设为用户id,也就是用户标识,将value设置为是否签到,key则为当天的具体日期
SETBIT 20240707 0 1 # 2024年7月7日,0号用户签到
SETBIT 20240708 0 1 # 2024年7月8日,0号用户签到
将这两条BitMap进行与运算,即可获得这两天连续签到的用户
BITOP AND k1 20240707 20240708 # 将与运算的结果储存到k1
将用户作为key
我们将key设为用户,将偏移量设为日期,将value设置为是否签到
SETBIT xiaobai:202407 0 1 # 用户小白在六月份的第0天签到
SETBIT xiaobai:202407 1 1 # 用户小白在六月份的第1天签到
使用BITCOUNT命令对该用户的这一月份签到信息进行统计
BITCOUNT xiaobai:202407 # 看看小白这个月来了多少天
HyperLogLog相关命令
去重复统计功能的基数估计算法
HyperLogLog只会根据输入元素计算基数,而不会储存输入元素的本身,底层使用String类型
UV
UV是一个全新的概念,Unique Visitor 独立访客
可以理解为同一个Ip的多次访问,视作一个用户的访问
所以统计UV需要考虑去重问题
命令 | 功能 |
---|---|
PFADD key [element [element ...]] | 添加指定元素 |
PFCOUNT key [key ...] | 统计基数 |
PFMERGE destkey [sourcekey [sourcekey ...]] | 合并key到目标key中 |
GEO相关命令
GEO的底层是基于ZSet,坐标就是score
通过GEOHASH 将经纬度的二维数据转换为Base32加密
命令 | 功能 |
---|---|
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...] | 将坐标添加到key中 |
ZRANGE key start stop [BYSCORE |BYLEX] [REV] [LIMIT offset count] [WITHSCORES] | 因为底层实现是ZSet,所以仍然可以使用ZSet的方式进行遍历 |
GEOPOS key [member [member ...]] | 通过元素获得坐标 |
GEOHASH key [member [member ...]] | 通过元素获得Base32加密的坐标,实际开发用这个 |
GEODIST key member1 member2 [M | KM | FT | MI] | 返回两个元素之间的距离,可选择单位 |
GEORADIUS key longitude latitude radius <M | KM | FT | MI> [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key | STOREDIST key] | 以longitude latitude 为坐标发起点,寻找包含在key 中,以半径为radius 的所有元素坐标。count 可配置显示数量,`ASC |
GEORADIUSBYMEMBER key member radius <M | KM | FT | MI> [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key | STOREDIST key] | 以元素member 为发起点,其余参数与上一条相同 |
Stream相关命令
Redis-Stream就是Redis版本的MQ(消息中间件)的处理模型
在5.0版本之前,Redis处理消息队列有两种方案
- List处理消息队列,使用LPUSH和RPOP
- Pub/Sub实现,但无法持久化数据
所以,Redis提供了Stream数据类型,用以解决这两个处理方式的痛点
- 实现消息队列
- 支持消息持久化
- 支持自动生成全局唯一ID
- 支持ack确认消息的模式
- 支持消费组模式
消息队列相关命令
命令 | 功能 |
---|---|
XADD key [NOMKSTREAM] [<MAXLEN | MINID> [= | ~] threshold [LIMIT count]] <* | id> field value [field value ...] | 在队列尾部插入一条消息,消息的内容为Hash多键值对属性,使用*作为id (主键),则会根据算法自动生成一个id |
XRANGE key start end [COUNT count] | 升序遍历队列中count 条消息,start 和end 为- (最小)和+ (最大)时,遍历所有消息 |
XREVRANGE key end start [COUNT count] | 降序遍历队列中count 条消息,start 和end 为- (最小)和+ (最大)时,遍历所有消息 |
XDEL key id [id ...] | 根据主键删除消息 |
XLEN key | 获取队列中消息的个数 |
XTRIM key <MAXLEN | MINID> [= | ~] threshold [LIMIT count] | 使用maxlen 参数,则为保留最新的count 条参数,使用minid 参数,删除掉低于id 的所有条目(删除比他老的) |
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...] | 当不使用BLOCK 时,使用非阻塞模式,id 的值可以为三种:主键值、0-0 和$ ,表示从id 开始读取count 条数据。 |
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...] | 当使用BLOCK 时,使用阻塞模式,id 的值使用$ ,则监听消息队列的新消息产生 |
$代表最新消息,最大值;0-0代表着最初消息,id最小值
消费者组相关命令
Stream消息队列中的消息一旦被消费组里的一个消费者读取过了,同组内的其他消费者就不能再读取这个消息了
但是,这条消息仍然可以被其他消费组的消费者读取
消费组的设定,是为了实现负载均衡
一个消费者读过,其他人就不能读取,每人读一点,不会出现重复读取数据的问题,又能把任务分发到众多消费者身上
命令 | 功能 |
---|---|
XGROUP CREATE key group <id | $> [MKSTREAM] [ENTRIESREAD entries-read] | 用于创建消费者组,指定id 为0 表示从头开始消费,指定id 为$ 表示从尾部开始消费(消费新消息) |
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...] | 让消费组中的消费者读取消息队列里面的信息id 为> 时,意味读取指针指向的当前消息 |
XPENDING key group [[IDLE min-idle-time] start end count [consumer]] | 查询消费组中已读取但未确认的消息,通过consumer 参数可以获得具体消费者读取的具体消息 |
XACK key group id [id ...] | 确认具体消息 |
XINFO STREAM key [FULL [COUNT count]] | 返回有关流的信息 |
专业的事情专业的人来做,Redis就不是用来做消息中间件的,所以等到时候学MQ之后再用
BitField相关命令
没用,这玩意不用,跳过