百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis07——Redis到底能用在什么地方(下)

mhr18 2024-11-21 17:52 26 浏览 0 评论

?

在前一篇文章中,我们已经介绍过Redis的一些实际应用。如KV缓存、分布式锁、消息队列,由于篇幅原因,并未介绍完全。接下来将继续为各位带来Redis的更多应用。

bitmat(位图)

实现

位图的基本思想是使用一个bit来表示一个映射关系,这样就能大大减小内存的使用。如一个用户一周的签到情况可以用以下方式来实现。

如果不用位图,而用int来实现的话,需要7个int的空间来存储,而使用位图后,一个int空间即可表示出用户一周的签到情况了。

常用指令

  1. setbit:设置位图值;
127.0.0.1:6379> setbit bitmapkey 2 1 // 指定数组位
(integer) 0

127.0.0.1:6379> setbit bitmapkeyk javamd // 不指定数组位
(integer) 0

Redis位数组是自动扩展的,如果设置了超出现有内容范围的位值,将会对位数组进行自动填充零的处理.

  1. getbit:获取位图值;
127.0.0.1:6379> getbit bitmapkey 2 // 指定数组位
(integer) 1

127.0.0.1:6379> getbit bitmapkeyk // 不指定数组位
"javamd"
  1. bitcount:位图统计;
127.0.0.1:6379> bitcount key 0 0 # 第一个字符串中1的位数
(integer) 1
  1. bitpos:位图查找;
127.0.0.1:6379> bitpos key 0 # 第一个0的位数
(integer) 3
127.0.0.1:6379> bitpos key 1 1 1 # 从第二个字符算起,第一个1位
(integer) 3
  1. bitfield:位图管道处理;bitfield有三个子指令,get、set、incrby,可以对指定位片段进行操作,单个指令最多只能处理64个连续位。

应用场景:用户签到、用户画像标签、大量整数排序等场景。

HyperLogLog

原理

  • 伯努利实验 :一次伯努利实验,抛硬币不管进行抛掷次数多少次,只要出现一个正面,就称之为为一次伯努利实验。伯努利实验存在一个关系:n = 2^(k_max) (n:伯努利实验次数,k_max: 抛掷次数最大的次数)。
  • 比特串:hash(key) = 比特串。通过取模、前m位比特值转化为十进制等方式,确定在哪个桶内。
  • 分桶:分桶是为了减少偶然误差性,可以理解为解决hash算法的hash冲突。

Redis中HyperLogLog用了16384个桶,即2^14,每个桶的k_max需要6个bit来存储,最大可以表示maxbits=63,一个HyperLogLog总内存占用量为(2^14)*6/8 = 12KB。

常用指令

  1. pfadd:添加基数;
  2. pfcount:统计基础数量;
  3. pfmerge:合并pf基数,形成一个新的pf。

应用场景

Redis HyperLogLog 的应用有以下特点:

  • 如果基数不大或数据量不大就不太适用,会有点大材小用浪费空间;
  • 有一定局限性——只能统计基数数量,而没办法去知道具体的内容是什么;
  • 和bitmap相比,属于两种特定统计情况,简单来说,HyperLogLog 去重比 bitmap 方便很多;
  • 一般可以bitmap和hyperloglog配合使用,bitmap标识哪些用户活跃,hyperloglog计数。

使用场景有以下场景:

  • 统计注册 IP 数;
  • 统计每日访问 IP 数;
  • 统计页面实时 UV 数;
  • 统计在线用户数。

Bloom Filter (布隆过滤器)

Redis从4.0起,开始支持Boolm Filter这种高级数据结构。

实现

布隆过滤器实际上就是由一个大型位数组和几个不一样的的无偏hash函数组成。

添加key步骤:

  1. 添加key时,会用多个hash函数对key进行hash取值;
  2. 然后用数组长度对hash值进行取模运算,得到对应的位置,每个hash函数都会得到一个不一样的位置;
  3. 同时对相应位置进行置1操作,即完成add操作。

查询key是否存在时,与add操作一致,查询对应位是否为1即可。如果有一个不为1,则说明key不存在,如果都为1,则说明key可能存在。key可能存在是因为,受数组长度影响产生的hash冲突,导致key可能存在。

应用场景

