Redis系列之进阶篇(下)

Redis系列之进阶篇(下)

前言

	上一期我们学习了Redis的一些高级应用,今天我们来继续学习Redis的高级技术。

这篇文章主要内容是:

  • 布隆过滤器

  • 限流

  • GeoHash

  • Scan

    本文所学知识点过多,请做好实践。

1. 布隆过滤器

​ 布隆过滤器是一种高级数据结构,专门用于解决去重和检测某个对象是否存在的问题。

​ 布隆过滤器就像一个不怎么精确的set结构,当你使用它的contains方法判断某个对象是否存在时,它可能会误判。布隆过滤器实际上并不是特别不精确,只是会有较小的误判概率。

​ 所谓的误判就是:当布隆过滤器说某个值不存在的时候,那么这个值就一定不存在;当它说一个值存在的时候,那么这个值可能存在,也可能不存在。之所以出现误判,不过是因为这个值和它知道的某个值比较相似。

1.1 简单使用

​ Redis4.0提供了插件功能,布隆过滤器作为一个插件加载到Redis Server中,给Redis提供了强大的布隆去重功能。

​ 布隆过滤器有两个基本指令,bf.add和bf.exists。bf.add添加元素,bf.exists查询元素是否存在。

	> bf.add user keben
	> bf.add user zhangsan
	> bf.add user zhaosi
	> bf.exists user keben
	> bf.madd user xiaoming zhangwu wanger			# 批量添加
	> bf.mexists user xiaoming zhangwu wanger		# 批量判断是否存在

1.2 自定义参数

​ Redis提供了自定义参数的布隆过滤器,来降低误判率,只需要在add之前使用bf.reserve指令创建。如若对应的key已经存在,bf.reserve会报错。

​ bf.reserve有三个参数,分别是key,error_rate(错误率)和initial_size。

​ error_rate越低,需要的空间越大。

​ initial_size表示预计放入的元素数量,当实际数量超过这个数值时,误判率会上升。

1.3 原理概括

​ 每个布隆过滤器对应到Redis的数据结构里面就是一个大型的位数组和几个不一样的无偏hash函数。所谓无偏就是能够把元素的hash值算的比较均匀,让元素被hash映射到位数组中的位置比较随机。

​ 向布隆过滤器插入key的时候,会对key进行hash,获取一个整数索引,然后对位数组长度进行取模运算获取一个位置。再把位数组的这几个位置都置为1。

​ 向布隆过滤器查询是否存在的时候,和add是相同,也会把hash的几个位置都算出来,看看位数组中这几个位是否都为1,只要有一个位为0,说明布隆过滤器中这key不存在。如果几个位置都为1,并不能说明这个key就一定存在,因为这些位被置为1可能是因为其他key导致的。

Redis系列之进阶篇(下)_第1张图片

2. 限流

​ 限流算法在分布式领域下是一个经常被提起的话题,当系统的处理能力有限时,如何阻止计划外的请求继续对系统施压,这是一个需要重视的问题。除了控制流量,限流还有一个应用目的是控制用户行为,避免垃圾请求。

注意Redis中

你可能感兴趣的:(Redis,redis,进阶)