Redis 高级数据结构业务实践

0、前言

本文所有代码可见 => 【gitee code demo】
本文会涉及 hyperloglog 、GEO、bitmap、布隆过滤器的介绍和业务实践

1、HyperLogLog

1.1、功能

基数统计(去重)

1.2、redis api

命令作用案例
PFADD key element [element ...]添加元素到keyPFADD websiteVisitors 192.168.1.1
PFADD websiteVisitors 192.168.1.2
如果HyperLogLog的内部估计值发生变化,返回1;否则返回0。
PFCOUNT key [key ...]统计key中的元素数量估算值PFCOUNT websiteVisitors
返回key中的元素数量估算值
PFMERGE newkey key1 key2 [keyn ...]合并key到新keyPFMERGE totalVisitors morningVisitors eveningVisitors
把两个不同时段的访客IP统计合并为一个总的统计,无返回值

1.3、与其他去重数据结构的对比

1.3.1、数据量小 hashset

可以精确地计数,存储数量的同时存储了数据本身,数据量大时会消耗大量内存

1.3.2、数据量中 bitmap

精确计数,相比于 hashset空间占用少,数据量大的情况下空间效率和速度不如 hyperloglog

1.3.3、数据量大 hyperloglog

速度快,占用内存小,但有标准偏差(redis默认 0.81)

1.4、实践:统计用户访问量(IP)

1.4.1、模拟用户访问

在这里插入图片描述

1.4.2、获取实时用户访问量

在这里插入图片描述

2、GEO

2.1、功能

快速存储、处理和查询地理空间数据

在Redis Geo中,每个地理位置都会被编码成一个Geohash值,并以此作为sorted set中的分值

2.2、redis api

命令作用案例
GEOADD key longitude latitude member [longitude latitude member ...]将给定的地理空间位置(经度、纬度和名称)添加到指定的key中GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城"
GEODIST key member1 member2 [unit]计算两个地点之间的距离,默认单位为米GEODIST city 天安门 长城 km
GEOPOS key member [member ...]返回经纬度GEOPOS city 天安门 故宫
GEOHASH key member [member ...]返回geohashGEOHASH city 天安门 故宫 长城
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC/DESC] [STORE key] [STOREDIST key]查找给定范围内的地点
WITHDIST:
将位置元素与中心之间的距离也一并返回WITHCOORD:
将位置元素的经度和维度也一并返回
COUNT 限定返回的记录数
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 desc
GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASCDESC] [STORE key] [STOREDIST key]同上GEORADIUS city 天安门 10 km withdist withcoord count 10 desc

2.3、实践:附近酒店推送

通过 java api 操作 Redis GEO

代码 demo

3、bitmap

3.1、功能

由0和1状态表现的二进制bit数组,用于状态统计,如 打卡、签到

3.2、redis api

命令作用案例
SETBIT key offset value设置Bitmap中指定位置的位值SETBIT mybitmap 5 1
GETBIT key offset获取Bitmap中指定位置的位值GETBIT mybitmap 5
BITCOUNT key [start end]计算Bitmap中设置为1的位的数量BITCOUNT mybitmap
BITPOS key bit [start] [end]找到Bitmap中第一个设置为0或1的位的位置BITPOS mybitmap 1
BITOP operation destkey key [key ...]对一个或多个Bitmap进行AND、OR、XOR和NOT操作BITOP AND destkey bitmap1 bitmap2

3.3、案例:签到功能

4、布隆过滤器 :bloom filter

4.1、原理

一个大型位数组和几个不同的均匀分布hash函数。用来判断某个数据是否存在

在这里插入图片描述

4.2、布隆过滤器误判率&为什么不建议删除key

因为布隆过滤器的每一个 bit 并不是独占的,很有可能多个元素共享了某一位

查询时,key-1的bit位可能被别的key置为1了

删除时,将key对应bit位置为0,可能导致其他映射到该位置的key也被删除

总结:布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加

4.3、案例:手写布隆过滤器防止缓存穿透

过滤器只过滤读操作

过滤器业务流程

在这里插入图片描述

过滤器业务代码

拦截了不存在的用户请求,防止了用户查询相关的缓存穿透

在这里插入图片描述

布隆过滤器实现

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/754955.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PortSip测试

安装PBX 下载 免费下载 PortSIP PBX 安装PBX,安装后,运行 ,默认用户是admin 密码是admin,然后配置IP 为192.168.0.189 设置域名为192.168.0.189 配置分机 添加分机,添加了10001、10002、9999 三个分机&#xff0c…

深度学习实验第T2周:彩色图片分类

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 目标 二、我的环境&#…

【Linux进程通信】进程间通信介绍、匿名管道原理分析

目录 进程通信是什么? 进程通信的目的 进程通信的本质 匿名管道:基于文件级别的通信方式 站在文件描述符角度-深度理解管道原理 进程通信是什么? 进程通信就是两个或多个进程之间进行数据层面的交互。 进程通信的目的 1.数据传输&#x…

已解决java.security.acl.LastOwnerException:无法移除最后一个所有者的正确解决方法,亲测有效!!!

已解决java.security.acl.LastOwnerException:无法移除最后一个所有者的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 1. 检查当前所有者数量 2. 添加新的所有者 3. 维…

mac Canon打印机连接教程

官网下载安装驱动: 选择打印机类型和mac系统型号下载即可 Mac PS 打印机驱动程序 双击安装 系统偏好设置 点击“”添加: OK可打印玩耍!! 备注: 若需扫描,下载扫描程序: 备注:…

设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性

# 适用于Windows系统 # 时间 : 2024-06-28 # 作者 : 三巧(https://blog.csdn.net/qq_39124701) # 文件名 : 设置小蓝熊的CPU亲和性、CPU优先级再设置法环的CPU亲和性.ps1 # 使用方法: 打开记事本,将所有代码复制到记事本中,保存文件时候修改文件后…

Hugging Face Accelerate 两个后端的故事:FSDP 与 DeepSpeed

社区中有两个流行的零冗余优化器 (Zero Redundancy Optimizer,ZeRO)算法实现,一个来自DeepSpeed,另一个来自PyTorch。Hugging FaceAccelerate对这两者都进行了集成并通过接口暴露出来,以供最终用户在训练/微调模型时自主选择其中之…

zabbix-server的搭建

zabbix-server的搭建 部署 zabbix 服务端(192.168.99.180) rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm cd /etc/yum.repos.d sed -i s#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix# zabbix.r…

关于FPGA对 DDR4 (MT40A256M16)的读写控制 4

关于FPGA对 DDR4 (MT40A256M16)的读写控制 4 语言 :Verilg HDL 、VHDL EDA工具:ISE、Vivado、Quartus II 关于FPGA对 DDR4 (MT40A256M16)的读写控制 4一、引言二、DDR4 SDRAM设备中模式寄存器重要的模式寄存…

Arduino - LED 矩阵

Arduino - LED 矩阵 Arduino - LED Matrix LED matrix display, also known as LED display, or dot matrix display, are wide-used. In this tutorial, we are going to learn: LED矩阵显示器,也称为LED显示器,或点阵显示器,应用广泛。在…

“Hello, World!“ 历史由来

布莱恩W.克尼汉(Brian W. Kernighan)—— Unix 和 C 语言背后的巨人 布莱恩W.克尼汉在 1942 年出生在加拿大多伦多,他在普林斯顿大学取得了电气工程的博士学位,2000 年之后取得普林斯顿大学计算机科学的教授教职。 1973 年&#…

C++ | Leetcode C++题解之第203题移除链表元素

题目: 题解: class Solution { public:ListNode* removeElements(ListNode* head, int val) {struct ListNode* dummyHead new ListNode(0, head);struct ListNode* temp dummyHead;while (temp->next ! NULL) {if (temp->next->val val) {…

小柴冲刺软考中级嵌入式系统设计师系列一、计算机系统基础知识(1)嵌入式计算机系统概述

flechazohttps://www.zhihu.com/people/jiu_sheng 小柴冲刺嵌入式系统设计师系列总目录https://blog.csdn.net/qianshang52013/article/details/139975720?spm1001.2014.3001.5501 根据IEEE(国际电气电子工程师协会)的定义,嵌入式系统是&q…

Linux高并发服务器开发(六)线程

文章目录 1. 前言2 线程相关操作3 线程的创建4 进程数据段共享和回收5 线程分离6 线程退出和取消7 线程属性(了解)8 资源竞争9 互斥锁9.1 同步与互斥9.2 互斥锁 10 死锁11 读写锁12 条件变量13 生产者消费者模型14 信号量15 哲学家就餐 1. 前言 进程是C…

哪吒汽车,正在等待“太乙真人”的拯救

文丨刘俊宏 在360创始人、哪吒汽车股东周鸿祎近日连续且着急的“督战”中,哪吒汽车(下简称哪吒)终究还是顶不住了。 6月26日,哪吒通过母公司合众新能源在港交所提交了IPO文件,急迫地希望成为第五家登陆港股的造车新势力…

uniapp中实现瀑布流 短视频页面展示

直接上干货 第一部分为结构 <swiper class"list" :currentindex change"swiperchange" scrolltolower"onReachBottom"><swiper-item style"overflow: scroll;" v-for"(item,index) in 2" :key"index"&g…

DataV大屏组件库

DataV官方文档 DataV组件库基于Vue &#xff08;React版 (opens new window)&#xff09; &#xff0c;主要用于构建大屏&#xff08;全屏&#xff09;数据展示页面即数据可视化&#xff0c;具有多种类型组件可供使用&#xff1a; 源码下载

Golang | Leetcode Golang题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; func countPrimes(n int) int {primes : []int{}isPrime : make([]bool, n)for i : range isPrime {isPrime[i] true}for i : 2; i < n; i {if isPrime[i] {primes append(primes, i)}for _, p : range primes {if i*p > n {break}…

智能交通(1)——杭州交通数据集

赛题简介 在本地赛题中&#xff0c;参赛团队需要在平台提供的仿真交通场景下&#xff0c;通过算法模型驱动交通信号灯&#xff0c;以在各种交通状况&#xff08;高峰期、雨天等&#xff09;下都能最大程度地服务车辆&#xff0c;使其在模拟环境中获得综合最大得分。 数据集 …

Docker 部署 MariaDB 数据库 与 Adminer 数据库管理工具

文章目录 MariaDBmariadb.cnf开启 binlog Adminerdocker-compose.ymlAdminer 连接 MariaDB MariaDB MariaDB是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是MySQL的一个分支和替代品。 官网&#xff1a;https://mariadb.com/镜像&#xff…