数据类型一般指的是 value 的数据类型,key的类型一般都是字符串
一、总体概述
-
redis字符串(String)
string是redis 最基本的类型,一个key对应一个value,string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象
一个redis中字符串value最多可以是 512M
-
redis列表(List)
redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部或尾部,他的底层是双端链表,最多可以包含 2^32-1 (4294967295,每个列表40亿个元素)
-
redis哈希表( Hash)
redis hash是一个string类型的field(字段)和 value(值) 的映射表,特别适合用于存储对象
最多可以包含 2^32-1
也就是 键值对的中的值 value 也是个键值对
-
redis集合(Set)
redis的set是String类型的无序集合,集合成员是唯一的,不能出现重复的数据,集合对象的编码可以是 intset或 hashtable
Set集合是通过哈希表实现的,添加删除查找的复杂度都是 O(1)
集合中最大的成员数为2^32-1
-
redis有序集合(ZSet)
zset也叫 sort set 是有序集合
zset也是 string类型的元素集合,且不允许重复
不同的是每个元素都会在前面关联一个double类型的分数,redis正是通过分数对集合中的成员进行排序
zset中的成员是唯一的,但是分数可以重复
Set集合是通过哈希表实现的,添加删除查找的复杂度都是 O(1),集合中最大的成员数为2^32-1
-
redis地理空间(GEO)
经纬度
GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括添加和获取地理位置坐标,计算两个位置之间的距离。根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
-
redis基数统计(HyperLogLog)
HyperLogLog 是用来做基数统计的算法,优点是在输入元素的体积或数量非常大时,计算基数所需要的空间总是固定且是很小的
在Redis里面,每个HyperLogLog 键只需要花费12KB内存,就可以接近2^64 个不同元素的基数。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会存储输入元素本身,所以不能像集合那样返回输入的元素。
-
redis位图(bitmap)
由0和1 状态表现的二进制位的bit数组
-
redis位域(bitfield)
通过bitfield命令可以一次性操作多个比特位域(连续多个比特位),他会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果
-
redis流(Stream)
Stream是Redis5.0新增的数据结构
Stream主要用于消息队列(MQ),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但缺点是消息无法持久化,如果出现断网、Redis宕机,消息就会丢失。
所以发布订阅可以分发消息,但无法记录历史消息
而 Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能够记住每个客户端的访问位置,保证消息不丢失。
二、常用命令
常用命令网址:
-
https://redis.io/commands
-
https://www.redis.cn/commands.html
1. key操作命令
命令 | 作用 | 备注 |
---|---|---|
keys * | 查看当前库所有的 key | |
exists key | 判断某个key是否存在 | (1)如果判断一个key,存在返回1,不存在返回0 (2)判断多个key,返回的是存在的key的数量 |
type key | 查看key的类型 | |
del key | 删除指定的key | 删除成功返回1,否则返回0 |
unlink key | 非阻塞删除 | del是阻塞删除,如果删除失败就会形成阻塞队列, unlink 不会形成阻塞 |
expire key | 为给定的key设置过期时间 | 返回-1设置成功,返回0是失败 |
ttl key | 查看key还有多少秒过期 | 返回-1是永不过期,返回-2是已经过期,其他代表秒数 |
move key dbindex[0-15] | 将当前数据库的key移动到指定数据库 | 移动成功返回1 |
select dbindex | 切换数据库 | redis默认有16个数据库,默认使用0号库 |
dbsize | 查看当前数据库 key 的数量 | |
flushdb | 清空当前库 | |
flushall | 清空全部库 |
注:在redis配置文件redis.conf中,可以设置数据库的数量,databases
命令不区分大小写,但是Key区分大小写
help @string 查看有关于string类型的全部命令
2.string类型命令
-
get key 获取key对应的value
-
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds |EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
-
[NX | XX]
-
NX 是键不存在时设置值,如果存在还要设置,会返回 nil
-
XX 是键存在的时候设置值,会覆盖原来的值,如果键不存在,会返回nil
-
-
GET
-
返回指定键原本的值,并设置新值,如果键不存在返回 nil
-
-
[EX | PX | EXAT | PXAT | KEEPTTL]
-
EX 是以秒为单位设置过期时间
-
PX 是以毫秒为单位设置过期时间
-
EXAT 是设置以秒为单位的UNIX时间戳所对应的时间为过期时间
-
PXAT 是设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间
-
KEEPTLL 保留设置前指定键的生存时间。如果给一个键设置了过期时间,然后再次设置如果有该参数,那么之前设置的过期时间会保留,否则会覆盖
-
-
其他命令
-
mset key value [key value ...] 一次设置多个键值对
-
mget key [key....] 一次获取多个值
-
msetnx 一次设置多个不存在的key,如果这些key中有的存在有的不存在,那么也不会成功
-
getrange key index index
-
获取value的部分,如[k1 abcdefg] get k1 0 3 返回的是 abcd,如果get 0 -1 那么全部返回。
-
就像java中的截取字符串,只不过是前后都闭合
-
-
setrange key offset value
-
从 offset 开始,将值替换为 value
-
返回的是 新生成的value的长度
-
-
incr key 递增数字
-
incr key increment 增加指定的整数
-
-
decr key 递减
-
decr key increment 减少指定的整数
-
一定要是数字才能加减
-
strlen key 获取字符串的长度
-
append key value 向字符串追加字符
-
setnx ( 键不存在)/ setex(设置过期时间)
-
分布式锁
-
getset
-
先get 老值,再set新值,和 set key value get 一致
-
3.List类型命令
List是一个key多个value,底层是 一个双端列表的结构
-
lpush key value1 value2 value3
-
从左边开始向list中push值
-
-
rpush key value1 value2 value3
-
从右边开始向list中push值
-
-
lrange key start stop
-
从左边遍历list,如果list是 lpush,那么遍历出来是 value3 value2 value1.
如果list 是 rpush,那么遍历出来时 value1 value2 value3
-
全部遍历是 0 -1
-
-
lpop list count
-
把list的前count个元素弹出,头部元素,不指定数值只弹一个
-
-
rpop list count
-
把list的后count 个元素弹出,尾部元素,不指定数值只弹一个
-
-
lindex list index
-
通过元素下标获取元素,从上到下
-
-
llen list
-
获取列表中元素的个数
-
-
lrem list 数字n 给定值v1
-
删除list中 n个 等于 v1的值,如果list中v1的数量小于 n,那么v1就会全部删除
-
-
ltrim list 开始index 结束index
-
截取list中指定范围的值,并重新赋值给list,如果指定的index 超出范围,也会截取,就会形成空的list
-
-
rpoplpush 源list 目标list
-
从源list的尾部弹出元素,添加到目标list的头部
-
-
lset list index value
-
把list 的 第index个设置成value
-
-
linsert list before/after 已有值 新的值
-
把list中已有值前面或后面插入新的值
-
如果该list中有多个 已有值,那么插入新的值的时候,只在最前面的已有值前或后插入新值
-
4.Hash类型命令
set类型也是kv键值对,但是value也是一个kv键值对
-
hset key field value [field value]
-
在外层 field value作为值,在内层field 也是一个键
-
可以设置多个值
-
-
hget key field
-
获取key中field 的值
-
只能获取一个
-
-
hmset
-
和hset功能相同
-
-
hmget key field field field
-
获取key的多个field的值
-
-
hgetall key
-
获取key的全部,包括 field和 value
-
-
hdel key field
-
删除key中field及其值
-
-
hlen key
-
获取key中field 的数量
-
-
hexists key field
-
判断key中是否存在field,存在返回1,不存在返回0
-
-
hkeys key
-
获取key中全部的 field
-
-
hvals key
-
获取key中全部的value
-
-
hincrby key filed 数值
-
给key的field对应的值加上相应的值,只能是数字
-
-
hincrbyfloat key field 数值
-
给key的field对应的值加上相应的float值
-
-
hsetnx key field value
-
给key添加字段,如果不存在添加成功,存在则添加失败
-
5.Set类型命令
set集合和list一样是 单个 key 多个value,但是value是不重复的
-
sadd set1 member [member ......]
-
向set1 添加数据,如果添加的数据重复,会自动去重
-
-
smembers set1
-
遍历set1中全部元素
-
-
sismember set1 member
-
判断set1中是否有member,有返回1,没有返回0
-
-
srem set1 member [member.....]
-
删除set1中的元素member
-
-
scard set1
-
获取set1集合中元素的个数
-
-
srandmember set1 n
-
随机从set1中展示n个元素,但是不删除
-
-
spop set1 n
-
随机从set1 中弹出n个元素,会删除
-
-
smove set1 set2 member
-
从set1中拿出元素放入set2
-
集合运算
A:1、2、3、a、b
B:a、b、c、1、2
-
A - B
-
A和 B的差集运算
-
命令:sdiff set1 set2
-
-
A ∪ B
-
A 和B 的并集
-
命令:sunion set1 set2
-
-
A ∩ B
-
A和B的交集
-
sinter set1 set2
-
redis7新命令-A和B的交集的基数
-
sintercard numkeys set1 [set2] [limit number]
-
limit 限制显示的个数
-
-
6.zset类型命令
zset集合是在 set集合的基础上,给每个member添加了 一个score值,可以用来进行排序
-
zadd zset1 score member [score member.....]
-
向zset集合中添加元素,score代表分数值,如果score传的不是数字就会报错
-
-
zrange zset1 0 -1 (根据score的大小进行顺序排序)
-
展示zset1集合的元素,这里只展示member,不展示score
-
zrange zset1 0 -1 withscores 展示member和score
-
-
zrevrange zset1 0 -1 (倒序)
-
zrangebyscore zset1 min max [withscore] [limit offset count]
-
展示zset1中 score在 min 和max 之间的元素,大于等于min小于等于max
-
如果min 或max 前面有括号表示不包括当前值 ( 60 100 相当于大于60小于100
-
limit 限制显示的个数 limit 0 1 表示显示1个
-
-
zscore zset1 member
-
获取member的score
-
-
zcard zset1
-
获取对应集合的元素数量
-
-
zrem zset1 member
-
删除对应元素
-
-
zincrby zset1 数值a member
-
给member的分数加上相应的数值a
-
-
zcount zset1 start stop
-
查询分数在 start和stop之间的元素数量
-
-
zmpop numkey zset1 [min|max] [count]
-
弹出最小或最大的元素
-
redis7.0新命令
-
-
zrank zset1 member
-
获得member的下标
-
-
zrevrank zset1 member
-
逆序获得member的下标
-
使用场景:
根据商品的销售量进行排序,排行榜,直播打赏礼物排行
7.bitmap类型命令
bitmap由0和1 状态表现的二进制位的bit数组
一个0或1就是1位,8位=1字节,所以bitmap非常节约内存空间。
bitmap的底层还是String类型,本质是数组。
-
setbit key offset value
-
offset是指偏移位,也就是第几个,是从0开始的
-
value就是该偏移位对应的值,只能是0或1
-
-
getbit key offset
-
offset是指偏移位,获取该位置的bit值
-
没有设置就是0
-
-
strlen key
-
统计该key占用多少字节
-
8位是一个字节
-
-
bitcount key
-
统计该key中有多少个1
-
-
bitop [and | or | not | xor] destkey key1 key2
-
对key1 和 key2 进行 与或非 操作将结果存进destkey中
-
应用场景:打卡、签到、是否被点击过
8.HyperLogLog类型命令
HyperLogLog是去重统计功能的基数估计算法
在输入元素的数量和体积非常大时,存储元素的基数很小,每个HyperLogLog键只需要花费12KB内存
HyperLogLog只会进行基数统计,并不会存储元素本身
基数:去重复后的元素个数,比如访问某个网站的ip数量,去掉重复访问的ip,就是访问该网站的ip基数
有0.81%的误差
-
pfadd key element [element.....]
-
添加元素到HyperLogLog中
-
-
pfcount key
-
返回指定HyperLogLog的基数估算值
-
-
pfmerge destkey sourceKey [sourceKey ]
-
将多个HyperLogLog 合并成一个为destkey
-
应用场景:统计某个网站的UV,也就是用户的ip的基数。用户搜索网站关键词数量、用户搜索不同词条个数
9.GEO 类型命令
-
geoadd key 经纬度 member [经纬度 member]
-
添加经纬度信息
-
类似于 zset中的 zadd命令,经纬度就像zset中的score
-
-
geopos key member [member]
-
返回经纬度坐标
-
-
geohash key member
-
获取经纬度坐标的 hash值
-
-
geodist key member1 member2 单位
-
计算两个地点的距离
-
单位可选为 m km ft mi
-
-
georadius key 自己的经纬度 距离 withdist withcoord count 数量 withhash desc
-
查找距离给定位置 xxx 公里/米 的 位置元素
-
withdist 在返回位置元素的同时,将位置元素与给定位置的距离一并返回,单位和给定的一致
-
withcoord 将位置元素的经纬度也一并返回
-
withhash 返回位置元素的hash值
-
count 数量 指定返回位置元素的数量
-
-
georadiusbymember key member 距离 withdist withcoord count 数量 withhash desc
-
查找距离member xxx公里的位置元素
-
和上面相同,只不过经纬度坐标改成 zset中的member
-
10.Stream类型命令
Stream是Redis版的MQ消息中间件 + 阻塞队列
作用:实现消息队列,它支持消息的持久化,支持自动生成全局唯一id,支持ack确认消息的模式,支持消费组模式,让消息队列更加稳定可靠
底层结构:
-
Message Content:消息内容
-
Consumer group:消费组,通过XGROUP CREATE命令创建,同一个消费组可以有多个消费者
-
Last_delivered_id:游标,每个消费组都会有个游标,任意一个消费这读取了消息都会使游标往前移动
-
Consumer:消费者
-
Pending_ids:消费者会有一个状态变量,用于记录被当前消费已读但未ack的消息ID,如果客户端没有ack,这个变量里的消息id就会越来越多,一旦某个消息被ack它就开始减少,它用来确保客户端至少消费了消息一次,而不会在网络传输途中丢失没处理
队列命令:
-
xadd key *|id field value [field value.....]
-
用于向Stream队列中添加消息
-
*表示自动生成 MessageId(类似于mysql中主键自增长)
-
生成的消息id,由两部分组成,毫秒时间戳-该毫秒内产生的第1条消息
-
id必须是递增的
-
-
也可以自己指定id
127.0.0.1:6379> xadd stream1 * k1 v1 k3 v3 1724901480012-0
-
-
xrange key start end count
-
用于获取消息列表
-
start表示开始值,也就是消息id,-代表最小值
-
end表示结束值,也就是消息id,+代表最大值
-
count 表示指定 获取几个 值
xrange stream1 - + count 2
-
-
xrevrange 反转获取消息列表
-
xdel key 消息id
-
删除消息,可删除多个
-
-
xlen key
-
用于获取Stream 队列的消息长度
-
-
xtrim
-
对Stream的长度进行截取
-
xtrim key maxlen 长度n
-
截取的最大长度是n,也就是消息队列中的后n个
-
-
xtrim key minid 消息id
-
截取比消息id大的消息
-
-
-
xread
-
用于获取消息
-
xread [count 2] streams key $
-
非阻塞读取比当前最大id还要大的消息,count 是指定数量,streams是固定格式
-
-
xread [count 2] streams key 0-0
-
非阻塞读取从最小id开始的全部消息,也可以使用 0或000
-
-
xread [count 2] block 0 streams key $
-
阻塞读取比当前最大id还要大的消息
-
如果没有就一直阻塞,如果往里添加一个消息,就会阻塞结束,读取到该消息
-
-
消费组命令:
-
xgroup create 消息key group名字 $|0
-
$表示从Stream尾部开始消费
-
0表示从Stream头部开始消费
-
-
xreadgroup group group名字 消费者 [Count count] stream 消息key >
-
group名字中的消费者读取消息中的count条消息
-
">" 表示从第一条尚未被消费的消息开始读取
-
如果一个消费组中的消费者读取了全部的消息,那么该消费组中的其他消费者就没有消息可读了,因为游标已经移到了最后,但是其他消费组中的消费者依然可以读取消息
-
当消费者已经读取了队列中的消息,Streams会自动使用内部队列(Pending_list)留存消费组中每个消费者读取的消息保底措施,直到消费者使用 sack命令通知Stream消息已经处理完成
消费确认增加了消息的可靠性,一般在业务处理完成之后 ,需要执行xack命令确认消息已经被消费完成
-
xpending 消息key group名
-
查询每个消费组内所有消费者已读取但还未确认的消息
-
-
xpending 消息key group名 - + 10 customer
-
查询group名这个组里的customer 读了哪些消息
-
-
xack 消息key group名 消息id
-
确认一条被读取的消息
-
消息被确认后用 xpending 查看就没有了
-
-
xinfo stream 消息key
-
打印stream/Consumer/Group的详细信息
-
11.bitfield类型命令
bitfield是将一个Redis字符串看作是一个由二进制位组成的数组,并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
-
bitfield fieldkey get i8 0
-
返回从0 开始的8位
-
i表示有符号
-
-
bitfield fieldkey set i8 8 120
-
把第8位替换成 120
-
-
bitfield fieldkey incrby u4 2 1
-
u代表无符号
-
从第2位开始每次加1
-
最终会溢出
-
wrap:循环溢出
-
sat:下溢计算结果为最小整数值,上溢计算结果为最大整数值
-
fail:拒绝执行会溢出的计算