redis的数据类型有哪些,使用场景说说(redis数据类型及常用方法)

7个月前 (04-22)

今天给各位详细介绍关于“redis的数据类型有哪些,使用场景说说”的核心内容以及“redis数据类型及常用方法”的相关知识,希望对各位有所帮助。

    redis有5种基本数据结构,它们是String(string)、列表(list)、hash(字典)、set()和zset(有序),redis的所有数据结构都使用惟一的key字符串作为名称,接着,根据这个惟一的key值得到对应的值,不同的数据结构的差异就在于value的数据结构的差异

    字符串常用操作

  SET key value //存入字符串键值对

  MSET key value [key value ...] //批量存储字符串键值对

  SETNX key value //存入一个不存在的字符串键值对

  GET key //获取一个字符串键值

  MGET key [key ...] //批量获取字符串键值

  DEL key [key ...] //删除一个键

  EXPIRE key seconds //设置一个键的过期时间(秒)1234567代码类型:[java]

    原子加减

  INCR key //将key中储存的数字值加1

  DECR key //将key中储存的数字值减1

  INCRBY key increment //将key所储存的值加上increment

  DECRBY key decrement //将key所储存的值减去decrement1234代码类型:[java]

    单值缓存

  SET key value

  GET key

  SET user:1 value(json格式数据)

  MSET user:1:name A user:1:age 18

  MGET user:1:name user:1:age12345代码类型:[java]

    分布式锁

  SETNX product:10001 true //返回1代表获取锁成功

  SETNX product:10001 true //返回0代表获取锁失败

  ... //业务操作

  DEL product:10001 //执行完业务释放锁

  SET product:10001 true ex 10 nx //防止程序意外终止导致死锁12345代码类型:[java]

    计数器

  INCR article:readcount:{文章id}

  GET article:readcount:{文章id}12代码类型:[java]

    Web集群session共享

  spring session + redis实现session共享1代码类型:[java]

    分布式系统全局序列号

  INCRBY orderId 1000 //redis批量生成序列号性能1代码类型:[java]

    List常用操作

  LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边)

  RPUSH key value [value ...] //将一个或多个值value插入到key列表的表尾(最右边)

  LPOP key //移除并返回key列表的头元素

  RPOP key //移除并返回key列表的尾元素

  LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定

  BLPOP key [key ...] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

  BRPOP key [key ...] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞1234567代码类型:[java]

    常用数据结构

    Stack(栈) = LPUSH + LPOP

    Queue(队列)= LPUSH + RPOP

    Blocking MQ(阻塞队列)= LPUSH + BRPOP

    微博消息和微信公众号消息

  A关注了B,C

  1)B发微博,消息ID为10001

  LPUSH msg:{A-ID} 10001

  2)C发微博,消息ID为10002

  LPUSH msg:{A-ID} 10002

  3)A查看微博消息

  LRANGE msg:{A-ID} 0 41234567代码类型:[java]

    常用操作

  HSET key field value //存储一个哈希表key的键值

  HSETNX key field value //存储一个不存在的哈希表key的键值

  HMSET key field value [field value ...] //在一个哈希表key中存储多个键值对

  HGET key field //获取哈希表key对应的field键值

  HMGET key field [field ...] //批量获取哈希表key中多个field键值

  HDEL key field [field ...] //删除哈希表key中的field键值

  HLEN key //返回哈希表key中field的数量

  HGETALL key //返回哈希表key中所有的键值

  HINCRBY key field increment //为哈希表key中field键的值加上增量increment123456789代码类型:[java]

    对象缓存

  HMSET user {userId}:name A {userId}:age 18

  HMSET user 1:name A 1:age 18

  HMGET user 1:name 1:age123代码类型:[java]

    电商购物车

  //以用户id为key,商品id为field,商品数量为value

  //添加商品

  //cart代表购物车,1001代表用户id,cart:1001代表用户1001的购物车

  //10088代表他的购物车有一件id为10088的商品,1代表购物车的商品数量为1

  hset cart:1001 10088 1

  //增加数量

  hincrby cart:1001 10088 1

  //商品总数

  hlen cart:1001

  //删除商品

  hdel cart:1001 10088

  //获取购物车所有商品

  hgetall cart:100112345678910111213代码类型:[java]

    优点

    1)同类数据归类整储存,方便数据管理

    2)相比string操作消耗内存与cpu更小

    3)相比string储存更节省空间

    缺点

    1)过期功能不能使用在field上,只能用在key上

    2)Redis集群架构下不适大规模使用

    Set常用操作

  SADD key member [member ...] //往key中存入元素,元素存在则忽略,若key不存在则新建

  SREM key member [member ...] //从key中删除元素

  SMEMBERS key //获取key中所有元素

  SCARD key //获取key的元素个数

  SISMEMBER key member //判断member元素是否存在于key中

  SRANDMEMBER key [count] //从key中选出count个元素,元素不从key中删除

  SPOP key [count] //从key中选出count个元素,元素从key中删除1234567代码类型:[java]

    Set运算操作

  SINTER key [key ...] //交集运算

  SINTERSTORE destination key [key ..] //将交集结果存入新destination中

  SUNION key [key ..] //并集运算

  SUNIONSTORE destination key [key ...] //将并集结果存入新destination中

  SDIFF key [key ...] //差集运算

  SDIFFSTORE destination key [key ...] //将差集结果存入新destination中123456代码类型:[java]

    微信抽奖小程序

  1)点击参与抽奖加入

  SADD key {userlD}

  2)查看参与抽奖所有用户

  SMEMBERS key

  3)抽取count名中奖者

  SRANDMEMBER key [count] / SPOP key [count]123456代码类型:[java]

    微信微博点赞,收藏,标签

  1) 点赞

  SADD like:{消息ID} {用户ID}

  2) 取消点赞

  SREM like:{消息ID} {用户ID}

  3) 检查用户是否点过赞

  SISMEMBER like:{消息ID} {用户ID}

  4) 获取点赞的用户列表

  SMEMBERS like:{消息ID}

  5) 获取点赞用户数

  SCARD like:{消息ID}代码类型:[java]

    操作

  SINTER set1 set2 set3 //{ c }

  SUNION set1 set2 set3 //{ a,b,c,d,e }

  SDIFF set1 set2 set3 //{ a }123代码类型:[java]

    操作实现微博微信关注模型

  A关注的人: {B, C}

  SADD follow:A B C

  B关注的人:{A, C, E, F, G, H}

  SADD follow:B A C E F G H

  C关注的人: {I, G}

  SADD follow:C I G

  1)A和B共同关注: {C}

  SINTER follow:A follow:B

  2) 我关注的人也关注他(我关注的人里 关注 我关注的人(C) 的人):

  SISMEMBER follow:B C

  3) 我可能认识的人(关注我的人关注的人里,我没有关注的人):

  SDIFF follow:B follow:A

  1) "F"

  2) "E"

  3) "H"

  4) "A"

  5) "G"1234567891011121314151617代码类型:[java]

    操作实现电商商品筛选

  SADD brand:huawei P40

  SADD brand:xiaomi mi-10

  SADD brand:iPhone iphone12

  SADD os:android P40 mi-10

  SADD cpu:brand:intel P40 mi-10

  SADD ram:8G P40 mi-10 iphone12

  SINTER os:android cpu:brand:intel ram:8G

  结果:

  1) "P40"

  2) "mi-10"代码类型:[java]

    ZSet常用操作

  ZADD key score member [[score member]…] //往有序key中加入带分值元素

  ZREM key member [member …] //从有序key中删除元素

  ZSCORE key member //返回有序key中元素member的分值

  ZINCRBY key increment member //为有序key中元素member的分值加上increment

  ZCARD key //返回有序key中元素个数

  ZRANGE key start stop [WITHSCORES] //正序获取有序key从start下标到stop下标的元素

  ZREVRANGE key start stop [WITHSCORES] //倒序获取有序key从start下标到stop下标的元素1234567代码类型:[java]

    Zset操作

  ZUNIONSTORE destkey numkeys key [key ...] //并集计算

  ZINTERSTORE destkey numkeys key [key …] //交集计算12代码类型:[java]

    Zset操作实现排行榜

  1)点击新闻

  ZINCRBY hotNews:20210101 1

  2)展示当日排行前十

  ZREVRANGE hotNews:20210101 0 9 WITHSCORES

  3)七日搜索榜单计算

  ZUNIONSTORE hotNews:20210101-20210107 7

  hotNews:20210101 hotNews:20210102... hotNews:20210107

  4)展示七日排行前十

  ZREVRANGE hotNews:20210101-20210107 0 9 WITHSCORES123456789代码类型:[java]

    BitMap

    BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上底层也是通过对字符串的操作来实现。Redis 从 2.2 版本之后新增了setbit, getbit, bitcount 等几个 bitmap 相关令。虽然是新令,但是本身都是对字符串的操作,我们先来看看语法:

  SETBIT key offset value1代码类型:[java]

    其中 offset 必须是数字,value 只能是 0 或者 1.offset参数要求大于或等于 0.并且小于 2^32(4.294.967.296),这将位图限制在 512MB

    设置一个可能的位时(偏移量等于 2^32-1)和存储在键中的字符串值尚不保存字符串值,或持有一个小字符串值,Redis 需要分配所有中间内存,这些中间内存可能会阻塞服务器一段时间。在 2010 年 Macbook Pro 上,设置位号 2^32-1 (512MB 分配) 需要 300 毫秒,设置位数 2^30-1 (128MB 分配) 需要 80 毫秒,设置位数 2^28-1 (32MB 分配) 需要 30 毫秒并设置位号 2^26-1 (8MB 分配) 需要 ±8 毫秒。请注意,完成次分配后,对同一key的 SETBIT的后续调用将不具有分配开销。

  127.0.0.1:6379> setbit k1 5 1

  (integer) 0

  127.0.0.1:6379> getbit k1 5 1

  (integer) 1

  127.0.0.1:6379> getbit k1 4 0

  (integer) 0

  127.0.0.1:6379> bitcount k1

  (integer) 1

  127.0.0.1:6379> setbit k1 3 1

  (integer) 0

  127.0.0.1:6379> bitcount k1

  (integer) 2

  127.0.0.1:6379> setbit "200522:active" 67 1

  (integer) 0

  127.0.0.1:6379> setbit "200522:active" 78 1

  (integer) 0123456789101代码类型:[java]

    其中 offset 必须是数字,value 只能是 0 或者 1.通过 bitcount可以很快速的统计,比传统的关系型数据库效率高很多

  //对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上

  BITOP operation destkey key [key ...]

  //operation 可以是 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种

  //对一个或多个 key 求逻辑并,并将结果保存到 destkey

  BITOP AND destkey key [key ...]

  对一个或多个 key 求逻辑或,并将结果保存到 destkey

  BITOP OR destkey key [key ...]

  对一个或多个 key 求逻辑异或,并将结果保存到 destkey

  BITOP XOR destkey key [key ...]

  对给定 key 求逻辑非,并将结果保存到 destkey

  BITOP NOT destkey key

  除了 NOT 操作之外,其他操作都可以接受一个或多个 key 作为输入。123456789101112代码类型:[java]

    Redis 在 2.8.9 版本添加了 HyperLogLog 结构。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

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

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

    1.基于bitmap 计数

    2.基于概率基数计数

    1)线性计数算法

    2)对数计数算法(LLC)

    3)自适应计数算法

    4)超对数计数算法

    这个数据结构的令有三个:PFADD、PFCOUNT、PFMERGE

    用途:记录网站IP注册数,每日访问的IP数,页面实时UV、在线用户人数

    局限性:只能统计数量,没有办法看具体信息

  127.0.0.1:6379> pfadd h3 b

  (integer) 1

  127.0.0.1:6379> pfadd h3 a

  (integer) 0

  127.0.0.1:6379> pfcount h3

  (integer) 2

  127.0.0.1:6379> pfadd h3 c

  (integer) 1

  127.0.0.1:6379> pfadd h3 a

  (integer) 1

  127.0.0.1:6379> pfadd h3 d

  (integer) 1

  127.0.0.1:6379> pfmerge h3 h3 h3

  OK

  127.0.0.1:6379> pfcount h3

  (integer) 4123456789101代码类型:[java]

    底层数据结构 Zset

    令:GEOADD、GEODIST、GEOHASH、GEOPOP、GEOPADUIS、GEORADIUSBYMEMBER

    可以用来保存地理位置,并作位置距离计算或者根据半径计算位置等。有没有想过用Redis来实现附近的人?或者计算地图路径?Geo本身不是一种数据结构,它本质上还是借助于Sorted Set(ZSET)

    Redis GEO 操作方法有:

    geoadd:添加地理位置的坐标。

    geopos:获取地理位置的坐标。

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

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

    georadiuymember:根据储存在位置里面的某个地点获取指定范围内的地理位置。

    geohash:返回一个或多个位置对象的 geohash 值。

    把某个具体的位置信息(经度,纬度,名称)添加到指定的key中,数据将会用一个sorted set存储,以便稍后能使用GEORADIUS和GEORADIUSBYMEMBER令来根据半径来查询位置信息。

  127.0.0.1:6379> GEOADD cities 116.404269 39.91582 "beijing" 121.478799 31.235456 "shanghai"

  (integer) 2

  127.0.0.1:6379> ZRANGE cities 0 -1

  1) "shanghai"

  2) "beijing"

  127.0.0.1:6379> ZRANGE cities 0 -1 WITHSCORES

  1) "shanghai"

  2) "4054803475356102"

  3) "beijing"

  4) "4069885555377153"

  127.0.0.1:6379> GEODIST cities beijing shanghai km

  "1068.5677"

  127.0.0.1:6379> GEOPOS cities beijing shanghai

  1) 1) "116.40426903963088989"

  2) "39.91581928642635546"

  2) 1) "121.47879928350448608"

  2) "31.23545629441388627"

  127.0.0.1:6379> GEOADD cities 120.165036 30.278973 hangzhou

  (integer) 1

  127.0.0.1:6379> GEORADIUS cities 120 30 500 km

  1) "hangzhou"

  2) "shanghai"

  127.0.0.1:6379> GEORADIUSBYMEMBER cities shanghai 200 km

  1) "hangzhou"

  2) "shanghai"

  127.0.0.1:6379> ZRANGE cities 0 -1

  1) "hangzhou"

  2) "shanghai"

  3) "beijing"

  127.0.0.1:6379>123456789101112131415161718192021222324252627282930代码类型:[java]

    精确到小数点后6位可以达到约1米精度,所以一般经纬度精确到小数点后6位即可。

    队列模式

    使用list类型的lpush和rpop实现消息队列

    注意事项:

    消息接收方如果不知道队列中是否有消息,会一直发送rpop令,如果这样的话,会每一次都建立一次连接,这样显然不好。

    可以使用brpop令,它如果从队列中取不出来数据,会一直阻塞,在一定范围内没有取出则返回null

    缺点:

    做消费者确认ACK麻烦,不能保证消费者消费消息后是否成功处理的问题(宕机或处理异常等),通常需要维护一个Pending列表,保证消息处理确认。

    不能做广播模式,如pub/sub,消息发布/订阅模型

    不能重复消费,一旦消费就会被删除

    不支持分组消费

    发布订阅模式

    SUBSCRIBE,用于订阅信道

    PUBLISH,向信道发送消息

    UNSUBSCRIBE,取消订阅

    此模式允许生产者只生产一次消息,由中间件负责将消息到多个消息队列,每个消息队列由对应的消费组消费。

    优点

    典型的广播模式,一个消息可以发布到多个消费者;多信道订阅,消费者可以同时订阅多个信道,从而接收多类消息;消息即时发送,消息不用等待消费者读取,消费者会自动接收到信道发布的消息

    缺点

    消息一旦发布,不能接收。换句话就是发布时若客户端不在线,则消息丢失,不能寻回;不能保证每个消费者接收的时间是一致的;若消费者客户端出现消息积压,到一定程度,会被强制断开,导致消息意外丢失。通常发生在消息的生产远大于消费速度时

    可见,Pub/Sub 模式不适做消息存储,消息积压类的业务,而是擅长处理广播,即时通讯,即时反馈的业务。

    Sortes Set(有序列表),类似于java的SortedSet和HashMap的结体,一方面它是一个set,保证内部value的性,另一方面它可以给每个value赋予一个score,代表这个value的排序权重。内部实现是“跳跃表”。

    有序的方案是在自己确定消息顺ID时比较常用,使用成员的Score来作为消息ID,保证顺序,还可以保证消息ID的单调递增。通常可以使用时间戳+序号的方案。确保了消息ID的单调递增,利用SortedSet的依据Score排序的特征,就可以制作一个有序的消息队列了。

    优点

    就是可以自定义消息ID,在消息ID有意义时,比较重要。

    缺点

    缺点也明显,不允许重复消息(因为是),同时消息ID确定有错误会导致消息的顺序出错。

    Redis 5.0 全新的数据类型:streams,官方把它定义为:以更抽象的方式建模日志的数据结构。Redis的streams主要是一个append only(AOF)的数据结构,少在概念上它是一种在内存中表示的抽象数据类型,只不过它们实现了更强大的操作,以克服日志文件本身的限制。

    如果你了解MQ,那么可以把streams当做基于内存的MQ。如果你还了解kafka,那么甚可以把streams当做基于内存的kafka。listpack存储信息,Rax组织listpack 消息链表

    listpack是对ziplist的改进,它比ziplist少了一个定位一个元素的属性

    另外,这个功能有点类似于redis以前的Pub/Sub,但是也有基本的不同:

    1、streams支持多个客户端(消费者)等待数据(Linux环境开多个窗口执行XREAD即可模拟),并且每个客户端得到的是完全相同的数据。

    2、Pub/Sub是发送忘记的方式,并且不存储任何数据;而streams模式下,所有消息被无限期追加在streams中,除非用于显式执行删除(XDEL)。XDEL 只做一个标记位 其实信息和长度还在

    3、streams的Consumer Groups也是Pub/Sub无法实现的控制方式。

    streams数据结构本身非常简单,但是streams依然是Redis到目前为止最复杂的类型,其原因是实现的一些额外的功能:一系列的阻塞操作允许消费者等待生产者加入到streams的新数据。另外还有一个称为Consumer Groups的概念,Consumer Group概念由kafka提出,Redis有一个类似实现,和kafka的Consumer Groups的目的是一样的:允许一组客户端协调消费相同的信息流!

    消息队列相关令:

  XADD - 添加消息到末尾

  XTRIM - 对流进行修剪,限制长度

  XDEL - 删除消息

  XLEN - 获取流包含的元素数量,即消息长度

  XRANGE - 获取消息列表,会自动过滤已经删除的消息

  XREVRANGE - 反向获取消息列表,ID 从大到小

  XREAD - 以阻塞或非阻塞方式获取消息列表1234567代码类型:[java]

   br XADD - 添加消息到末尾brXTRIM - 对流进行修剪,限制长度brXDEL - 删除消息brXLEN - 获取流包含的元素数量,即消息长度brXRANGE - 获取消息列表,会自动过滤已经删除的消息brXREVRANGE - 反向获取消息列表,ID 从大到小brXREAD - 以阻塞或非阻塞方式获取消息列表1234567代码类型:[java]

    消费者组相关令:

  XGROUP CREATE - 创建消费者组

  XREADGROUP GROUP - 读取消费者组中的消息

  XACK - 将消息标记为"已处理"

  XGROUP SETID - 为消费者组设置新的递送消息ID

  XGROUP DELCONSUMER - 删除消费者

  XGROUP DESTROY - 删除消费者组

  XPENDING - 显示待处理消息的相关信息

  XCLAIM - 转移消息的归属权

  XINFO - 查看流和消费者组的相关信息;

  XINFO GROUPS - 打印消费者组的信息;

  XINFO STREAM - 打印流信息1234567891011代码类型:[java]

   br XGROUP CREATE - 创建消费者组brXREADGROUP GROUP - 读取消费者组中的消息brXACK - 将消息标记为"已处理"brXGROUP SETID - 为消费者组设置新的递送消息IDbrXGROUP DELCONSUMER - 删除消费者brXGROUP DESTROY - 删除消费者组brXPENDING - 显示待处理消息的相关信息brXCLAIM - 转移消息的归属权brXINFO - 查看流和消费者组的相关信息;brXINFO GROUPS - 打印消费者组的信息;brXINFO STREAM - 打印流信息1234567891011代码类型:[java]

    使用 XADD 向队列添加消息,如果指定的队列不存在,则创建一个队列,XADD 语法格式:

  XADD key ID field value [field value ...]

  key :队列名称,如果不存在就创建

  ID :消息 id,我们使用 * 表示由 redis 生成,可以自定义,但是要自己保证递增性。

  field value :记录。1234代码类型:[java]

   br XADD key ID field value [field value ...]brkey :队列名称,如果不存在就创建brID :消息 id,我们使用 * 表示由 redis 生成,可以自定义,但是要自己保证递增性。brfield value :记录。1234代码类型:[java]

    XTRIM

    使用 XTRIM 对流进行修剪,限制长度, 语法格式:

  XTRIM key MAXLEN [~] count

  key :队列名称

  MAXLEN :长度

  count :数量1234代码类型:[java]

   br XTRIM key MAXLEN [~] countbrkey :队列名称brMAXLEN :长度brcount :数量1234代码类型:[java]

    XDEL

    使用 XDEL 删除消息,语法格式:

  XDEL key ID [ID ...]

  key:队列名称

  ID :消息 ID123代码类型:[java]

   br XDEL key ID [ID ...]brkey:队列名称brID :消息 ID123代码类型:[java]

    XLEN

    使用 XLEN 获取流包含的元素数量,即消息长度,语法格式:

  XLEN key

  key:队列名称12代码类型:[java]

   br XLEN keybrkey:队列名称12代码类型:[java]

    XRANGE

    使用 XRANGE 获取消息列表,会自动过滤已经删除的消息 ,语法格式:

  XRANGE key start end [COUNT count]

  key :队列名

  start :开始值, - 表示最小值

  end :结束值, + 表示值

  count :数量12345代码类型:[java]

   br XRANGE key start end [COUNT count]brkey :队列名brstart :开始值, - 表示最小值brend :结束值, + 表示值brcount :数量12345代码类型:[java]

    XREVRANGE

    使用 XREVRANGE 获取消息列表,会自动过滤已经删除的消息 ,语法格式:

  XREVRANGE key end start [COUNT count]

  key :队列名

  end :结束值, + 表示值

  start :开始值, - 表示最小值

  count :数量12345代码类型:[java]

   br XREVRANGE key end start [COUNT count]brkey :队列名brend :结束值, + 表示值brstart :开始值, - 表示最小值brcount :数量12345代码类型:[java]

    XREAD

    使用 XREAD 以阻塞或非阻塞方式获取消息列表 ,语法格式:

  XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]

  count :数量

  milliseconds :可选,阻塞毫秒数,没有设置就是非阻塞模式

  key :队列名

  id :消息 ID

  #非阻塞,查询id>0的所有的消息>XREAD COUNT 2 STREAMS stream1 0-0

  #stream中存储的ID作为一个ID> xread block 0 streams stream1 $1234567代码类型:[java]

   br XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]brcount :数量brmilliseconds :可选,阻塞毫秒数,没有设置就是非阻塞模式brkey :队列名brid :消息 IDbr#非阻塞,查询id>0的所有的消息>XREAD COUNT 2 STREAMS stream1 0-0br#stream中存储的ID作为一个ID> xread block 0 streams stream1 $1234567代码类型:[java]

    以上是XREAD的非阻塞形式。注意COUNT选项并不是必需的,实际上这个令强制的选项是STREAMS,指定了一组key以及调用者已经看到的每个Stream相应的ID,以便该令仅向客户端提供ID大于我们指定ID的消息。

    第二条令指定了新的BLOCK选项,超时时间为0毫秒(意味着永不超时)。此外,并没有给流 mystream传入一个常规的ID,而是传入了一个特殊的ID$。这个特殊的ID意思是XREAD应该使用流 mystream已经存储的ID作为一个ID。

    XGROUP CREATE

    使用 XGROUP CREATE 创建消费者组,语法格式:

  XGROUP [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]

  key :队列名称,如果不存在就创建

  groupname :组名。

  $ :表示从尾部开始消费,只接受新消息,当前 Stream 消息会全部忽略。

  从头开始消费:

  XGROUP CREATE mystream consumer-group-name 0-0

  从尾部开始消费:

  XGROUP CREATE mystream consumer-group-name $12345678代码类型:[java]

   br XGROUP [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]brkey :队列名称,如果不存在就创建brgroupname :组名。br$ :表示从尾部开始消费,只接受新消息,当前 Stream 消息会全部忽略。br从头开始消费:brXGROUP CREATE mystream consumer-group-name 0-0br从尾部开始消费:brXGROUP CREATE mystream consumer-group-name $12345678代码类型:[java]

    XREADGROUP GROUP

    使用 XREADGROUP GROUP 读取消费组中的消息,语法格式:

  XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]

  group :消费组名

  consumer :消费者名。

  count :读取数量。

  milliseconds :阻塞毫秒数。

  key :队列名。

  ID :消息 ID。

  XREADGROUP GROUP consumer-group-name consumer-name COUNT 1 STREAMS mystream >12345678代码类型:[java]

   br XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]brgroup :消费组名brconsumer :消费者名。brcount :读取数量。brmilliseconds :阻塞毫秒数。brkey :队列名。brID :消息 ID。brXREADGROUP GROUP consumer-group-name consumer-name COUNT 1 STREAMS mystream >12345678代码类型:[java]

    在以上令行中还有另外一个非常重要的细节在强制选项STREAMS之后,键mystream请求的ID是特殊的ID >。这个特殊的ID只在消费者组的上下文中有效,其意思是:消息到目前为止从未传递给其他消费者。

    实例:

  //发布消息

  127.0.0.1:6379> xadd mystream * message apple

  "1589994652300-0"

  127.0.0.1:6379> xadd mystream * message orange

  "1589994679942-0"

  //读取消息

  127.0.0.1:6379> xrange mystream - +

  1) 1) "1589994652300-0"

  2) 1) "message"

  2) "apple"

  2) 1) "1589994679942-0"

  2) 1) "message"

  2) "orange"

  //阻塞读取

  xread block 0 streams mystream $

  //发布新消息

  127.0.0.1:6379> xadd mystream * message strawberry

  //创建消费组

  127.0.0.1:6379> xgroup create mystream mygroup1 0

  OK

  127.0.0.1:6379> xgroup create mystream mygroup2 0

  OK123456789101112131415161718192021222324代码类型:[java]

   br //发布消息br127.0.0.1:6379> xadd mystream * message applebr"1589994652300-0"br127.0.0.1:6379> xadd mystream * message orangebr"1589994679942-0"brbr//读取消息br127.0.0.1:6379> xrange mystream - +br1) 1) "1589994652300-0"br 2) 1) "message"br 2) "apple"br2) 1) "1589994679942-0"br 2) 1) "message"br 2) "orange"brbr//阻塞读取brxread block 0 streams mystream $br//发布新消息br127.0.0.1:6379> xadd mystream * message strawberrybr//创建消费组br127.0.0.1:6379> xgroup create mystream mygroup1 0brOKbr127.0.0.1:6379> xgroup create mystream mygroup2 0brOK123456789101112131415161718192021222324代码类型:[java]

    通过消费组读取消息

  127.0.0.1:6379> xreadgroup group mygroup1 zange count 2 streams mystream >

  1) 1) "mystream"

  2) 1) 1) "1589994652300-0"

  2) 1) "message"

  2) "apple"

  2) 1) "1589994679942-0"

  2) 1) "message"

  2) "orange"

  127.0.0.1:6379> xreadgroup group mugroup1 tuge count 2 streams mystream >

  1) 1) "mystream"

  2) 1) 1) "1589995171242-0"

  2) 1) "message"

  2) "strawberry"

  127.0.0.1:6379> xreadgroup group mugroup2 tuge count 1 streams mystream >

  1) 1) "mystream"

  2) 1) 1) "1589995171242-0"

  2) 1) "message"

  2) "apple"12345678910111213141516171819代码类型:[java]

   br 127.0.0.1:6379> xreadgroup group mygroup1 zange count 2 streams mystream >br1) 1) "mystream"br 2) 1) 1) "1589994652300-0"br 2) 1) "message"br 2) "apple"br 2) 1) "1589994679942-0"br 2) 1) "message"br 2) "orange"br127.0.0.1:6379> xreadgroup group mugroup1 tuge count 2 streams mystream >br1) 1) "mystream"br 2) 1) 1) "1589995171242-0"br 2) 1) "message"br 2) "strawberry"brbr127.0.0.1:6379> xreadgroup group mugroup2 tuge count 1 streams mystream >br1) 1) "mystream"br 2) 1) 1) "1589995171242-0"br 2) 1) "message"br 2) "apple"12345678910111213141516171819代码类型:[java]

    我们先创建一下几种类型,然后通过type令来查看一下

  127.0.0.1:6379> SET string:key value

  OK

  127.0.0.1:6379> LPUSH list:key 10001

  (integer) 1

  127.0.0.1:6379> HMSET hash:key 1:name A 1:age 18

  OK

  127.0.0.1:6379> SADD set:key 1001 1002

  (integer) 2

  127.0.0.1:6379> ZADD zset:key 100 wang

  (integer) 1

  127.0.0.1:6379> setbit bitmap:key 5 1

  (integer) 0

  127.0.0.1:6379> pfadd hyperloglog:key b

  (integer) 1

  127.0.0.1:6379> GEOADD geo:key 116.404269 39.91582 "beijing" 121.478799 31.235456 "shanghai"

  (integer) 2

  127.0.0.1:6379> XADD stream:key 10001 field value

  "10001-0"

  127.0.0.1:6379> PUBLISH runoobChat "Redis PUBLISH test"

  (integer) 0

  127.0.0.1:6379> keys *

  1) "geo:key"

  2) "bitmap:key"

  3) "stream:key"

  4) "set:key"

  5) "string:key"

  6) "hyperloglog:key"

  7) "zset:key"

  8) "hash:key"

  9) "list:key"

  127.0.0.1:6379> TYPE geo:key

  zset

  127.0.0.1:6379> TYPE bitmap:key

  string

  127.0.0.1:6379> TYPE stream:key

  stream

  127.0.0.1:6379> TYPE set:key

  set

  127.0.0.1:6379> TYPE string:key

  string

  127.0.0.1:6379> TYPE hyperloglog:key

  string

  127.0.0.1:6379> TYPE zset:key

  zset

  127.0.0.1:6379> TYPE hash:key

  hash

  127.0.0.1:6379> TYPE list:key

  list123456789101112131415161718192021222324252627282930313233343536373839404142434445464748代码类型:[java]

   br 127.0.0.1:6379> SET string:key value brOKbr127.0.0.1:6379> LPUSH list:key 10001br(integer) 1br127.0.0.1:6379> HMSET hash:key 1:name A 1:age 18brOKbr127.0.0.1:6379> SADD set:key 1001 1002br(integer) 2br127.0.0.1:6379> ZADD zset:key 100 wangbr(integer) 1br127.0.0.1:6379> setbit bitmap:key 5 1br(integer) 0br127.0.0.1:6379> pfadd hyperloglog:key bbr(integer) 1br127.0.0.1:6379> GEOADD geo:key 116.404269 39.91582 "beijing" 121.478799 31.235456 "shanghai"br(integer) 2br127.0.0.1:6379> XADD stream:key 10001 field valuebr"10001-0"br127.0.0.1:6379> PUBLISH runoobChat "Redis PUBLISH test"br(integer) 0br127.0.0.1:6379> keys *br1) "geo:key"br2) "bitmap:key"br3) "stream:key"br4) "set:key"br5) "string:key"br6) "hyperloglog:key"br7) "zset:key"br8) "hash:key"br9) "list:key"br127.0.0.1:6379> TYPE geo:keybrzsetbr127.0.0.1:6379> TYPE bitmap:keybrstringbr127.0.0.1:6379> TYPE stream:keybrstreambr127.0.0.1:6379> TYPE set:keybrsetbr127.0.0.1:6379> TYPE string:keybrstringbr127.0.0.1:6379> TYPE hyperloglog:keybrstringbr127.0.0.1:6379> TYPE zset:keybrzsetbr127.0.0.1:6379> TYPE hash:keybrhashbr127.0.0.1:6379> TYPE list:keybrlist123456789101112131415161718192021222324252627282930313233343536373839404142434445464748代码类型:[java]

    由此可见,redis实际是有6种数据类型的,bitmap和hyperloglog的数据类型其实是String,geo的类型其实是zset,redis 5之后又加了一种stream,所以是6种,bitmap和hyperloglog还有geo的数据类型是跟他们的实现原理有关的,接下来的几次课,咱们来一起研究redis是如何实现这几种数据类型的

以上内容就是关于redis的数据类型有哪些,使用场景说说和redis数据类型及常用方法的精彩内容,是由小编认真整理编辑的,如果对您有帮助欢迎收藏转发...谢谢!