【Redis】类型补充

类型补充

一. Streams

Streams:流,用于实现高效的消息队列和实时数据流处理,也可以用来模拟实现事件传播的机制。

  • 事件:IO 多路复用,每次 网卡/socket 上有可读可写的数据都会通过事件回调机制来通知到我们的应用程序代码。
  • Streams 就是一个队列 (阻塞队列),是 Redis 作为一个消息队列的重要支撑,属于是 list 的 blpop/brpop 的升级版本。

命令:xadd、xread、xrange、xlen

这个数据结构用的不多,需要用时,查找文档即可。

二. Geospatial

Geospatial:地理空间,用来存储坐标 (经纬度),存储一些点后,就可以让用户给定一个坐标,取刚才存储的点里进行查找 (按照半径,矩形区域...),这个功能在地图中非常重要。

  • Geospatial 拥有高效存储和查询、和丰富的地理操作。
  • 应用场景:位置跟踪、附近搜索。

命令:geoadd、getpos、geodist、georadius

  • geoadd:添加元素的地理位置。
  • 语法:geoadd key longitude latitude member [longitude latitude member ...]
  • getpos:查找元素的地理位置。
  • 语法:geopos key member [member ...]
  • geodist:计算两个元素地理位置之间的距离。
  • 语法:geodist key member1 member2 [m|km|ft|mi]
  • georadius:查询指定半径内的地理位置。
  • 语法:georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]

三. HyperLogLog

HyperLogLog:基数统计,使用少量内存的情况下,统计集合中不重复元素的数量,但是存在 0.81% 的误差。

  • set 有一个应用场景是,统计服务器的 UV (用户访问次数),其中最大的问题是,如果 UV 数据量非常大 (这里取 1 亿),set 就会消耗很多的内存空间,假设 set 存储 userId,每个 userId 按照 8 个字节计算,1 亿 UV 等于 8 亿字节,也就是 0.8 GB,也就是 800 MB
  • 而使用 HyperLogLog,只需要 12KB 的内存,就可以处理任意数量的输入,并且可以处理的数量是巨大的,达到 2^64 数量级。
  • 之所以 set 要消耗这么大的空间,因为 set 需要存储每一个元素,而 HyperLogLog 不存储元素的内容,但是能够记录 "元素的特征",从而在新增元素的时候,能够知道当前新增的元素,是已经存在的元素,还是第一次出现的元素。
  • HyperLogLog 只是用于计数,记录当前集合中存在多少个不同的元素,而不能告诉你这些元素都是什么,无论是插入元素还是查询元素的个数,时间复杂度都是 O(1)

命令:pfadd、pfcount、pfmerge

  • pfadd:向集合中添加元素
  • 语法:pfadd key element [element ...]
  • 时间复杂度:O(1)
  • pfcount:求集合中不相同的元素个数。
  • 语法:pfcount key [key ...]
  • 时间复杂度:O(1)
  • pfmerge:合并集合中的元素个数,存储在目标集合中。
  • 语法:pfmerge destkey sourcekey [sourcekey ...]

四. Bitmaps

Bitmaps:使用少量内存的情况下,统计某个整数是否出现。

  • HyperLogLog 更加节省空间,既可以存储数值,也可以存储字符串,但是不会存储元素的内容,只是起到计数的效果,存储数据的时候是不可逆的 (信息丢失)
  • Bitmaps 会存储整数,设置和获取的时间复杂度是 O(1)

命令:setbit、getbit、bitop、bitcount

  • setbit:设置位图某个偏移量的值。
  • 语法:setbit key offset value
  • 时间复杂度:O(1)
  • getbit:获取位图中某个偏移量的值。
  • 语法:getbit key offset
  • 时间复杂度:O(1)
  • 返回值:位图中某个偏移量的值。
  • bitop:将位图之间按位操作,存储在目标位图中。
  • 语法:bitop operation destkey key [key ...]
    • 其中的 operation 存在四种:or、and、xor、not;




  • bitcount:统计位图中某个偏移量区间中被设置为 1 的个数。
  • 语法:bitcount key [start end]

五. Bitfields

Bitfields:位域也叫位段,本质上是让我们精确进行位操作的一种方法。

  • 上述 Redis 中的 Bitfields 与 C语言 中的位段,非常类似,Bitfields 可以理解成一串二进制序列 (字节数组),同时可以把这个字节数组中的某几个位,赋予特定的含义,并且可以进行 读取/修改/算数运算 相关操作,仍然是为了节省空间。

命令:bitfield

  • 语法:bitfield key GET type offset SET type offset value INCRBY type offset increment OVERFLOW WRAP\|SAT\|FAIL
    • bitfield key set type offset value:设置位域中的某个偏移量,为某个类型并赋值。
    • bitfield key get type offset:获取位域中的某个偏移量,中的某个类型的值。
    • bitfield key incrby type offset increment:位域中的某个偏移量,某个类型的值进行加减运算。
  • 时间复杂度:O(1)
相关推荐
笃行35013 分钟前
金仓 KingbaseES PL/SQL 开发全攻略:异常处理、数据类型、调试优化与过程语句
数据库
快乐的木子李1 小时前
mysql-26.7.0-linux26.7.0下载安装
数据库·mysql
excel2 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
知行产研2 小时前
易控智驾:毛利率跃升17.2个百分点,矿山无人驾驶从“规模换增长“迈入“盈利拐点“
数据库·mysql
千里码aicood3 小时前
基于CART算法的图书分类系统设计与实现
数据库·算法·分类
饺子大魔王的男人3 小时前
Redis 内存和连接异常怎么排查?用 redis_exporter 搭一套可远程抓取的监控链路
数据库·redis·bootstrap
可涵不会debug3 小时前
第一次学 LangGraph:用一个快递案例搞懂 State、Node、Edge 和 compile
服务器·数据库·mysql
IvorySQL4 小时前
PostgreSQL 日报 |RLS 机密性绕过漏洞(9 月 27 日)
数据库·postgresql
夕除4 小时前
redis--RDB AOF
数据库·redis·缓存
数据工匠老o4 小时前
"能用应用层解决的不用存储过程",十年数据库经验总结
数据库·架构