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是一个…...
buuctf题目讲解-1
一眼就解密 ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30 flag{THEFLAGOFTHISSTRING} base家族 base64 加密原理: 明文:abc 去找ascii码的二进制形式 a-->97-→01100001 (二进制为8位如果不足8位则在最左边补0至8位) b-→…...
软件测试学习之-ADB命令
ADB命令 adb工具即Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。在某些特殊的情况下进入不了系统,adb就派上用场啦! Android程序的开发通常需要使用到一…...
Redis的入门导读(一)
目录 单机架构 分布式系统 个人总结 一.Redis的介绍 二.Redis特性 三.Redis的快原因 四.Redis的应用场景 五.Redis的总结 由于Redis和分布式系统息息相关,因此我们需要先了解一下,分布式系统! 接下来就是分布式系统的演化过程。 单…...
H5与小程序:两者有何不同?
H5,即HTML5,是构建Web内容的一种语言描述方式,也是互联网的下一代标准,被认为是互联网的核心技术之一。HTML5是在HTML4.01的基础上进行了一定的改进后的规范,用户在使用任何手段进行网页浏览时看到的内容原本都是HTML格…...
计算机视觉、目标检测、视频分析的过去和未来:目标检测从入门到精通 ------ YOLOv8 到 多模态大模型处理视觉基础任务
文章大纲 计算机视觉项目的关键步骤计算机视觉项目核心内容概述步骤1: 确定项目目标步骤2:数据收集和数据标注步骤3:数据增强和拆分数据集步骤4:模型训练步骤5:模型评估和模型微调步骤6:模型测试步骤7:模型部署常见问题目标检测入门什么是目标检测目标检测算法的分类一阶…...
7月10日学习打卡,环形链表+栈OJ
前言 大家好呀,本博客目的在于记录暑假学习打卡,后续会整理成一个专栏,主要打算在暑假学习完数据结构,因此会发一些相关的数据结构实现的博客和一些刷的题,个人学习使用,也希望大家多多支持,有…...
鸿蒙语言基础类库:【@ohos.util.TreeSet (非线性容器TreeSet)】
非线性容器TreeSet 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 T…...
freemarker生成pdf,同时pdf插入页脚,以及数据量大时批量处理
最近公司有个需求,就是想根据一个模板生成一个pdf文档,当即我就想到了freemarker这个远古老东西,毕竟freemarker在模板渲染方面还是非常有优势的。 准备依赖: <dependency><groupId>org.springframework.boot</gr…...
勇攀新高峰|暴雨信息召开2024年中述职工作会议
7月8日至9日,暴雨信息召开2024年中述职工作会议,总结回顾了上半年的成绩和不足,本次会议采用线上线下的方式举行,公司各部门管理人员、前台市场营销人员参加述职,公司领导班子出席会议。 本次述职采取了现场汇报点评的…...
C++:filter2D函数简要概述
OpenCV中的filter2D函数是一个非常强大的工具,用于对图像进行卷积操作,从而应用各种线性滤波器。这个函数能够处理图像中的每个像素,通过将其与指定的卷积核(或称为滤波器)进行卷积运算,来修改图像的特性。…...
仿站网站开发/怎样建网站赚钱
机器学习:我们为什么要参数初始化为什么要初始化? 上图是一个神经网络的基本结构,深度学习的初始化参数指的是在网络训练之前,对各个节点的权重和偏置进行初始化的过程,很多时候我们以为这个初始化是无关紧要的&…...
网站建设项目策划书格式/seo关键词优化外包
http://www.oschina.net/news/73680/android-studio-widget?frommail-notify http://blog.csdn.net/s13383754499/article/details/79034490...
知行网站建设/百度推广怎么添加关键词
为什么80%的码农都做不了架构师?>>> 首先App端把上传的图片使用base64进行编码,然后传给后台PHP处理,再进行base64解码,然后再利用file_put_contents这个函数把它写入到文件夹里面即可,代码如下࿱…...
邯郸网站制作外包/百度关键词价格查询软件
题目: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “…...
旅游论坛网站建设/南京今天重大新闻事件
开源「高逼格」简历例句,看你有没有中招? 星期天下午,在浏览 GitHub 的时候,发现一个非常有意思的开源项目,是由 ResumeJob 整理贡献的,那就是一份程序员简历上常常使用的介绍和描述技能的例句。感觉写的很…...
建站平台社区/口碑优化
我们平时所见的打车app例如:滴滴打车,曹操专车......都是走的JT808协议,有人问为什么呢?小编告诉大家,原因是:国家有关部门规定,所有运营车辆必须接入这样的协议,实时监测车辆信息&a…...