当前位置:网站首页>Redis~Geospatial(地理空间)、Hyperloglog(基数统计)
Redis~Geospatial(地理空间)、Hyperloglog(基数统计)
2022-06-28 00:27:00 【明斯克开源】
获取西安的坐标——GEOPOS
127.0.0.1:6379> GEOPOS CHINA xian
- “108.94683212041854858”
“34.29296115814533863”
以经度120 纬度35位置为中心,获取半径1000千米内的城市——GEORADIUS
127.0.0.1:6379> GEORADIUS CHINA 120 35 1000 km
“beijing”
“shanghai”
获取在广州半径500千米内的城市——GEORADIUSBYMEMBER
127.0.0.1:6379> GEORADIUSBYMEMBER CHINA guangzhou 500 km
“shenzhen”
“guangzhou”
“hainan”
将广州和深圳的坐标转换为11为的GEO哈希值——GEOHASH
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
[](()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
边栏推荐
- TI AM3352/54/59 工业核心板硬件说明书
- TD Hero 线上发布会|7月2日邀你来
- Locust 性能测试 - 参数化,并发循环数据采样不重复
- Where can I open an account for foreign exchange futures? Which platform is safer for cash in and out?
- Dynamic Host Configuration Protocol
- Jenkins - 访问 Jenkins 自定义参数变量,处理变量值中含有空格
- pytorch_ lightning. utilities. exceptions. MisconfigurationException: You requested GPUs: [1] But...
- MySQL十种锁,一篇文章带你全解析
- Scala 基础 (三):运算符和流程控制
- Domain Name System
猜你喜欢

Original | 2025 to achieve the "five ones" goal! The four products of Jiefang power are officially released

1382. balancing binary search tree - General method

Cesium Click to draw polygons (dynamically draw polygons)

Cesium 获取屏幕所在经纬度范围

Differences between cesium polygon extrudedheight and height

Numpy----np.reshape()

Self supervised learning and drug discovery

STM32的通用定时器与中断

文件传输协议--FTP

图灵机启动顺序
随机推荐
To understand what is synchronous, asynchronous, serial, parallel, concurrent, process, thread, and coroutine
Cesium Click to draw polygons (dynamically draw polygons)
指南针股票开户是会有什么风险吗?指南针开户安全吗
Numpy----np.meshgrid()
pytorch_ lightning. utilities. exceptions. MisconfigurationException: You requested GPUs: [1] But...
Scoped attribute and lang attribute in style
Cesium 获取屏幕所在经纬度范围
Appium自动化测试基础— 补充:App的包名(appPackage)和启动名(appActivity)
Cesium Click to obtain longitude and latitude (2D coordinates)
fiddle如何使用代理
Jenkins - data sharing and transfer between copy artifact plug-in builds
Four classic training modes in comparative learning
树莓派实现温控风扇智能降温
STM32的通用定时器与中断
基于AM335X开发板 ARM Cortex-A8——Acontis EtherCAT主站开发案例
style中的scoped属性和lang属性
外盘期货哪里可以开户?哪个平台出入金比较安全?
Machine learning notes - time series as features
Locust 性能测试 - 参数化,并发循环数据采样不重复
Ti am3352/54/59 industrial core board hardware specification