安装 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.confredis 启动成功后,如果存在 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 GeoRedis3.2 开始提供了 GEO 模块。该模块也使用了 GeoHash 算法
1.Geo Hash算法核心思想:GeoHash 是一种地址编码方法,使用这种方式,能够将二维的空间经纬度数据编码成一个一维字符串。
地球上经纬度的划分:以经过伦敦格林尼治天文台旧址的经线为 0 度经线,向东就是东经,向西就是西经。如果我们将西经定
义负,经度的范围就是 [-180,180]。纬度北纬 90 度到南纬 90 度,如果我们将南纬定义负,则纬度的范围就是 [-90,90]。
接下来,以本初子午线和赤道为界,我们可以将地球上的点分配到一个二维坐标中:
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"