Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用 (4)

安装 GLIBC依赖,不装GLIBC可能会出现配置完成 reids-cell ,reids服务缺少依赖启动不成功。

// 下载 glibc 压缩包 wget // 解压 glibc 压缩包 tar -zxvf glibc-2.18.tar.gz // 进入解压后的目录 cd glibc-2.18 // 创建编译目录 mkdir build // 进入到创建好的目录 cd build/ // 编译、安装 ../configure --prefix=http://www.likecs.com/usr --disable-profile --enable-add-ons --with-headers=http://www.likecs.com/usr/include --with-binutils=http://www.likecs.com/usr/bin //这步会比较慢 make -j 8 make install

接下来修改 redis.conf 文件,加载额外的模块

loadmodule /home/redis-6.2.1/redis-cell/libredis_cell.so

然后,启动 Redis:

redis-server redis.conf

redis 启动成功后,如果存在 CL.THROTTLE 命令,说明 redis-cell 已经安装成功了。

CL.THROTTLE 命令使用

该命令一共有五个参数:

第一个参数是 key

第二个参数是漏斗的容量

时间窗内可以操作的次数

时间窗

每次漏出数量

执行完成后,返回值也有五个:

第一个 0 表示允许,1表示拒绝

第二个参数是漏斗的容量

第三个参数是漏斗的剩余空间

如果拒绝了,多长时间后,可以再试

多长时间后,漏斗会完全空出来

命令示例

127.0.0.1:6379> CL.THROTTLE taoguoguo-publish 10 10 60 1 1) (integer) 0 2) (integer) 11 3) (integer) 10 4) (integer) -1 5) (integer) 6 4.客户端Lettuce拓展

定义一个Redis命令拓展接口,可通过命令描述在客户端自由拓展Redis的命令

package org.taoguoguo; import io.lettuce.core.dynamic.Commands; import io.lettuce.core.dynamic.annotation.Command; import java.util.List; /** * @author taoguoguo * @description RedisCommandInterface Redis漏斗限流拓展接口 * @website https://www.cnblogs.com/doondo * @create 2021-04-22 15:29 */ public interface RedisCommandInterface extends Commands { @Command("CL.THROTTLE ?0 ?1 ?2 ?3 ?4") List<Object> throttle(String key, long init, long count, Long period, Long quota); }

命令调用

package org.taoguoguo; import io.lettuce.core.RedisClient; import io.lettuce.core.api.StatefulRedisConnection; import io.lettuce.core.dynamic.RedisCommandFactory; import java.util.List; /** * @author taoguoguo * @description ThrottleTest * @website https://www.cnblogs.com/doondo * @create 2021-04-22 15:32 */ public class ThrottleTest { public static void main(String[] args) { RedisClient redisClient = RedisClient.create("redis://123456@172.20.10.2"); StatefulRedisConnection<String, String> connect = redisClient.connect(); RedisCommandFactory factory = new RedisCommandFactory(connect); RedisCommandInterface commands = factory.getCommands(RedisCommandInterface.class); List<Object> list = commands.throttle("taoguoguo", 10L, 10L, 60L, 1L); System.out.println(list); } } Redis Geo

Redis3.2 开始提供了 GEO 模块。该模块也使用了 GeoHash 算法

1.Geo Hash算法

核心思想:GeoHash 是一种地址编码方法,使用这种方式,能够将二维的空间经纬度数据编码成一个一维字符串。

地球上经纬度的划分:以经过伦敦格林尼治天文台旧址的经线为 0 度经线,向东就是东经,向西就是西经。如果我们将西经定
义负,经度的范围就是 [-180,180]。纬度北纬 90 度到南纬 90 度,如果我们将南纬定义负,则纬度的范围就是 [-90,90]。

接下来,以本初子午线和赤道为界,我们可以将地球上的点分配到一个二维坐标中:

Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用

GeoHash 算法就是基于这样的思想,划分的次数越多,区域越多,每个区域中的面积就更小了,精确度就会提高。

GeoHash 具体算法:

​ 以北京天安门广场为例(39.9053908600,116.3980007200)

纬度的范围在 (-90,90) 之间,中间值为 0,对于 39.9053908600 值落在 (0,90),因此得到的值为 1

(0,90) 的中间值为 45,39.9053908600 落在 (0,45) 之间,因此得到一个 0

(0,45) 的中间值为 22.5,39.9053908600 落在 (22.5,45)之间,因此得到一个 1

......

这样,我们得到的纬度二进制是 101,按照同样的步骤,我们可以算出来经度的二进制是 110

接下来将经纬度合并(经度占偶数位,纬度占奇数位):111001

按照 Base32 (0-9,b-z,去掉 a i l 0)对合并后的二进制数据进行编码,编码的时候,先将二进制转换为
十进制,然后进行编码。

将编码得到的字符串,可以拿去 geohash.org 网站上解析

GeoHash 有哪些特点:

用一个字符串表示经纬度

GeoHash 表示的是一个区域,而不是一个点

编码格式有规律,例如一个地址编码之后的格式是 123,另一个地址编码之后的格式是 123456,从字符串上就可以看出来,123456 处于 123 之中。

2.Redis 中的使用

经纬度查询网站:

添加地址:

GEOADD city 116.3980007200 39.9053908600 beijing GEOADD city 114.0592002900 22.5536230800 shenzhen

查看两个地址之间的距离:

127.0.0.1:6379> GEODIST city beijing shenzhen km "1942.5435"

获取元素的位置:

127.0.0.1:6379> GEOPOS city beijing 1) 1) "116.39800339937210083"  2) "39.90539144357683909"

获取元素 hash 值:

127.0.0.1:6379> GEOHASH city beijing 1) "wx4g08w3y00"

通过 hash 值可以查看定位。

查看附近的人:

127.0.0.1:6379> GEORADIUSBYMEMBER city beijing 200 km count 3 asc 1) "beijing"

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzdxwg.html