查看官网;Understand Redis data types | Redis
redis是一个高性能的Key-Value数据库。
redis的key一般都是字符串类型,
而redis的value的基本数据类型有10种,分别为:
- 字符串 (String)
- 列表(List)
- 哈希表(Hash)
- 集合 (Set)
- 有序集合(ZSet)
- 地理空间(GEO)
- 基数统计(HyperLogLog)
- 位图 (bitmap)
- 位域(bitfield)
- 流(Stream)
注意:
redis有16个数据库,序号为0-15,默认在0号数据库。
通过更改配置文件如redis.conf可以修改

在help @后接数据类型可以查看帮助信息
help @string

1.key
redis是一个高性能的Key-Value数据库。redis的key一般都是字符串类型。
注意:
命令不区分大小写,但是key区分,所以K1与k1就不是同一个key。
查看当前库所有的key
keys *

判断某个key是否存在,存在返回1
exists key [key ...]

查看你的key是什么类型
type key

删除指定的key数据
del key [key ...]

非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。为了解决如果key过大,使用del会一直阻塞。
unlink key [key ...]

查看还有多少秒过期,-1表示永不过期,-2表示已过期
ttl key

为给定的key设置过期时间
expire key seconds [NX|XX|GT|LT]

切换数据库【0-15】,默认为0
select index

将当前数据库的 key移动到给定的数据库 db 当中
move key db

查看当前数据库key的数量
dbsize

清空当前库
flushdb
通杀全部库
flushall
2.字符串(String)
string是redis最基本的类型,一个redis中字符串value最大是512M。
string类型是二进制安全的,即可以包含序列化的对象。
1.设置key值
设置key以保存字符串值。如果key已经保存了一个值,则不管其类型如何,它都将被覆盖。
set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
大致参数如下:
- EX seconds ——设置指定的过期时间,以秒为单位。
- PX milliseconds ——设置指定的过期时间,以毫秒为单位。
- EXAT timestamp-seconds——设置密钥到期的指定Unix时间,以秒为单位。
- PXAT timestamp-milliseconds ——设置密钥到期的指定Unix时间,以毫秒为单位。
- NX——仅在密钥不存在时设置该密钥。
- XX——只设置已经存在的键。
- KEEPTTL——保留与键相关联的生存时间。
- GET ——返回存储在key处的旧字符串,如果key不存在则返回nil。如果存储在key处的值不是字符串,则返回错误并终止SET。
举例:
set k1 v1 nx

返回新的值,然后覆盖(等同于getset k1 v1test)
set k1 v1test get

10秒过期
set k1 v1 ex 10

当set同一个key值,不仅会覆盖值,还会覆盖过期时间,如果要保留原来过期时间,需要加上KEEPTTL参数
set k1 new keepttl


如果同时设置多个键值,使用MSET
mset k1 v1 k2 v2 k3 v3

如果不存在才设置,使用MSETNX,注意如果设置多个,其中存在已有的,则全部都执行不成功。
msetnx key value [key value ...]

2.获取指定key值get
获取指定key值
get key

如果同时获取多个键值,使用MGET
mget k1 k2 k3

3.操作指定区间内的值
获取字符串指定下标的值,0到-1指代全部
getrange key start end

设置字符串指定下标的值,0到-1指代全部
setrange key offset value

4.操控数字
递增
incr key

incrby key increment

递减数值
decr key

减少指定数字
decrby key decrement

5.获取字符串长度和内容添加
获取字符串长度
strlen key

内容添加到末尾
append key value

3.列表(List)
列表就是字符串列表,按照插入顺序排序。它的底层是个双端链表,
最多可以包含2^32-1个元素
添加元素到list,lpush表示从左边添加,rpush表示从右边添加
lpush key element [element ...]
rpush key element [element ...]

从左边开始遍历
lrange key start stop

弹出列表一个元素,lpop从左边弹出,rpop从右边弹出
lpop key [count]
rpop key [count]

按照索引获取列表中的元素
lindex key index

获取列表元素个数
llen key

从左边删除count个指定元素
lrem key count element

截取指定范围内的key的值然后再覆盖给key
ltrim key start stop

从一个列表弹出到另一个列表
rpoplpush source destination

从左边替换掉指定索引的值
lset key index element

在指定元素前或后插入元素
linsert key BEFORE|AFTER pivot element

4.哈希表(Hash)
hash是一个string类型的field (字段)和value(值)的映射表, 适合用于存储对象。
也就是一个key对应一个field (字段)和value(值)的映射。相当于java的Map<String,Map<Object,Object>>
Redis中每个hash最多可以存储2^32-1键值对。
存储Hash
hset key field value [field value ...]

获取hash指定key的filed对应的value值
hget key field

与hset区别不大
hmset key field value [field value ...]

可以直接一次性获取全部field对应的value
hmget key field [field ...]

获取hash指定key全部包括field和value
hgetall key

删除指定field
hdel key field [field ...]

查看hash对应key有多少field
hlen key

查看是否存在指定field
hexists key field

列出指定key对应全部field
hkeys key

列出指定key对应全部field的全部value
hvals key

对指定filed的value值增加指定increment
hincrby key field increment

对指定filed的value值增加指定increment,增加浮点数
hincrbyfloat key field increment

不存在赋值,存在不操作
hsetnx key field value

5.集合 (Set)
Set是String类型的无序集合。不能出现重复的数据
Set集合是通过哈希表实现的
集合中最大的成员数为2^32-1
添加元素,不能出现重复的数据,重复添加,自动去重
sadd key member [member ...]

遍历元素
smembers key

判断是否存在某个元素
sismember key member

删除元素
srem key member [member ...]

统计set内元素
scard key

从set中随机显示count个元素
srandmember key [count]

从set中随机弹出count个元素
spop key [count]

将指定元素从一个set移动到另一个set
smove source destination member

返回只属于A集合不属于B集合的集合
sdiff key [key ...]

返回属于A集合或属于B集合的集合
sunion key [key ...]

返回属于A集合且属于B集合的集合
sinter key [key ...]

返回属于A集合且属于B集合的集合,number表示多少个集合,limit表示显示多少个
sintercard numkeys key [key ...] [LIMIT limit]

6.有序集合(ZSet)
有序集合(sorted set)也是string类型元素的集合,且不允许重复的成员.
每个元素都会关联一个double类型的score分数, 通过分数来排序,分数可以重复。
zset集合是通过哈希表实现的
集合中最大的成员数为 2^32 – 1
添加,score是分数,member是元素
zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]

遍历,注意是按分数遍历,从小到大。start和stop就是索引。
zrange key start stop [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]

修改一下分数,可以看到按分数遍历

加上withscores参数可带上分数输出
zrange zset1 0 -1 withscores

反向遍历
zrevrange key start stop [WITHSCORES]

一定分数范围内的遍历,加入“(”表示包不包括。limit表示从offset开始显示count个。
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]

获取元素分数
zscore key member

获取集合中元素个数
zcard key

删除指定集合中指定元素
zrem key member [member ...]

给指定元素增加分数
zincrby key increment member

获取指定分数范围内元素个数
zcount key min max

从键名列表中的第一个非空排序集中弹出一个或多个元素,numkeys表示操作几个集合,min|max选择弹出最大还是最小。COUNT count选择弹出几个
zmpop numkeys key [key ...] MIN|MAX [COUNT count]

获取集合中元素指定下标
zrank key member

逆序获取集合中元素指定下标
zrevrank key member

7.地理空间(GEO)
主要用于存储地理位置信息,并对存储的信息进行操作。
操作地理位置的坐标。
底层使用zset.
添加经纬度到key中,longitude是经度、latitude是纬度、member是位置名称,添加到指定的key中
geoadd key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]
如:
GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城"
从键里面返回所有给定位置元素的位置(经度和纬度)
geopos key member [member ...]


因为底层使用zset,所以同样可以遍历
zrange city 0 -1
如果乱码使用此命令重新登录
redis-cli -a 123456 --raw

返回坐标hash表示
geohash key member [member ...]

返回两个位置的距离
geodist key member1 member2 [M|KM|FT|MI]
如:
geodist city 天安门 故宫 km

以半径为中心,查找附近的位置,radius表示附近多少距离
GEORADIUS key longitude latitude radius <M | KM | FT | MI> [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key | STOREDIST key]
- WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
- WITHCOORD: 将位置元素的经度和维度也一并返回。
- WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大
- COUNT 限定返回的记录数。
如:
georadius city 116.418017 39.914402 10 km withdist withcoord count 10 withhash desc

