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

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时间戳
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 valueset新值的同时返回老值(被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相关命令

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 membersource集合中的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则为当天的具体日期

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

坐标拾取器 | 高德地图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相关命令

没用,这玩意不用,跳过