Redis7-2.0-十大数据类型


Redis10大数据类型

数据类型是value的数据类型,key的类型都是字符串

image-20231024213951213

常用命令

  • keys *:查看当前库所有key

    image-20231024221029566

  • exists key:判断某个key是否存在

    image-20231024221100601

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

    image-20231024221121886

  • del key:删除指定的key数据

    image-20231024221147761

  • unlink key:非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作

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

    image-20231024221219613

  • expire key 秒钟:为给定的key设置过期时间

    • Redis 的过期时间设置有四种形式:
      1. EXPIRE 秒——设置指定的过期时间(秒),表示的是时间间隔。
      2. PEXPIRE 毫秒——设置指定的过期时间,以毫秒为单位,表示的是时间间隔。
      3. EXPIREAT 时间戳-秒——设置指定的 Key 过期的 Unix 时间,单位为秒,表示的是时间/时刻。
      4. PEXPIREAT 时间戳-毫秒——设置指定的 Key 到期的 Unix 时间,以毫秒为单位,表示的是时间/时刻。

    image-20231024223228890

  • move key dbindex [0-15]:将当前数据库的key移动到给定的数据库db当中

    • redis默认携带着16个数据库,默认使用0号数据库

    image-20231024223504384

  • select dbindex:切换数据库[0-15],默认为0

    image-20231024223553397

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

    image-20231024223634020

  • flushdb:清空当前库

    image-20231024223705308

  • flushall:通杀全部库

    image-20231024223737668

字符串(String)

string是redis最基本的类型,一个key对应一个value。

string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。

string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M

image-20231028112706990

image-20231028112739153

最常用的命令

set key value

set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]

  • EX seconds:以秒为单位设置过期时间

    image-20231026230101867

  • PX milliseconds:以毫秒为单位设置过期时间

    image-20231026230209223

  • EXAT timestamp:设置以秒为单位的UNIX时间戳所对应的时间为过期时间

  • PXAT milliseconds-timestamp:设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间

  • NX:键不存在的时候设置键值

  • XX:键存在的时候设置键值

    image-20231026225730606

  • KEEPTTL(重要)保留设置前指定键的生存时间

    image-20231026230631576

  • GET:返回指定键原本的值,若键不存在时返回nil

    image-20231026225917226

get key

同时设置/获取多个键值

MSET key value [key value ……]

image-20231026231216551

MGET key [key ……]

image-20231026231234380

mset/mget/msetnx

msetnx只有在全部键都不存在的情况下才会执行成功

image-20231026231452451

获取指定区间范围内的值

getrange

image-20231026232015484

setrange

image-20231026232031029

数值增减

一定要是数字才能进行增减

递增数字(INCR key)

image-20231028110147135

增加指定的整数(INCRBY key increment)

image-20231028110322042

递减数值(DECR key)

image-20231028110337433

减少指定的整数(DECRBY key increment)

image-20231028110350473

获取字符串长度和内容追加

STRLEN key

image-20231028110837268

APPEND key value

image-20231028110848004

分布式锁

image-20231028111639555

setex(相当于set+expire)

设置键值对的过期时间

image-20231028111859429

setnx

当键不存在的时候才会创建成功

image-20231028111915443

getset(先get再set)

image-20231028112102913

应用场景

文章点赞、点赞某个商品等情况均可使用INCR key

列表(List)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

它的底层实际是个双端链表,最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)

image-20231028112604471

image-20231028112802727

image-20231028112822195

常用命令

lpush/rpush/lrange

从左边进

image-20231028113527125

从右边进

image-20231028113543717

遍历的时候两个顺序有所不同

image-20231028113610635

没有rrange,只有lrange

lpop/rpop

lpop:从左边弹出

image-20231028113806734

rpop:从右边弹出

image-20231028113846973

lindex

按照索引下标获得元素(从上到下)

image-20231028114649622

llen

获取列表中元素个数

image-20231028114719317

lrem key 数字N v1

删除N个 值等于v1的元素

image-20231028114921587

删除了list3里面3个值等于v2的元素

ltrim key 开始index 结束index

截取指定范围的值后再赋值给key

image-20231028115744232

截取5~9号元素赋值给list3(从0开始算)

image-20231028115819108

rpoplpush 源列表 目标列表

image-20231028151048798

将list1中的元素弹出,并弹入给list2中

list1中的元素从最后一个元素开始弹出

lset key index value

