Redis10大数据类型
数据类型是value的数据类型,key的类型都是字符串
常用命令
keys *:查看当前库所有key
exists key:判断某个key是否存在
type key:查看你的key是什么类型
del key:删除指定的key数据
unlink key:非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作ttl key:查看还有多少秒过期,-1表示永不过期,-2表示已过期
expire key 秒钟:为给定的key设置过期时间- Redis 的过期时间设置有四种形式:
- EXPIRE 秒——设置指定的过期时间(秒),表示的是时间间隔。
- PEXPIRE 毫秒——设置指定的过期时间,以毫秒为单位,表示的是时间间隔。
- EXPIREAT 时间戳-秒——设置指定的 Key 过期的 Unix 时间,单位为秒,表示的是时间/时刻。
- PEXPIREAT 时间戳-毫秒——设置指定的 Key 到期的 Unix 时间,以毫秒为单位,表示的是时间/时刻。
- Redis 的过期时间设置有四种形式:
move key dbindex [0-15]:将当前数据库的key移动到给定的数据库db当中- redis默认携带着16个数据库,默认使用0号数据库
select dbindex:切换数据库[0-15],默认为0
dbsize:查看当前数据库key的数量
flushdb:清空当前库
flushall:通杀全部库
字符串(String)
string是redis最基本的类型,一个key对应一个value。
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
最常用的命令
set key value
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:设置以秒为单位的UNIX时间戳所对应的时间为过期时间PXAT milliseconds-timestamp:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间NX:键不存在的时候设置键值XX:键存在的时候设置键值
KEEPTTL(重要):保留设置前指定键的生存时间
GET:返回指定键原本的值,若键不存在时返回nil
get key
同时设置/获取多个键值
MSET key value [key value ……]
MGET key [key ……]
mset/mget/msetnx
msetnx只有在全部键都不存在的情况下才会执行成功
获取指定区间范围内的值
getrange
setrange
数值增减
一定要是数字才能进行增减
递增数字(INCR key)
增加指定的整数(INCRBY key increment)
递减数值(DECR key)
减少指定的整数(DECRBY key increment)
获取字符串长度和内容追加
STRLEN key
APPEND key value
分布式锁
setex(相当于set+expire)
设置键值对的过期时间
setnx
当键不存在的时候才会创建成功
getset(先get再set)
应用场景
文章点赞、点赞某个商品等情况均可使用INCR key
列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双端链表,最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
常用命令
lpush/rpush/lrange
从左边进
从右边进
遍历的时候两个顺序有所不同
没有rrange,只有lrange
lpop/rpop
lpop:从左边弹出
rpop:从右边弹出
lindex
按照索引下标获得元素(从上到下)
llen
获取列表中元素个数
lrem key 数字N v1
删除N个 值等于v1的元素
删除了list3里面3个值等于v2的元素
ltrim key 开始index 结束index
截取指定范围的值后再赋值给key
截取5~9号元素赋值给list3(从0开始算)
rpoplpush 源列表 目标列表
将list1中的元素弹出,并弹入给list2中
list1中的元素从最后一个元素开始弹出
lset key index value
将列表中index位置的值改成value
将3号索引位置的值改成”Java”
linsert key before/after 已有值 插入的新值
在”Java”前插入”PHP”
在”Java”后插入”Mysql”
哈希表(Hash)
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)
仍然还是KV键值对的模式,但是value用来存放一对键值对
常用命令
hset/hget/hmset/hmget/hgetall/hdel
hset:
hget:
hmset和hset一致
hmget:可以一次性获取键值对中map里多个键对应的值
hgetall:遍历map所有键和值
hdel:删除键值对
找到age并且把age对应的值也一并删除了
hlen
获取某个key内的全部数量
user:001里面只剩下id和name
hexists key 在key里面的某个值的key
在user:001这个key里面有name和id两个key,没有score这个key
hkeys/hvals
hkeys:获取当前key下的所有key
hvals:获取当前key下的所有key对应的value值
hincrby/hincrbyfloat
hincrby:让某个值以整数形式自增
hincrbyfloat:让某个值以浮点数形式自增
hsetnx
若没有则赋值,若有则无效
集合(Set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是 intset 或者 hashtable。
Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)
单值多value且无重复
常用命令
SADD key member [member …]
添加元素
由于set的性质不能在集合中插入重复的元素,所以只有五个元素被插入进集合中
SMEMBERS key
遍历集合中的所有元素
SISMEMBER key member
判断元素是否在集合中
SREM key member [member …]
删除元素
scard
获取集合里面的元素个数
SRANDMEMBER key [数字]
从集合中随机展现设置的数字个数元素,元素不删除
SPOP key [数字]
从集合中随机弹出一个元素,弹出一个删一个
smove key1 key2 在key1里已存在的某个值
将key1里已存在的某个值赋给key2
set1中只有1 2 5 三个元素,set2中只有3 4 6三个元素
把set1中的2移给set2,此时的set1
集合运算
差集
属于集合A但不属于集合B的元素构成的集合
SDIFF key [key ...]
并集
属于集合A或者属于集合B合并后的元素
SUNION key [key ...]
交集
属于集合A也属于集合B共同拥有的元素构成的集合
SINTER key [key ...]
SINTERCARD numkeys key [key ...] [LIMIT limit]
numkeys:有多少个key
SINTERCARD 2 seta setb:有2个key
seta和setb两个集合的交集元素有3个
交集元素有三个但是只让他显示一条
应用场景
- 抽奖
- 微信朋友圈点赞查看同赞朋友
- QQ可能认识的人
有序集合(ZSet)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1
zset在set的基础上,每个val值前加一个score分数值,之前set是k1 v1 v2 v3,现在zset是k1 score1 v1 score2 v2。
常用命令
向有序集合中加入一个元素和该元素的分数
ZADD key score member [score member …]
添加元素
ZRANGE key start stop [WITHSCORES]
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素
ZREVRANGE key start stop [WITHSCORES]
按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
获取指定分数范围
withscore:显示每对键值对的分数(:不包含limit:返回限制,limit 开始下标步 多少步
显示60~90(包含60和90)分的元素
显示60~90(不包含60)的元素
显示大于60小于90的元素(60和90都取不到)
加上limit,要求一次显示多少条(有点像分页查询)
ZSCORE key member
获取元素的分数
ZCARD key
获取集合中元素的数量
ZREM key 某score下对应的value值
删除元素
删除了”v6”和”v5”
ZINCRBY key increment member
增加某个元素的分数
ZCOUNT key min max
获取指定分数范围内的元素个数
ZMPOP
从键名列表中的第一个非空排序集中弹出一个或多个元素,他们的成员是分数对
按key的输入顺序从左到右选择第一个非空的有序集合删除并返回元素,numkeys为输入的key数量,必须要等于输入key数,否则会报错,参数为min则从最小开始,参数为max则从最大的开始,count为弹出元素的最大数量,默认是1
ZRANK key values
获得下标值
ZREVRANK key values
逆序获得下标值
应用场景
位图(bitmap)
用在哪?
说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型,位图的本质是数组,它是基于String数据类型的按位的操作。该数组有多个二进制位组成,每个二进制位都对应一个偏移量(就是索引)。
Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32 = 4294967296)
常用命令
setbit key offset value
setbit 键 偏移位 只能0或1
Bitmap的偏移量是从0开始算的
getbit
strlen
统计字节数占用多少
不是统计字符串长度,而是占据几个字节,超过8位后自己按照8位一组一byte再扩容
07 815
你看,扩容了
bitcount key [start end]
全部键里面含有1的有多少个
bitmap是按八个为一组算的,bitcount算的是byte为单位,所以不像setbit和getbit一样可以定位到bit
如上,01是八个一组,12是八个一组
bitop
- operation:
- and:交集
- or:并集
- not
- xor
- destkey:将生成的结果集要存放的key
用来判断连续几天签到的用户有多少
比如先创建两个用户
0号和1号用户都存进uid:map里面
0、1、2、3号用户在20231029这天都签到了
0、1号用户在20231030这天签到了
求连续两天签到的用户有多少个(把两个表相交的用户存进新的表k3中)
setbit和getbit的案例说明
基数统计(HyperLogLog)
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
常用命令
PFADD key element [element …]
添加指定元素到HyperLogLog中
PFCOUNT key [key …]
返回给定HyperLogLog的基数估算值(去重)
PFMERGE destkey sourcekey [sourcekey …]
将多个HyperLogLog合并为一个HyperLogLog
地理空间(GEO)
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括:
添加地理位置的坐标。
获取地理位置的坐标。
计算两个位置之间的距离。
根据用户给定的经纬度坐标来获取指定范围内的地理位置集合
获取某个地址的经纬度:
常用命令
GEOADD key longitude latitude member [longitude latitude member …]
多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的key中
解决中文乱码问题
GEOPOS key member [member …]
从键里面返回所有给定元素的位置(经度和纬度)
GEODIST key member1 member2 [m|km|ft|mi]
返回两个给定位置之间的距离
- m:米
- km:千米
- ft:英尺
- mi:英里
不加双引号也可以
GEORADIUS
以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素
- WITHDIST:返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致
- WITHCOORD:将位置元素的经度和纬度也一并返回
- WITHHASH:以52位有符号整数的形式(Integer),返回位置元素经过元素geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,史记中的作用不大
- COUNT:限定返回的记录数
GEORADIUSBYMEMBER
跟GEORADIUS类似
直接输入名字判断在其周围范围内的坐标
GEOHASH key member [member …]
返回一个或多个位置元素的Geohash表示
流(Stream)
Redis Stream 是 Redis 5.0 版本新增加的数据结构。
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失
在redis5.0之前
- 使用List实现消息队列
- pub/sub
Stream:Redis版本的MQ消息中间件 + 阻塞队列
实现消息队列,Stream支持消息的持久化、支持自动生成全局唯一ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加稳定和可靠
底层结构及原理说明
队列相关命令
XADD
添加消息到队列末尾
- 消息ID必须要比上一个消息ID大(是消息ID,不是id值)
- 消息ID默认用星号表示自动生成规矩
XRANGE
获取消息队列(可以指定范围),忽略删除的消息
可以在后面加上count限制显示多少条数据
XREVRANGE
和XRANGE相比区别在于反向获取,ID从大到小
XDEL
删除消息
删除messageID=”1698850723494-0”的数据
XTRIM
限制Stream的长度,如果已经超长会进行截取
MAXLEN:允许的最大长度,对Stream流进行修剪限制长度
MINID:允许的最小id,从某个id值开始比该id值小的将会被抛弃