布隆过滤器可以用在以下场景:

  • 查询用户是否已经看过某条新闻;
  • 爬虫系统中,对URL进行去重操作;
  • 邮箱垃圾邮件过滤;
  • 防止缓存穿透(即一直在库里查询某个不存在的key,影响数据库性能)。

Geo

在地理位置中查询附近的点时,我们可以使用Redis的Geo模块来解决这一问题。

数据库查询附近的点

当两个地理坐标相差不是很远的情况下,我们可以使用勾股定理来计算元素间的距离。

通过数据库,当给定一个坐标,查询附近的其他地理点时,我们可以先选定指定一个半径范围,然后筛选出该半径范围内所有的坐标点,对坐标点与目标点进行勾股定理算距排序。

GeoHash算法

当高并发场景,数据库筛选的方法并不合适,这时我们可以使用Redis的Geo模块来解决这一问题。

算法实现:GeoHash算法,将地球表面看做一个平面,然后划分成等分的小方格(划分越小,坐标位置精度越高),将方格转换为二位数组来表示,如00,01,02…0n,10,11,12…1n,n0,n1,n2……nn。这样每一个坐标,都能用一个整数来表示,通过这个整数,就能还原出元素的坐标。GeoHash算法再将这个整数进行base32编码。

在Redis中,经纬度用52位整数进行编码,然后放入zset中。zset的value是元素id,score是52位整数值。通过zset的score排序,就可以得到指定坐标附近的其他元素。通过score即可将整数还原成具体的坐标值。

注意事项

在使用Redids 的Geo实现附近的人需要注意,由于该结构需要较大的内存,所以建议使用单独的Redis实例,不建议做主从复制。同时可以根据数据量按地理行政级别进行拆分。

限流

在Redis中,可以根据实际情况使用以下方式实现限流。

zset

对于系统限定某个用户的某个行为在一定时间内只能发生N次的情况,可以使用zset进行限流。

实现:将用户ID与动作key当做zset的key,使用时间戳,当zset的score,value保证唯一性即可。然后根据score圈定指定时间范围内的value,这样就能实现限定某个用户的某个行为在一定时间内只能发生N次的限流需求。

应用:zset限流可以用于以下情况:

  • 用户行为限流;
  • 数据推送频次限流。

Redis-Cell(漏斗限流)

Redis-Cell采用的是漏斗限流,漏斗容量是有限的,同时漏斗口大小是有限的,即有一个漏水速率。通过漏斗容量,漏斗速率,漏斗剩余空间,上一次漏水时间,我们就能实现一个完整的漏斗算法。Redis中初始化Redis-Cell方法如下:

# 限制用户在60秒时间内只能回复30次(漏水速率为30次/60S)
127.0.0.1:6379>cl.throttle keykey 15 30 60 1
1) (integer) 0   # 0 表示允许,1 表示拒绝
2) (integer) 15  # 漏斗容量
3) (integer) 14  # 漏斗剩余空间
4) (integer) -1  # 如果被拒绝了,需要多长时间再试
5) (integer) 2   # 多长时间后,漏斗能完全空出来

Redis系列推荐

Redis06——Redis到底能用在什么地方(上)

Redis05——Redis Cluster 如何实现分布式集群

Redis04——五分钟明白Redis的哨兵模式

Redis03——Redis是如何删除你的数据的

Redis02——Redis内存数据如何保存到磁盘

Redis01——Redis究竟支持哪些数据结构

相关推荐

【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...

Pure Storage推出统一数据管理云平台及新闪存阵列

PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...

对Java学习的10条建议(对java课程的建议)

不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...

SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!

官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...

JDK21有没有什么稳定、简单又强势的特性?

佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...

「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了

在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...

Java面试题及答案最全总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

数据库日常运维工作内容(数据库日常运维 工作内容)

#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...

分布式之系统底层原理(上)(底层分布式技术)

作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...

oracle 死锁了怎么办?kill 进程 直接上干货

1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...

SpringBoot 各种分页查询方式详解(全网最全)

一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...

《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略

《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...

LoadRunner(loadrunner录制不到脚本)

一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...

Redis数据类型介绍(redis 数据类型)

介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...

RMAN备份监控及优化总结(rman备份原理)

今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...

取消回复欢迎 发表评论: