3.6 Redis位图(bitmap)
由 0 和 1 表示的二进制位的 bit 数组
介绍
- 用String类型作为底层数据结构实现的一种统计二值状态的数据类型
- 位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们称之为一个索引)
- Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息(2的32次方 = 4294967296)
基本命令
SETBIT key offset value // 将第offset的值设为value value只能是0或1 offset 从0开始
GETBIT key offset // 获得第offset位的值
STRLEN key // 得出占多少字节 超过8位后自己按照8位一组一byte再扩容
BITCOUNT key // 得出该key里面含有几个1
BITOP and destKey key1 key2 // 对一个或多个 key 求逻辑并,并将结果保存到 destkey
BITOP or destKey key1 key2 // 对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destKey key1 key2 // 对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destKey key // 对key 求逻辑非,并将结果保存到 destkey
应用
- 做签到很适合位图
- 每天使用1个1亿位的Bitmap约占12MB的内存(10^8/8/1024/1024),10天的Bitmap的内存开销约为120MB,内存压力不算太高。
- 在实际使用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录以节省内存开销。
- 对于电影和广告是否被点击播放过也可以用位图
3.7 Redis基数统计(HyperLogLog)
介绍
- 去重复统计功能的基数估计算法就是 HyperLogLog
- 基数
- 是一种数据集,去重复后的真实个数
- 基数统计
- 用于统计一个集合中不重复的元素个数,就是对集合去重复后剩余元素的计算
- 只需要花费12KB内存,就能记录 2的64次方=18446744073709551616 个不同元素的基数
基本命令
应用
- 统计某个网页的UV、某个文章的UV
- UV Unique Visitor 独立访客,一般理解为客户端IP,需要去重
- 用户搜索网站关键词数量
- 统计用户每天搜索不同词条个数
3.8Redis地理空间(GEO)
介绍
地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。
- 例如滴滴打车,最直观的操作就是实时记录更新各个车的位置
- 然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆
基本命令
- 经纬度去地图上直接复制
GEOADD添加经纬度坐标
会出现中文乱码
- redis -cli -a 123456 – raw
GEOPOS 返回经纬度
GEOHASH返回坐标的 geohash 表示 (base32编码)
GEODIST 返回两个位置之间的距离
GEORADIUS 以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUSBYMEMBER 找出指定范围内的元素,中心点是由给定的位置元素决定
应用
- 美团附近的饭店、酒店
- 高德地图附近的店
3.9Redis流(Stream)
介绍
- 实现消息队列的三个方式
- List实现消息队列
- Pub/Sub 发布订阅
- Stream流 (Redis版的MQ消息中间件+阻塞队列)
Stream流实现消息队列,它支持消息的持久化、支持自动生成全局唯一 ID、支持ack确认消息的模式、支持消费组模式等,让消息队列更加的稳定和可靠
Stream结构
基本命令
队列指令
消费组指令
消费组里的消费者进行轮询
3.10Redis位域(bitfield)
介绍
- 将很多小的整数存储到一个长度较大的位图中,又或者将一个非常庞大的键分割位多个较小的键来进行储存,从而高效利用内存
- 也就是将 Redis 字符串看作是一个 由二进制位组成的数组 并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
基本命令
溢出控制:
WRAP: 使用回绕 (Wrap around) 方法处理有符号和无符号整数溢出
Set: 使用饱和计算(saturation arithmetic) 方法处理溢出, 下溢计算的结果为最小的整数值,而上溢计算的结果为最大的整数值
FAIL :命令将拒绝执行那些会导致上溢或者下溢情况出现的计算,并向用户返回空值表示计算未被执行