XLEN
获取Stream中的消息长度
XREAD
获取消息(阻塞/非阻塞),返回大于指定ID的消息
COUNT:最多读取多少条消息
BLOCK:是否以阻塞的方式读取消息,默认不阻塞,如果milliseconds设置为0,表示永远阻塞
非阻塞:
- $代表特殊ID,表示以当前Stream已经存的最大ID作为最后一个ID,当前Stream中不存在大于当前最大ID的消息,因此返回nil
- 0-0代表从最小的ID开始获取Stream中的消息,当不指定count,将会返回Stream中的所有消息,注意也可以使用0(00/000也都是可以的)
阻塞:
新建客户端,在新的客户端中往mystream中添加消息
此时原来的客户端就会接收到,并且变成非阻塞状态

总结:
消费组相关指令
XGROUP CREATE
- $:表示从流的尾部开始消费
- 0:表示从流的头部开始消费
创建消费者组的时候必须指定ID,ID为0表示从头开始消费,为$表示只消费新的消息,队尾是新来的
XREADGROUP GROUP
“>”:表示从第一条尚未被消费的信息开始读取
消费组groupA内的消费者consumer1从mystream消息队列中读取所有消息
stream中的消息一旦被消费组里的一个消费者读取了,就不能再被该消费组内的其他消费者读取了,即同一个消费组里的消费者不能消费同一条信息,刚才的xreadgroup命令再执行一次,此时读到的就会是空值(nil)
不同消费组的消费者可以消费同一条消息
因为是groupB组的,所以能读取
消费组的目的在于:
- 让组内的多个消费者共同分担读取消息,所以,通常会让每个消费者读取部分消息,从而实现消息读取负载在多个消费者间是均衡分布的。

XPENDING
查询每个消费组内所有消费者已读取但未确认的消息
查看某个消费者具体读取了哪些数据

XACK
向队列确认消息处理已经完成
已经确认过的消息会被删除,不会出现在队列里
XINFO GEOUPS
查询消费者组的信息
XINFO STREAM
查询消息队列的信息
XINFO CONSUMERS
查询消费者组里消费者的信息
XGROUP SETID
设置消费者组最后递送消息的ID
XGROUP DELCONSUMER
删除消费者组
XCLAIM
转移消息的归属权(将长期未处理/无法处理的消息转交给其他消费者组进行处理)
四个特殊符号
- +
最小和最大可能出现的ID
$
表示只消费新的消息,当前流中最大的ID,可用于将要到来的消息
>
用于XREADGROUP命令,表示迄今还没有发送给组中使用者信息,会更新消费者组的最后ID
*
用于XADD命令,让系统自动生成ID