当前位置: 首页 > news >正文

redis的Bitmap 、HyperLogLog、Geo相关命令和相关场景

Bitmap 相关命令:

 #SETBIT - 设置指定位置的比特值。SETBIT key offset value  # 将 key 对应的 bitmap 中第 offset 位设置为 value(0 或 1)。#GETBIT - 获取指定位置的比特值。GETBIT key offset  # 返回 key 对应 bitmap 的第 offset 位的值。#BITCOUNT - 统计比特值为 1 的数量。BITCOUNT key [start end]  # 返回 key 对应 bitmap 中比特值为 1 的数量,可以指定范围。#BITPOS - 查找第一个为指定值的比特位。BITPOS key value [start] [end]  # 返回第一个值为 value 的比特位的位置。#BITOP - 对两个或多个 bitmap 执行位操作(AND/OR/XOR/NOT)。BITOP operation destkey key [key ...]  # 将多个 key 的 bitmap 进行位操作,结果存储到 destkey。

Bitmap 应用场景:

#用户签到记录:
#使用 Bitmap 记录用户每天的签到情况。每个用户每天的签到可以用一个位表示,一年内的签到情况可以用一个 Bitmap 存储。# 用户 10086 在 2023 年 9 月 3 日签到
SETBIT user:sign:10086:202309 3 1
# 统计用户 10086 在 2023 年 9 月的签到次数
BITCOUNT user:sign:10086:202309#用户在线状态:
#使用 Bitmap 来记录用户是否在线。用户 ID 作为位的偏移量,在线状态用 1 表示,离线用 0 表示。# 记录用户 10086 已登录
SETBIT user:online 10086 1
# 查询用户 10086 是否登录
GETBIT user:online 10086#优惠券每人限领一张:
#使用 Bitmap 确保每个用户只能领取一张优惠券。优惠券编号作为 key,用户 ID 作为偏移量。# 设置用户 100 和 101 领取过优惠券 a
SETBIT coupon:a 100 1
SETBIT coupon:a 101 1
# 检查用户 100 是否领过优惠券 a
GETBIT coupon:a 100#连续签到用户总数:
#将每天作为一个 key,使用 BITOP 命令合并多天的 Bitmap 来统计连续签到的用户。# 用户 A、B、C 在特定日期签到
SETBIT sign:20230901 0 1
SETBIT sign:20230901 1 1
SETBIT sign:20230901 2 1
SETBIT sign:20230902 0 1
SETBIT sign:20230902 1 1
BITOP AND sign:consecutive sign:20230901 sign:20230902
# 统计连续签到的用户数
BITCOUNT sign:consecutive

实现布隆过滤器:

布隆过滤器(Bloom Filter)是一种空间效率很高的数据结构,用于判断一个元素是否在一个集合中。它允许一些误报(false positives),但不允许误漏(false negatives)。在Redis中,可以使用Bitmap来实现布隆过滤器的基本功能。
布隆过滤器的关键操作添加元素:将元素通过某种方式(如哈希函数)映射到位图中的多个位置,并将这些位置的位设置为1。检查元素:同样使用哈希函数将元素映射到位图中,检查这些位置的位是否都为1。如果都为1,则元素可能存在于集合中;如果有任意位置为0,则元素一定不在集合中。操作样例假设我们使用两个哈希函数 hash1 和 hash2,它们将输入元素映射到不同的位偏移量上。
初始化首先,我们需要一个足够大的Bitmap来存储布隆过滤器的数据。假设我们预计要存储1000个元素,每个元素使用两个哈希函数,那么可能需要的位数大约是 2 * 10 * 8 * log2(1000)(这里使用了一个简单的布隆过滤器大小估算公式)。# 初始化一个Bitmap,假设key为bloom_filter,估算需要的位数为8000
# 使用STRLEN命令来确保Redis自动扩展字符串长度
SETBIT bloom_filter 0 0
STRLEN bloom_filter添加元素# 假设元素为 "item"
# 使用两个哈希函数计算偏移量,这里用简单的方法模拟
# 哈希函数1:item的字符串表示的CRC16值对8000取模
# 哈希函数2:将哈希函数1的结果加上一个固定值(例如1000)再对8000取模
# 这里只是示例,实际哈希函数会更复杂# 假设hash1的结果为100
SETBIT bloom_filter 100 1
# 假设hash2的结果为1100
SETBIT bloom_filter 1100 1检查元素# 检查 "item" 是否可能在集合中
# 检查两个哈希函数计算出的偏移量对应的位是否都为1
GETBIT bloom_filter 100
GETBIT bloom_filter 1100
# 如果两个命令的返回值都是1,则 "item" 可能在集合中
# 如果任何一个返回值为0,则 "item" 一定不在集合中
注意事项布隆过滤器的大小和哈希函数的数量会影响误报率。集合越大或哈希函数越多,误报率越低,但同时需要更多的空间。哈希函数的选择对布隆过滤器的性能至关重要。理想的哈希函数应具有良好的分布性,以减少哈希碰撞。Redis的Bitmap实现的布隆过滤器是不可扩展的,即一旦设置了位,就不能减少Bitmap的大小。因此,需要预先估算好所需的空间。使用Bitmap实现布隆过滤器是一种空间效率高的方法,适用于需要快速判断元素存在性的场景,尤其是在大数据量的情况下。然而,它也有一些限制,如不能从过滤器中删除元素,以及存在一定的误报率。