将列表中index位置的值改成value

image-20231028151659457

将3号索引位置的值改成”Java”

linsert key before/after 已有值 插入的新值

在”Java”前插入”PHP”

image-20231028151959451

在”Java”后插入”Mysql”

image-20231028152034892

哈希表(Hash)

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)

image-20231028152656920

仍然还是KV键值对的模式,但是value用来存放一对键值对

image-20231028153010474

常用命令

hset/hget/hmset/hmget/hgetall/hdel

hset:

image-20231028153435724

hget:

image-20231028153505778

hmset和hset一致

hmget:可以一次性获取键值对中map里多个键对应的值

image-20231028153930046

hgetall:遍历map所有键和值

image-20231028154242748

hdel:删除键值对

image-20231028154507785

找到age并且把age对应的值也一并删除了

hlen

获取某个key内的全部数量

image-20231028154700452

user:001里面只剩下id和name

hexists key 在key里面的某个值的key

image-20231028154904963

在user:001这个key里面有name和id两个key,没有score这个key

hkeys/hvals

hkeys:获取当前key下的所有key

image-20231028155035935

hvals:获取当前key下的所有key对应的value值

image-20231028155152041

hincrby/hincrbyfloat

hincrby:让某个值以整数形式自增

image-20231028155442902

hincrbyfloat:让某个值以浮点数形式自增

image-20231028155648274

hsetnx

若没有则赋值,若有则无效

image-20231028155810277

集合(Set)

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是 intset 或者 hashtable。

Redis 中Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)

image-20231028160255264

单值多value且无重复

常用命令

SADD key member [member …]

添加元素

image-20231028161653323

由于set的性质不能在集合中插入重复的元素,所以只有五个元素被插入进集合中

SMEMBERS key

遍历集合中的所有元素

image-20231028162512557

SISMEMBER key member

判断元素是否在集合中

image-20231028162526420

SREM key member [member …]

删除元素

image-20231028164925685

image-20231028162811721

scard

获取集合里面的元素个数

image-20231028162843430

SRANDMEMBER key [数字]

从集合中随机展现设置的数字个数元素,元素不删除

image-20231028162922640

SPOP key [数字]

从集合中随机弹出一个元素,弹出一个删一个

image-20231028163328829

smove key1 key2 在key1里已存在的某个值

将key1里已存在的某个值赋给key2

image-20231028163429005

set1中只有1 2 5 三个元素,set2中只有3 4 6三个元素

把set1中的2移给set2,此时的set1

image-20231028164216988

集合运算

差集

属于集合A但不属于集合B的元素构成的集合

SDIFF key [key ...]

image-20231028173433117

并集

属于集合A或者属于集合B合并后的元素

SUNION key [key ...]

image-20231028173531764

交集

属于集合A也属于集合B共同拥有的元素构成的集合

SINTER key [key ...]

image-20231028173641390

SINTERCARD numkeys key [key ...] [LIMIT limit]

numkeys:有多少个key

SINTERCARD 2 seta setb:有2个key

image-20231028174143775

seta和setb两个集合的交集元素有3个

交集元素有三个但是只让他显示一条

image-20231028174421598

应用场景

  • 抽奖

image-20231028174639836

  • 微信朋友圈点赞查看同赞朋友

image-20231028174910631

  • QQ可能认识的人

image-20231028175023418

