Redis——Redis的常见高级工具和其应用场景

1、延时队列

1.1、应用场景

  • 订单支付失败,每隔一段时间提醒用户
  • 用户并发量的情况,可以延时2分钟给用户发短信

1.2、如果队列空了?

**答:**客户端是通过队列的 pop 操作来获取消息,然后进行处理。处理完了再接着获取消息, 再进行处理。如此循环往复,这便是作为队列消费者的客户端的生命周期。

1.3、队列延迟

答: 用上面睡眠的办法可以解决问题。同时如果只有 1 个消费者,那么这个延迟就是 1s。如果有多个消费者,这个延迟会有所下降,因为每个消费者的睡觉时间是岔开来的。

解决办法

答: 那就是 blpop/brpop。这两个指令的前缀字符 b 代表的是 blocking,也就是阻塞读。阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消 息的延迟几乎为零。用blpop/brpop 替代前面的lpop/rpop,就完美解决了上面的问题。

1.4、空闲连接自动断开

答: 如果线程一直阻塞在哪里,Redis的客户端连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用。这个时候 blpop/brpop 会抛出异常来。

2、位图

答: 位图是由多个二进制位组成的数组,数组中的每个二进制位都有与之对应的偏移量(从 0 开始),通过这些偏移量可以对位图中指定的一个或多个二进制位进行操作。

在这里插入图片描述

应用场景

  • 用户行为记录器: 用用户ID 作为偏移量,若用户做了某种行为则通过SETBIT将二进制位设置为 1,通过 GETBIT 判断用户是否做了某种行为,通过 BITCOUNT 可以知道有多少用户执行了行为。
  • 用户上线统计: 可以使用 SETBITBITCOUNT 来实现,以用户 ID 作为 key ,假设今天是上线统计功能开放的第一天,ID为 1 的用户上线后就通过 SETBIT 1 0 1。当要计算此用户的总共以来的上线次数时,使用 BITCOUNT 命令就可以得出的结果。

3、HyperlogLog

答:Redis每个键占用的内容都是 12K,理论存储近似接近 2^64 个值,不管存储的内容是什么。这是一个基于基数估计的算法,只能比较准确的估算出基数,可以使用少量固定的内存去存储并识别集合中的唯一元素。但是这个估算的基数并不一定准确,是一个带有 0.81% 标准错误(standard error)的近似值。 但是,也正是因为只有 12K 的存储空间,所以,它并不实际存储数据的内容。

应用场景

答: 鉴于 HyperLogLog 不保存数据内容的特性,所以,它只适用于一些特定的场景。我这里给出一个最常遇到的场景需要:计算日活、7日活、月活数据

分析:如果我们通过解析日志,把 Ip 信息(或用户Id)放到集合中,例如:HashSet。如果数量不多则还好,但是假如每天访问的用户有几百万。无疑会占用大量的存储空间。且计算月活时,还需要将一个整月的数据放到一个 Set 中,这随时可能导致我们的程序 OOM

4、布隆过滤器

答:bloomfilter就类似于一个hashSet,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。布隆过滤器的关键就在于**hash**算法和容器大小。如下所示:

在这里插入图片描述

4.1、应用场景

答: 准确快速的判断某个数据是否在大数据量集合中,并且不占用内存。

4.2、添加数据

介绍概念的时候,我们说可以将布隆过滤器看成一个容器,那么如何向布隆过滤器中添加一个数据呢?

答: 如下图所示:当要向布隆过滤器中添加一个元素key时,我们通过多个hash函数,算出一个值,然后将这个值所在的方格置为1。

比如,下图hash1(key)=1,那么在第2个格子将0变为1(数组是从0开始计数的),hash2(key)=7,那么将第8个格子置位1,依次类推。

在这里插入图片描述

4.3、优缺点

优点: 优点很明显,二进制组成的数组,占用内存极少,并且插入和查询速度都足够快。

缺点: 随着数据的增加,误判率会增加;还有无法判断数据一定存在;另外还有一个重要缺点,无法删除数据

5、限流

5.1、简单限流

答: 限流需求中存在一个滑动时间窗口,适用 zset 数据结构的 score 值,可以通过 score来圈出这个时间窗口。而且我们只需要保留这个时间窗口,窗口之外的数据都 可以删除。每一个行为到来时,都维护一次时间窗口。将时间窗口外的记录全部清理掉,只保留窗口内的记录。zset集合中只有 score 值非常重要,value 值没有特别的意义,只需要保证它是唯一的就可 以了。

在这里插入图片描述

5.2、漏斗限流

答: 漏斗(funnel )限流是最常用的限流方法之一 。

漏洞的容量是有限的,如果将漏嘴堵住,然后一直往里面灌水,它就会变满,直至再也装不进去。如果将漏嘴放开,水就会往下流,流走一部分之后,就又可以继续往里面灌水。如果漏嘴流水的速率大于灌水的速率,那么漏斗永远都装不满。如果漏嘴流水速率小于灌水的速率,那么一旦漏斗满了,灌水就需要暂停并等待漏斗腾空。所以,漏斗的剩余空间就代表着当前行为可以持续进行的数量,漏嘴的流水速率代表着系统允许该行为的最大频率。

6、大海捞针——SCAN 系列命令注意事项

  • SCAN的参数没有key,因为其迭代对象是DB内数据;
  • 返回值都是数组,第一个值都是下一次迭代游标;
  • 时间复杂度:每次请求都是O(1),完成所有迭代需要O(N)N是元素数量;
  • 可用版本:version >= 2.8.0

7、GeoHash

答:Redis3.2版本之后,新增了地理位置Geo模块。

应用场景

  • 附近的Mobike
  • 美团和饿了么的“附近的餐馆”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RedisBloom是Redis的一个模块,它提供了四种数据结构:可伸缩的Bloom过滤器、布谷鸟过滤器、最小计数草图和Top-K。这些数据结构可以在极高的内存效率下实现完美的精度,因此非常适用于处理大数据和高并发场景。RedisBloom模块可以通过Redis的Module功能进行安装和使用。你可以通过访问Redis的官方网站或布隆过滤器的GitHub网站获取更多关于RedisBloom的详细信息和安装指南。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [RedisBloom:Redis的概率数据类型模块](https://download.csdn.net/download/weixin_42110362/18167943)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Redis07:布隆过滤器RedisBloom](https://blog.csdn.net/weixin_40964170/article/details/113603974)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Redis系列之 ——Bloom(布隆过滤器)](https://blog.csdn.net/m0_46693411/article/details/106058124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值