** HyperLogLog常见命令:**

# 添加指定元素到 HyperLogLog 中
PFADD key element [element ...]# 返回给定 HyperLogLog 的基数估算值。
PFCOUNT key [key ...]# 将多个 HyperLogLog 合并为一个 HyperLogLog
PFMERGE destkey sourcekey [sourcekey ...]

** HyperLogLog应用场景:**

#百万级网页 UV 计数Redis HyperLogLog #优势在于只需要花费 12 KB 内存,就可以计算接近 2^64 个元素的基数,和元素越多就越耗费内存的 Set 和 Hash 类型相比,HyperLogLog 就非常节省空间。所以,非常适合统计百万级以上的网页 UV 的场景。在统计 UV 时,你可以用 PFADD 命令(用于向 HyperLogLog 中添加新元素)把访问页面的每个用户都添加到 HyperLogLog 中。PFADD page1:uv user1 user2 user3 user4 user5#接下来,就可以用 PFCOUNT 命令直接获得 page1 的 UV 值了,这个命令的作用就是返回 HyperLogLog 的统计结果。PFCOUNT page1:uv#不过,有一点需要你注意一下,HyperLogLog 的统计规则是基于概率完成的,所以它给出的统计结果是有一定误差的,标准误算率是 0.81%。#这也就意味着,你使用 HyperLogLog 统计的 UV 是 100 万,但实际的 UV 可能是 101 万。虽然误差率不算大,但是,如果你需要精确统计结果的话,最好还是继续用 Set 或 Hash 类型。

Geo 相关命令:

#GEOADD - 将指定的地理空间位置(纬度、经度、成员)添加到指定的键中。GEOADD key longitude latitude member [longitude latitude member ...]  # 添加地理位置。#GEOPOS - 返回一个或多个成员的地理坐标。GEOPOS key member [member ...]  # 获取成员的地理坐标。#GEODIST - 返回两个成员之间的距离。GEODIST key member1 member2 [unit]  # 获取成员之间的距离,unit 可以是 m(米)、km(千米)、mi(英里)、ft(英尺)。GEORadius - 根据给定的经纬度和半径返回一个或多个位置成员。GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]  # 搜索指定半径内的位置成员。

Geo 应用场景:

#附近地点搜索:
#使用 GEORadius 命令搜索给定经纬度附近的兴趣点(如餐馆、影院等)。# 搜索以经纬度为中心,半径为 10 公里内的所有地点
GEORADIUS my_locations 116.383331 -39.906611 10 km WITHDIST WITHCOORD#用户签到位置记录:
#记录用户签到的地理位置,并使用 GEOADD 命令添加到 Redis。# 记录用户 "user123" 在某个地点的签到
GEOADD user_checkins 116.40 39.90 "user123"#计算两地之间的距离:
#使用 GEODIST 命令计算两个地点之间的距离。# 计算地点 "placeA" 和 "placeB" 之间的距离
GEODIST my_locations placeA placeB km

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AtCoder Beginner Contest 361
  • SQL 字段类型-上
  • 旗晟机器人AI智能算法有哪些?
  • JRE、JVM、JDK分别是什么。
  • Django学习第六天
  • 构造函数注入@RequiredArgsConstructor
  • arp缓存中毒实验
  • 【大模型LLM面试合集】大语言模型架构_layer_normalization
  • 【HarmonyOS NEXT】鸿蒙线程安全容器集collections.ArrayBuffer
  • self_attention python代码
  • 超高精电容传感器PCAP01调试+LABVIEW数据可视化调试手记
  • 分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列
  • 12、matlab中for循环,if else判断语句,break和continue用法以及switch case语句使用
  • ORA-12537: TNS:连接关闭/Io 异常: Got minus one from a read call
  • Open3D SVD算法实现对应点集配准
  • Angular Elements 及其运作原理
  • download使用浅析
  • es6--symbol
  • in typeof instanceof ===这些运算符有什么作用
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Quartz初级教程
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React-生命周期杂记
  • Tornado学习笔记(1)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 高性能JavaScript阅读简记(三)
  • 解决iview多表头动态更改列元素发生的错误
  • ionic入门之数据绑定显示-1
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $$$$GB2312-80区位编码表$$$$
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (CPU/GPU)粒子继承贴图颜色发射
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (javascript)再说document.body.scrollTop的使用问题
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (搬运以学习)flask 上下文的实现
  • (第30天)二叉树阶段总结
  • (多级缓存)缓存同步
  • (计算机网络)物理层
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转) Android中ViewStub组件使用
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .NET 4.0中的泛型协变和反变
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core 管理用户机密
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET NPOI导出Excel详解
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)