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相关命令
1 | |
NX– 仅设置尚不存在的key,当key已存在,返回nil**(分布式锁能用到)**XX– 仅设置已存在的key,当key不存在,返回nilEXseconds – 设置指定的到期时间,以秒为单位(正整数)(分布式锁能用到)PXmilliseconds – 设置指定的过期时间,以毫秒为单位(正整数)EXATtimestamp-seconds – 设置key过期的指定 Unix 时间,以秒为单位(正整数)PXATtimestamp-milliseconds – 设置key过期的指定 Unix 时间,以毫秒为单位(正整数)KEEPTTL– 修改时,保留与key关联的生存时间GET– 返回存储在 key 中的旧字符串,如果 key 不存在,则返回 nil。如果存储在 key 的值不是字符串,则返回并中止错误
UNIX时间戳
1 | |
| 命令 | 功能 |
|---|---|
| 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相关命令
1 | |
| 命令 | 功能 |
|---|---|
| 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则为当天的具体日期
1 | |
将这两条BitMap进行与运算,即可获得这两天连续签到的用户
1 | |
将用户作为key
我们将key设为用户,将偏移量设为日期,将value设置为是否签到
1 | |
使用BITCOUNT命令对该用户的这一月份签到信息进行统计
1 | |
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相关命令
没用,这玩意不用,跳过