有序集合(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。

image-20231028215212310

image-20231028215240393

常用命令

向有序集合中加入一个元素和该元素的分数

ZADD key score member [score member …]

添加元素

image-20231029105506583

ZRANGE key start stop [WITHSCORES]

按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素

image-20231029105532053

image-20231029105607518

ZREVRANGE key start stop [WITHSCORES]

按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素

image-20231029105810822

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

获取指定分数范围

  • withscore:显示每对键值对的分数
  • (:不包含
  • limit:返回限制,limit 开始下标步 多少步

显示60~90(包含60和90)分的元素

image-20231029110058452

显示60~90(不包含60)的元素

image-20231029110130626

显示大于60小于90的元素(60和90都取不到)

image-20231029110210779

加上limit,要求一次显示多少条(有点像分页查询)

image-20231029110320301

ZSCORE key member

获取元素的分数

image-20231029110419739

ZCARD key

获取集合中元素的数量

image-20231029110505866

ZREM key 某score下对应的value值

删除元素

image-20231029110607850 删除了”v6”和”v5”

ZINCRBY key increment member

增加某个元素的分数

image-20231029110752362

ZCOUNT key min max

获取指定分数范围内的元素个数

image-20231029111719270

ZMPOP

从键名列表中的第一个非空排序集中弹出一个或多个元素,他们的成员是分数对

image-20231029114418696

按key的输入顺序从左到右选择第一个非空的有序集合删除并返回元素,numkeys为输入的key数量,必须要等于输入key数,否则会报错,参数为min则从最小开始,参数为max则从最大的开始,count为弹出元素的最大数量,默认是1

image-20231029115854348

ZRANK key values

获得下标值

image-20231029120152326

ZREVRANK key values

逆序获得下标值

image-20231029120244520

应用场景

image-20231029105408000

位图(bitmap)

image-20231024215740300

用在哪?

image-20231029161820053

说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型,位图的本质是数组,它是基于String数据类型的按位的操作。该数组有多个二进制位组成,每个二进制位都对应一个偏移量(就是索引)。

Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2^32 = 4294967296)

image-20231029162555281

常用命令

setbit key offset value

setbit 键 偏移位 只能0或1

Bitmap的偏移量是从0开始算的

image-20231029165025330

image-20231029165245577

getbit

image-20231029165503402

strlen

统计字节数占用多少

image-20231029172503087

不是统计字符串长度,而是占据几个字节,超过8位后自己按照8位一组一byte再扩容

07 815

image-20231029172716876 你看,扩容了

bitcount key [start end]

全部键里面含有1的有多少个

image-20231029173411168

bitmap是按八个为一组算的,bitcount算的是byte为单位,所以不像setbit和getbit一样可以定位到bit

image-20231029220933100

如上,01是八个一组,12是八个一组

bitop

image-20231029174919198

  • operation:
    • and:交集
    • or:并集
    • not
    • xor
  • destkey:将生成的结果集要存放的key

用来判断连续几天签到的用户有多少

比如先创建两个用户

image-20231029174238991

0号和1号用户都存进uid:map里面

0、1、2、3号用户在20231029这天都签到了

0、1号用户在20231030这天签到了

image-20231029174544164

求连续两天签到的用户有多少个(把两个表相交的用户存进新的表k3中)

image-20231029174807195

setbit和getbit的案例说明

image-20231029221129350

基数统计(HyperLogLog)

HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

常用命令

PFADD key element [element …]

添加指定元素到HyperLogLog中

image-20231030154208283

PFCOUNT key [key …]

返回给定HyperLogLog的基数估算值(去重)

image-20231030154227639

PFMERGE destkey sourcekey [sourcekey …]

将多个HyperLogLog合并为一个HyperLogLog

image-20231030154252584

地理空间(GEO)

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,包括:

添加地理位置的坐标。

获取地理位置的坐标。

计算两个位置之间的距离。

根据用户给定的经纬度坐标来获取指定范围内的地理位置集合

image-20231031111832791

获取某个地址的经纬度:

https://lbs.qq.com/getPoint/

常用命令

GEOADD key longitude latitude member [longitude latitude member …]

多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的key中

image-20231031120157425

解决中文乱码问题

image-20231031120257838

GEOPOS key member [member …]

从键里面返回所有给定元素的位置(经度和纬度)

image-20231031120744276

image-20231031121030784

GEODIST key member1 member2 [m|km|ft|mi]

返回两个给定位置之间的距离

  • m:米
  • km:千米
  • ft:英尺
  • mi:英里

image-20231101084255354

不加双引号也可以

GEORADIUS

以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素

image-20231101084823466

  • WITHDIST:返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致
  • WITHCOORD:将位置元素的经度和纬度也一并返回
  • WITHHASH:以52位有符号整数的形式(Integer),返回位置元素经过元素geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,史记中的作用不大
  • COUNT:限定返回的记录数

image-20231101221705540

GEORADIUSBYMEMBER

跟GEORADIUS类似

直接输入名字判断在其周围范围内的坐标

image-20231101221946747

GEOHASH key member [member …]

返回一个或多个位置元素的Geohash表示

image-20231101220455404

流(Stream)

Redis Stream 是 Redis 5.0 版本新增加的数据结构。

Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。

而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失

在redis5.0之前

  • 使用List实现消息队列

image-20231101223005015

  • pub/sub

image-20231101223114642

Stream:Redis版本的MQ消息中间件 + 阻塞队列

实现消息队列,Stream支持消息的持久化、支持自动生成全局唯一ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加稳定和可靠

底层结构及原理说明

image-20231101224331260

队列相关命令

image-20231101224519811

XADD

添加消息到队列末尾

image-20231101230401836

image-20231101230517488

  • 消息ID必须要比上一个消息ID大(是消息ID,不是id值)
  • 消息ID默认用星号表示自动生成规矩

XRANGE

获取消息队列(可以指定范围),忽略删除的消息

image-20231102220121790

可以在后面加上count限制显示多少条数据

image-20231102220228109

XREVRANGE

和XRANGE相比区别在于反向获取,ID从大到小

image-20231102220647892

XDEL

删除消息

删除messageID=”1698850723494-0”的数据

image-20231102221043982

image-20231102234519698

XTRIM

限制Stream的长度,如果已经超长会进行截取

  • MAXLEN:允许的最大长度,对Stream流进行修剪限制长度

    image-20231102235454966

  • MINID:允许的最小id,从某个id值开始比该id值小的将会被抛弃

    image-20231102235649337

XLEN

获取Stream中的消息长度

image-20231102234633777

XREAD

获取消息(阻塞/非阻塞),返回大于指定ID的消息

image-20231105203501223

  • COUNT:最多读取多少条消息

  • BLOCK:是否以阻塞的方式读取消息,默认不阻塞,如果milliseconds设置为0,表示永远阻塞

  • 非阻塞:

    image-20231105215057785

    image-20231105215216538

    • $代表特殊ID,表示以当前Stream已经存的最大ID作为最后一个ID,当前Stream中不存在大于当前最大ID的消息,因此返回nil
    • 0-0代表从最小的ID开始获取Stream中的消息,当不指定count,将会返回Stream中的所有消息,注意也可以使用0(00/000也都是可以的)
  • 阻塞:

    image-20231105215743876

    新建客户端,在新的客户端中往mystream中添加消息

    image-20231106140417757

    此时原来的客户端就会接收到,并且变成非阻塞状态

    image-20231106140618729

总结:

image-20231106140743587

消费组相关指令

image-20231101224625822

XGROUP CREATE

image-20231106141300393

  • $:表示从流的尾部开始消费
  • 0:表示从流的头部开始消费

创建消费者组的时候必须指定ID,ID为0表示从头开始消费,为$表示只消费新的消息,队尾是新来的

XREADGROUP GROUP

  • “>”:表示从第一条尚未被消费的信息开始读取

  • 消费组groupA内的消费者consumer1从mystream消息队列中读取所有消息

    image-20231106170726061

    stream中的消息一旦被消费组里的一个消费者读取了,就不能再被该消费组内的其他消费者读取了,即同一个消费组里的消费者不能消费同一条信息,刚才的xreadgroup命令再执行一次,此时读到的就会是空值(nil)

    image-20231106171033766

  • 不同消费组的消费者可以消费同一条消息

    image-20231106191411026

    因为是groupB组的,所以能读取

  • 消费组的目的在于:

    • 让组内的多个消费者共同分担读取消息,所以,通常会让每个消费者读取部分消息,从而实现消息读取负载在多个消费者间是均衡分布的。

    image-20231106191755687

image-20231106192210197

XPENDING

  • 查询每个消费组内所有消费者已读取但未确认的消息

    image-20231106192927258

  • 查看某个消费者具体读取了哪些数据

    image-20231106193107455

XACK

向队列确认消息处理已经完成

image-20231106193547897

已经确认过的消息会被删除,不会出现在队列里

image-20231106193707008

XINFO GEOUPS

查询消费者组的信息

image-20231106194108138

XINFO STREAM

查询消息队列的信息

image-20231106194145429

XINFO CONSUMERS

查询消费者组里消费者的信息

image-20231106194206819

XGROUP SETID

设置消费者组最后递送消息的ID

image-20231106195447646

XGROUP DELCONSUMER

删除消费者组

image-20231106200047777

XCLAIM

转移消息的归属权(将长期未处理/无法处理的消息转交给其他消费者组进行处理)

四个特殊符号

- +

最小和最大可能出现的ID

$

表示只消费新的消息,当前流中最大的ID,可用于将要到来的消息

>

用于XREADGROUP命令,表示迄今还没有发送给组中使用者信息,会更新消费者组的最后ID

*

用于XADD命令,让系统自动生成ID


文章作者: Feliks
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Feliks !
评论
  目录