类型补充
- [一. Streams](#一. Streams)
- [二. Geospatial](#二. Geospatial)
- [三. HyperLogLog](#三. HyperLogLog)
- [四. Bitmaps](#四. Bitmaps)
- [五. Bitfields](#五. Bitfields)
一. 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)
