Redis-常用命令

Redis-常用命令

redis命令手册

Commands | Docs (redis.io)

Redis的命令也是不区分大小写的,但key是区分大小写的,例如k1K1是两个不同的键

使用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相关命令

1
2
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不存在,返回nil
  • EX seconds – 设置指定的到期时间,以秒为单位(正整数)(分布式锁能用到)
  • PX milliseconds – 设置指定的过期时间,以毫秒为单位(正整数)
  • EXAT timestamp-seconds – 设置key过期的指定 Unix 时间,以秒为单位(正整数)
  • PXAT timestamp-milliseconds – 设置key过期的指定 Unix 时间,以毫秒为单位(正整数)
  • KEEPTTL– 修改时,保留与key关联的生存时间
  • GET– 返回存储在 key 中的旧字符串,如果 key 不存在,则返回 nil。如果存储在 key 的值不是字符串,则返回并中止错误
UNIX时间戳
1
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中stratstop的元素,其余元素删除
RPOPLPUSH source destinatin 删除source的尾部元素,将此元素添加到destination的头部
LSET key index element 修改元素
LINSERT key <BEFORE | AFTER> pivot element 插入元素,pivot为被插入元素而不是index

尾部插入,正向遍历,就会得到正序的结果

很多命令的start参数可以为-1,从尾部开始操作


Hash相关命令

1
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 返回以分数minmax范围内的元素数量
ZMPOP numkeys key [key …] <MIN | MAX> [COUNT count] 从分数minmax弹出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则为当天的具体日期

1
2
SETBIT 20240707 0 1  # 2024年7月7日,0号用户签到
SETBIT 20240708 0 1 # 2024年7月8日,0号用户签到

将这两条BitMap进行与运算,即可获得这两天连续签到的用户

1
BITOP AND k1 20240707 20240708 # 将与运算的结果储存到k1
将用户作为key

我们将key设为用户,将偏移量设为日期,将value设置为是否签到

1
2
SETBIT xiaobai:202407 0 1 # 用户小白在六月份的第0天签到
SETBIT xiaobai:202407 1 1 # 用户小白在六月份的第1天签到

使用BITCOUNT命令对该用户的这一月份签到信息进行统计

1
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加密

坐标拾取器 | 高德地图API (amap.com)

命令 功能
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条消息,startend-(最小)和+(最大)时,遍历所有消息
XREVRANGE key end start [COUNT count] 降序遍历队列中count条消息,startend-(最小)和+(最大)时,遍历所有消息
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] 用于创建消费者组,指定id0表示从头开始消费,指定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相关命令

没用,这玩意不用,跳过



Redis-常用命令
http://blog.170827.xyz/2024/07/07/Redis-常用命令/
作者
XIAOBAI
发布于
2024年7月7日
许可协议