高可用Redis(六):瑞士军刀之bitmap,HyperLoglog和GEO (2)

运行如下python代码:

import redis import time client = redis.StrictRedis(host='192.168.81.101',port=6379) key = 'unique' start_time = time.time() for i in range(1000000): client.pfadd(key,i)

等待python代码运行完成,再次查看Redis占用的内存数

127.0.0.1:6379> info ...省略 # Memory used_memory:849992 used_memory_human:830.07K used_memory_rss:5939200 used_memory_rss_human:5.66M used_memory_peak:924056 used_memory_peak_human:902.40K total_system_memory:1023938560 total_system_memory_human:976.50M used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:6.99 mem_allocator:jemalloc-3.6.0 ...省略

可以看到,使用hyperloglog向redis中存入100万条数据,需占用的内存为

830.07K - 813.99K约为16k

占用的内存很少。

当然天下没有免费的午餐,hyperloglog也有非常明显的局限性

首先,hyperloglog有一定的错误率,在使用hyperloglog进行数据统计的过程中,hyperloglog给出的数据不一定是对的 按照维基百科的说法,使用hyperloglog处理10亿条数据,占用1.5Kb内存时,错误率为2% 其次,没法从hyperloglog中取出单条数据,这很容易理解,使用16KB的内存保存100万条数据,此时还想把100万条数据取出来,显然是不可能的 2.4 HyperLoglog注意事项

使用hyperloglog进行数据统计时,需要考虑三个因素:

1.是否需要很少的内存去解决问题, 2.是否能容忍错误 3.是否需要单条数据 3.GEO 3.1 GEO简介

GEO即地址信息定位
可以用来存储经纬度,计算两地距离,范围计算等

高可用Redis(六):瑞士军刀之bitmap,HyperLoglog和GEO

如上图中,计算北京到天津两地之间的距离

3.2 GEO常用命令 3.2.1 geoadd命令 geoadd key longitude latitude member [longitude latitude member...] 增加地理位置信息

高可用Redis(六):瑞士军刀之bitmap,HyperLoglog和GEO

如上图是5个城市经纬度相关数据

127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing # 添加北京的经纬度 (integer) 1 127.0.0.1:6379> geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02 shijiazhuang # 添加天津和石家庄的经纬度 (integer) 2 127.0.0.1:6379> geoadd cities:locations 118.01 39.38 tangshan 115.29 38.51 baoding # 添加唐山和保定的经纬度 (integer) 2 3.2.2 geppos命令 geopos key member [member...] 获取地理位置信息

例子:

127.0.0.1:6379> geopos cities:locations tianjin # 获取天津的地址位置信息 1) 1) "117.12000042200088501" 2) "39.0800000535766543" 3.2.3 geodist命令 geodist key member1 member2 [unit] 获取两个地理位置的距离,unit:m(米),km(千米),mi(英里),ft(尺)

例子:

127.0.0.1:6379> geodist cities:locations tianjin beijing km "89.2061" 127.0.0.1:6379> geodist cities:locations tianjin baoding km "170.8360" 3.2.4 georadius命令和georadiusbymember命令 georedius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key][storedist key] georadiusbymember key member radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key][storedist key] 获取指定位置范围内的地理位置信息集合 withcoord:返回结果中包含经纬度 withdist:返回结果中包含距离中心节点位置 withhash:返回结果中包含geohash COUNT count:指定返回结果的数量 asc|desc:返回结果按照距离中心节点的距离做升序或者降序 store key:将返回结果的地理位置信息保存到指定键 storedist key:将返回结果距离中心节点的距离保存到指定键

例子:

127.0.0.1:6379> georadiusbymember cities:locations beijing 150 km # 获取距离北京150km范围内的城市 1) "beijing" 2) "tianjin" 3) "tangshan" 4) "baoding" 3.3 GEO相关说明 Redis的GEO功能是从3.2版本添加 geo功能基于zset实现 geo没有删除命令 3.3.1 使用zrem命令来进行geo的删除操作

命令:

zrem key member

例子:

127.0.0.1:6379> georadiusbymember cities:locations beijing 150 km 1) "beijing" 2) "tianjin" 3) "tangshan" 4) "baoding" 127.0.0.1:6379> zrem cities:locations baoding (integer) 1 127.0.0.1:6379> georadiusbymember cities:locations beijing 150 km 1) "beijing" 2) "tianjin" 3) "tangshan" 3.4 GEO的应用场景 微信摇一摇

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

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