您的当前位置:首页正文

Redis~Geospatial(地理空间)、Hyperloglog(基数统计)

2024-11-09 来源:个人技术集锦

获取西安的坐标——GEOPOS

127.0.0.1:6379> GEOPOS CHINA xian

以经度120 纬度35位置为中心,获取半径1000千米内的城市——GEORADIUS

127.0.0.1:6379> GEORADIUS CHINA 120 35 1000 km

  1. “beijing”

  2. “shanghai”

获取在广州半径500千米内的城市——GEORADIUSBYMEMBER

127.0.0.1:6379> GEORADIUSBYMEMBER CHINA guangzhou 500 km

  1. “shenzhen”

  2. “guangzhou”

  3. “hainan”

将广州和深圳的坐标转换为11为的GEO哈希值——GEOHASH

127.0.0.1:6379> GEOHASH CHINA guangzhou shenzhen

  1. “ws0e9cb3yj0”

  2. “ws10k0dcg10”

[](()Hyperloglog(基数统计)

-------------- 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ------------------------------------------------------------------

  • 在我们为网站统计访问量、日活量时,由于我们统计的是用户数量而非访问次数,因此即使一个用户多次访问也只会统计一次,这种不重复的数据通常被称为基数

  • 在传统的做法中,我们通常会采用set来保存用户的ID来进行计数,因为其本身存在着去重的功能,但是由于我们所需要的是对用户进行计数,如果通过将所有用户的ID保存的方法来完成,当用户量大的时候就会对内存产生巨大的压力,并且效率也大大降低。

  • 为了解决这个问题,Redis在2.8.9版本添加了HyperLogLog结构。

[](()实现原理

  • Redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

  • 在Redis 里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

  • HyperLogLog使用的是概率算法,通过存储元素的hash值的第一个1的位置,来计算元素数量,所以HyperLogLog 不会存储元素本身,在数据量大的时候也可能会存在一定的误差。但是在基数统计这一方面,它的效果是其他结构无法比拟的。

[](()使用

PFADD key value 添加指定的值到Hyperloglog中

PFCONUT key 返回给定Hyperloglog的基数估算值

PFMERGE destkey sourcekey 将目标Hyperloglog合并到源Hyperloglog中

127.0.0.1:6379> PFADD NUMS1 1 2 3 4 #向NUMS1插入1-4

(integer) 1

127.0.0.1:6379> PFADD NUMS1 1 #数据已存在,不再插入

(integer) 0

127.0.0.1:6379> PFCOUNT NUMS1 #查看当前基数数量

(integer) 4

127.0.0.1:6379> PFADD NUMS2 3 4 5 6 #向NUMS2插入3-6

(integer) 1

127.0.0.1:6379> PFMERGE NUMS1 NUMS2 #将NUMS2合并到NUMS1中

OK

127.0.0.1:6379> PFCOUNT NUMS1 #此时NUMS1中记录了1-6,六个元素

(integer) 6

[](()Bitmap(位图)

  • 位图其实就是哈希的变形,他通过哈希映射来处理数据,位图本身并不存储数据,而是存储标记。通过一个比特位,即0/1来标记一个数据的两种状态

  • 位图通常情况下用在数据量庞大,且数据不重复的情景下标记某个数据的两种状态。 我们可以使用位图来记录当前用户的登陆情况、或者实现打卡、签到等功能

[](()使用

GETBIT key offset value(0/1) 设置Bitmap中偏移量为offset的位置的值

SETBIT key offset value 返回Bitmap中偏移量为offset的位置的值

BITCOUNT key 计算位图中有多少个1

127.0.0.1:6379> SETBIT TEST 1 1 #将位图中第1,3,5位设置为1

(integer) 0

127.0.0.1:6379> SETBIT TEST 3 1

(integer) 0

127.0.0.1:6379> SETBIT TEST 5 1

(integer) 0

127.0.0.1:6379> GETBIT TEST 1 #查看位图中1,2,3位的值

(integer) 1

127.0.0.1:6379> GETBIT TEST 2

(integer) 0

127.0.0.1:6379> GETBIT TEST 3

显示全文