该命令与GEORADIUS完全相同,唯一的区别是,它不使用经纬度值作为要查询的区域的中心,而是使用已存在于由排序集表示的地理空间索引中的成员的名称。
GEORADIUSBYMEMBER key member radius <M | KM | FT | MI> [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key | STOREDIST key]
如
georadiusbymember city 天安门 10 km withdist withcoord count 10 withhash

8.基数统计(HyperLogLog)
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
基数统计就是用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算。
比如业务上一般用来统计流量,ip重复默认为一个用户。可以用来去重ip
添加
pfadd key [element [element ...]]

计算数量
pfcount key [key ...]

合并
pfmerge destkey sourcekey [sourcekey ...]

注意,底层依旧使用string

而且也无法获取

9.位图 (bitmap)
由0和1状态表现的二进制位的bit数组,一般使用0和1来判断Y/N状态,支持的最大位数是2^32位。实际一般用来实现签到功能。
位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(也就是索引)。
存储,offset是索引从0开始,value只能是0或1
setbit key offset value

可见,底层还是String
type bit1

获取对应索引对应的值
getbit key offset

统计占用多少字节,不是字符串长度而是占据几个字节,超过8位后自己按照8位一组一byte再扩容,每8位占据一个字节,如0-7,8-15。
strlen key

全部键里面含有1的数量
bitcount key [start end [BYTE|BIT]]

对不同的二进制存储数据进行位运算(operation 可选AND、OR、NOT、XOR)
bitop operation destkey key [key ...]
如:
bitop and day day1 day2

10.位域(bitfield)
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
将一个Redis字符串看作是一个由二进制位组成的数组并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
当需要一个整型时,有符号整型需在位数前加i,无符号在位数前加。例如, u8是一个8位的无符号整型, i16是一个16位的有符号整型。
BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
存储一个hello,通过bitfield获取,返回104,正是h的字节码,101正是e的字节码
bitfield bitfield1 get i8 0

设置一个值,120就是x的字节码
bitfield bitfield1 set i8 8 120

增加,121就是y的字节码
bitfield bitfield1 incrby i8 8 1

11.流(Stream)
主要用于消息队列(MQ,Message Queue),提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的ID和对应的内容
队列组
向Stream队列中添加消息,如果指定的Stream队列不存在,则该命令执行时会新建一个Stream队列,*表示自动生成消息id
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]
如:
1700370873253-0就是消息id

不用*号,可以自定义消息id,消息ID必须要比个ID大

用于获取指定范围内的消息列表
start表示开始值,-代表最小值end 表示结束值,+代表最大值,count 表示最多获取多少个值
xrange key start end [COUNT count]

获取消息列表元素的方向与xrange相反的,end在前,start在后
xrevrange key end start [COUNT count]

按时间戳id删除
xdel key id [id ...]

获取长度
xlen key

用于对Stream的长度进行截取,如超长会进行截取
MAXLEN允许的最大长度,对流进行修剪限制长度;MINID允许的最小id,从某个id值开始比该id值小的将会被抛弃。
xtrim key MAXLEN|MINID [=|~] threshold [LIMIT count]



用于获取消息,只会返回大于指定ID的消息
- COUNT最多读取多少条消息,
- BLOCK是否已阻塞的方式读取消息,默认不阻塞,如果milliseconds设置为0,表示永远阻塞
- $代表特殊ID,表示以当前Stream已经存储的最大的ID作为最后一个ID,当前Stream中不存在大于当前最大ID的消息,因此此时返回nil0
- 0-0代表从最小的ID开始获取Stream中的消息,当不指定count,将会返回Stream中的所有消息,注意也可以使用0或00
xread [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]

阻塞监听


消费组
创建消费者组
创建消费者组的时候必须指定ID, ID为0表示从头开始消费,为$表示只消费新的消息
xgroup create key groupname id|$ [MKSTREAM] [ENTRIESREAD entries_read]

组内消费者消费
xreadgroup GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] id [id ...]

消费者2再去消费就为空了,stream中的消息一旦被消费组里的一个消费者读取了,就不能再被该消费组内的其他消费者读取了,即同一个消费组里的消费者不能消费同一条消息。

查看消费情况,查询每个消费组内所有消费者「已读取、但尚未确认」的消息,consumer即消费者名字,不加查询所有。
xpending key group [[IDLE min-idle-time] start end count [consumer]]


向消息队列确认消息处理已完成
xack key group id [id ...]

打印Stream/Consumer/Group的详细信息
xinfo stream key [FULL [COUNT count]]



