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
相关文章:
redis的Bitmap 、HyperLogLog、Geo相关命令和相关场景
Bitmap 相关命令: #SETBIT - 设置指定位置的比特值。SETBIT key offset value # 将 key 对应的 bitmap 中第 offset 位设置为 value(0 或 1)。#GETBIT - 获取指定位置的比特值。GETBIT key offset # 返回 key 对应 bitmap 的第 offset 位的…...
✅小程序申请+备案教程
##red## 🔴 大家好,我是雄雄,欢迎关注微信公众号,雄雄的小课堂。 零、注意事项 需要特别注意的是,如果公司主体的微信公众号已经交过300块钱的认证费了的话,注册小程序通过公众号来注册,可以免…...
Google Guava Cache简介
目录 简介和Redis的区别 简介 Google Guava 是一个开源的 Java 库,其中提供了一系列强大的工具来简化 Java 开发工作。其中,Guava Cache 组件提供了一个内存缓存的实现,可以显著提高应用程序的性能。这是一个高效且灵活的缓存解决方案&#…...
githup开了代理push不上去
你们好,我是金金金。 场景 git push出错 解决 cmd查看 git config --global http.proxy git config --global https.proxy 如果什么都没有,代表没设置全局代理,此时如果你开了代理,则执行如下,设置代理 git con…...
【python】保存列表、字典数据到本地文件,以txt、json和pickle为例
Python保存列表、字典数据到本地文件(txt, json, pickle) 在Python编程中,我们经常需要将数据(如列表、字典等)保存到本地文件,以便后续读取、分析或与其他系统交换数据。Python提供了多种格式来保存这些数…...
每日新闻掌握【2024年7月9日 星期二】
2024年7月9日 星期二 农历六月初四 大公司/大事件 上半年新注册登记的新能源汽车创历史新高 据公安部统计,上半年新注册登记新能源汽车439.7万辆,同比增长39.41%,创历史新高。新能源汽车新注册登记量占汽车新注册登记量的41.42%。截至6月底…...
数据结构——Trie
题目: 维护一个字符串集合,支持两种操作: I x 向集合中插入一个字符串 x𝑥;Q x 询问一个字符串在集合中出现了多少次。 共有 N𝑁 个操作,所有输入的字符串总长度不超过 10^5,字符串仅…...
前端根据目录生成模块化路由routes
根据约定大于配置的逻辑,如果目录结构约定俗成,前端是可以根据目录结构动态生成路由所需要的 route 结构的,这个过程是要在编译时 进行,生成需要的代码,保证运行时的代码正确即可 主流的打包工具都有对应的方法读取文…...
Blender新手入门笔记收容所(一)
基础篇 基础操作 视角的控制 控制观察视角:鼠标中键平移视图:Shift鼠标中键缩放视图:滚动鼠标中键滚轮 选中物体后:移动物体快捷键G,移动后单击鼠标就会定下来。 进入移动状态后:按Y会沿着Y轴移动进入移动…...
修改服务器挂载目录
由于我们的项目通常需要挂载一个大容量的数据盘来存储文件数据,所以我们每台服务器都需要一个默认的挂载目录来存放这些数据,但是由于我们的误操作,导致挂载目录名字建错了,这时候后端就读不到挂载目录了,那我们我们的…...
Linux+InternStudio 关卡
ssh连接 端口映射 本地...
如何提升美国Facebook直播的整体体验?
Facebook作为全球最大的社交媒体平台之一,提供了直播功能,用户可以实时分享生活、见解和创意。许多商家通过美国Facebook直播来获取更多客户,但直播时可能会遇到网络卡顿的问题,导致观看体验不佳。本文将探讨如何解决这个问题&…...
flutter项目与原生项目相比,性能比较差的原因
Flutter 项目相对于原生项目有时会表现出性能上的差异,主要原因如下: 1. 框架层的额外开销 Flutter 是一个跨平台框架,它通过 Dart 语言编写代码,并使用 Flutter 引擎将其编译成原生代码。这种跨平台的抽象层不可避免地会引入一…...
第二周:李宏毅机器学习笔记
第二周学习周报 摘要Abstract一、深度学习1.Backpropagation(反向传播)1.1 链式法则1.2 Forward pass(前向传播)1.3 Backward pass(向后传播)1.4 总结 2. Regression(神奇宝贝案例)2…...
搜维尔科技:【研究】Scalefit是一款可在工作场所自动处理3D姿势分析结果的软件
Scalefit是一款可在工作场所自动处理 3D 姿势分析结果的软件。这甚至可以在衡量员工的同时发生。然后,Scalefit 根据国际标准对姿势、压缩力和关节力矩进行分析和可视化。 3D姿势分析 如今,Xsens 技术可让您快速测量工作场所员工的态度。一套带有 17 个…...
网络编程:各协议头(数据报格式)
一、mac头 二、ip头 protocol——tcp/udp (7)TTL——生存时间 三、tcp头 四、udp头...
SpringBoot报错:The field file exceeds its maximum permitted size of 1048576 bytes
报错信息 The field file exceeds its maximum permitted size of 1048576 bytes原因是 SpringBoot内嵌的 tomcat 默认的所有上传的文件大小为 1MB 解决办法 修改配置 spring:servlet:multipart:max-file-size: 50MBmax-request-size: 50MB或者 spring.servlet.multipart.…...
C++的介绍与认识
目录 前言 1.什么是C 2.C的发展历史 3.C参考文档 4.C重要性 4.1C特点 4.2编程语言排行榜 4.3 C的应用领域 5.C学习指南 1. 基础知识 2. 面向对象编程(OOP) 3. 泛型编程 4. 标准库(STL) 结束语 前言 学习了C语言的知识…...
Spark源码详解
https://www.cnblogs.com/huanghanyu/p/12989067.html#_label3_3...
浅尝Apache Mesos
文章目录 1. Mesos是什么2. 共享集群3. Apache Mesos3.1 Mesos主节点3.2 Mesos代理3.3 Mesos框架 4. 资源管理4.1 资源提供4.2 资源角色4.3 资源预留4.4 资源权重与配额 5. 实现框架5.1 框架主类5.3 实现执行器 6. 小结参考 1. Mesos是什么 Mesos是什么,Mesos是一个…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
