127.0.0.1:6379> GEOPOS CHINA xian
127.0.0.1:6379> GEORADIUS CHINA 120 35 1000 km
“beijing”
“shanghai”
127.0.0.1:6379> GEORADIUSBYMEMBER CHINA guangzhou 500 km
“shenzhen”
“guangzhou”
“hainan”
127.0.0.1:6379> GEOHASH CHINA guangzhou shenzhen
“ws0e9cb3yj0”
“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
位图其实就是哈希的变形,他通过哈希映射来处理数据,位图本身并不存储数据,而是存储标记。通过一个比特位,即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