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

Redis自学之路—高级数据结构具体方法解析(六)

目录

简介

高级数据结构具体方法解析

Bitmaps 位图

操作命令

setbit设置值

getbit获取值

bitcount获取Bitmaps指定范围值位1的个数

bitop Bitmaps间的运算

bitpos计算Bitmaps中第一个值为targetBit的偏移量

Bitmaps优势

布隆过滤器

布隆过滤器的误判问题

优化方案

优缺点

应用场景

Redis中的布隆过滤器

redisson

HyperLogLog

特点优势

应用场景

基本原理

操作命令

pfadd添加元素

pfcount统计总数

pfmerge计算多个HyperLogLog的并集

GEO

操作命令

geoadd 增加/更新地理位置信息

geopos 获取地理位置信息

geodist 获取两个地理位置的距离

georadius获取指定位置范围内的地理信息位置集合

georadiusbymember 获取指定范围内的地理位置集合

geohash 指定地理位置的geohash字符串表示

geodel 删除地理位置信息


简介

本文章来学习和实践一下Redis的高级数据结构,主要包含有BitMaps、HyperLogLog、GEO三个数据结构。

高级数据结构具体方法解析

Bitmaps 位图

        Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。

        Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫做偏移量。

操作命令

setbit设置值

setbit key offset value

设置键的第offset个位的值(从0算起)。

getbit获取值

getbit key offset

 获取键的第offset位的值(从0开始算)。

bitcount获取Bitmaps指定范围值位1的个数

bitcount key [start end]

start:偏移量

end:偏移量

将偏移量(下标)为0的值改为0,则统计出来范围值为1的个数就会减少

bitop Bitmaps间的运算

bitop operation destkey key [key ...]

bitop是一个符合操作,它可以做多个Bitmaps的and(交集)or(并集)not(非)xor(异或)操作并将结果保存在destkey中。

bitpos计算Bitmaps中第一个值为targetBit的偏移量

bitpos key bit [start] [end]

  • key:位图的键名。
  • bit:要查找的位值,只能是 0 或 1。
  • START(可选):开始搜索的偏移量。
  • END(可选):结束搜索的偏移量。

命令返回第一个匹配指定值的位的偏移量。如果未找到匹配的位,且未指定 START 和 END 参数,则返回 -1。如果指定了 START 和 END,但在该范围内未找到匹配的位,则返回一个大于 END 的值(这实际上是Redis的一种约定,表示未找到)。

Bitmaps优势

假设网站有1亿用户,每天独立访问的用户有5千万,如果每天用集合类型和 Bitmaps分别存储活跃用户,很明显,假如用户id是Long型,64位,则集合类型占据的空间为64位x50 000 000= 400MB,而Bitmaps则需要1位×100 000 000=12.5MB,可见Bitmaps能节省很多的内存空间。

布隆过滤器

用来判断一个元素是否在一个集合中。

布隆过滤器是由一个很长的二进制向量(位数组)和一系列哈希函数组成。它主要用于判断一个元素是否存在于一个集合中,查询结果有两种:

  1. 这个元素可能存在于这个集合当中。
  2. 这个元素一定不存在于这个集合当中。

工作原理:

        1.位数组:布隆过滤器使用一个长度为m的位数组,每一位都初始化为0。这些将用于表示元素的存在情况。

        2.哈希函数:布隆过滤器配备了k个独立的哈希函数。每个哈希函数都会为输入的元素生成一个0到m-1之间的索引值,也就是将元素“映射”到位数组中的某个位置。

当将一个元素添加到布隆过滤器时,k个哈希函数会为该元素生成k个不同的索引值,并将位数组中的这k个位置设置为1。查询某个元素是否存在时,布隆过滤器会使用相同的k个哈希函数生成对应的k个索引值,并检查位数组中的这些位置是否都为1.如果都为1,则表示该元素可能存在;如果有任何一位为0,则可以确定该元素不存在。

布隆过滤器的误判问题

通过hash计算在数组上不一定在集合

本质是hash冲突

通过hash计算不在数组的一定不在集合(误判)

优化方案

增大数组(预估适合值)

增加hash函数

优缺点

<

http://www.kler.cn/a/407092.html

相关文章:

  • MySQL学习/复习10视图/用户/权限/语言连接数据库
  • Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
  • Lua 实现继承的一种方式
  • PDF电子发票信息转excel信息汇总
  • 云服务器部署WebSocket项目
  • 大数运算(加减乘除和输入、输出模块)
  • <硬件有关> 内存攒机认知入门,内存的选择 配置 laptop PC 服务器
  • Wekan看板安装部署与使用介绍
  • 使用OpenSSL创建CA,并基于CA创建证书
  • ctfshow
  • 彻底理解Redis的持久化方式
  • type和interface的区别
  • 蓝队基础,网络七杀伤链详解
  • [C语言]第十三节 指针一基础知识到高级技巧的全景探索
  • BERT的中文问答系统39
  • 4644 DCDC电源芯片在相控阵雷达的应用(完整版)
  • Metasploit模块具体有哪些?
  • Dubbo集成SpringBoot实现远程服务调用
  • Flink Transformation - 转换算子全面解析
  • YOLOv11融合针对去雾场景的DEA-Net中的细节增强注意力模块及相关改进思路
  • [C/C++][FFmpeg] 关于avcodec_send_frame(encoder_ctx, NULL) 的解释
  • 力扣-Hot100-图论【算法学习day.38】
  • 基于Java Springboot高校教务管理系统
  • 【编程题目】列表、元组及集合
  • 【话题】Bug 故事:跨时区的时间转换错误
  • python运动统计 2024年9月python二级真题 青少年编程电子学会编程等级考试python二级真题解析