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 个不同元素的基数
基本命令

redis bitmap占用内存 redisson bitmap_redis bitmap占用内存


redis bitmap占用内存 redisson bitmap_java_02

应用
  • 统计某个网页的UV、某个文章的UV
  • UV Unique Visitor 独立访客,一般理解为客户端IP,需要去重
  • 用户搜索网站关键词数量
  • 统计用户每天搜索不同词条个数

3.8Redis地理空间(GEO)

介绍

地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要我们确定一个点的经纬度就可以名取得他在地球的位置。

  • 例如滴滴打车,最直观的操作就是实时记录更新各个车的位置
  • 然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆
基本命令
  • 经纬度去地图上直接复制

GEOADD添加经纬度坐标

redis bitmap占用内存 redisson bitmap_redis_03

会出现中文乱码

  • redis -cli -a 123456 – raw

GEOPOS 返回经纬度

redis bitmap占用内存 redisson bitmap_java_04

GEOHASH返回坐标的 geohash 表示 (base32编码)

redis bitmap占用内存 redisson bitmap_缓存_05

GEODIST 返回两个位置之间的距离

redis bitmap占用内存 redisson bitmap_redis bitmap占用内存_06

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

redis bitmap占用内存 redisson bitmap_Redis_07

GEORADIUSBYMEMBER 找出指定范围内的元素,中心点是由给定的位置元素决定

redis bitmap占用内存 redisson bitmap_redis bitmap占用内存_08

应用
  • 美团附近的饭店、酒店
  • 高德地图附近的店

3.9Redis流(Stream)

介绍
  • 实现消息队列的三个方式
  • List实现消息队列
  • Pub/Sub 发布订阅
  • Stream流 (Redis版的MQ消息中间件+阻塞队列)

redis bitmap占用内存 redisson bitmap_Redis_09


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

Stream结构

redis bitmap占用内存 redisson bitmap_redis_10

基本命令

队列指令

redis bitmap占用内存 redisson bitmap_Redis_11

消费组指令

redis bitmap占用内存 redisson bitmap_redis_12


redis bitmap占用内存 redisson bitmap_Redis_13

消费组里的消费者进行轮询

redis bitmap占用内存 redisson bitmap_缓存_14

3.10Redis位域(bitfield)

介绍
  • 将很多小的整数存储到一个长度较大的位图中,又或者将一个非常庞大的键分割位多个较小的键来进行储存,从而高效利用内存
  • 也就是将 Redis 字符串看作是一个 由二进制位组成的数组 并能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改
基本命令

redis bitmap占用内存 redisson bitmap_java_15

溢出控制:

WRAP: 使用回绕 (Wrap around) 方法处理有符号和无符号整数溢出

redis bitmap占用内存 redisson bitmap_java_16

Set: 使用饱和计算(saturation arithmetic) 方法处理溢出, 下溢计算的结果为最小的整数值,而上溢计算的结果为最大的整数值

redis bitmap占用内存 redisson bitmap_缓存_17

FAIL :命令将拒绝执行那些会导致上溢或者下溢情况出现的计算,并向用户返回空值表示计算未被执行

redis bitmap占用内存 redisson bitmap_redis_18