起因:随着项目的进一步推广,数据量的增大,直接访问mysql数据库获取数据所使用的时间越来越长,为解决当前主要矛盾,决定引入redis非关系型数据库作为缓存层,使得数据并不能直接命中数据库,减少访问数据库带来的压力,从而加快运行速度。
1、Redis高级数据类型GEO&HyperLogLog详解
1.1. zset扩展类型geo
1.1.1. GEO功能介绍
GEO功能是在Redis 3.2版本后提供的,支持存储地理坐标的一个数据结构,可以用来做类似摇一摇,附近的人,周边搜索的功能
# 语法类型
geoadd key 经度 纬度 成员 [经度 纬度 成员...]
# geoadd命令必须以标准的x y member结构来接受参数,必须先输入经度后输入纬度
geoadd能够记录的坐标是有限:
- 非常接近两极的区域无法索引
- 精确的坐标限制是由 EPSG:900913等坐标系统定义
- 经度:-180到180度之间
- 纬度:-85.05112878到85.05112878度之间
- 如果超出这个范围则会报错
1.1.2. 新增和查询
# 添加一批城市
geoadd china:city 116.408 39.904 beijing 121.445 31.213 shanghai 113.265 23.108 guangzhou 114.109 22.544 shenzhen 108.969 34.285 xian 108.55 34.09 changan
# 查询
geopos china:city beijing shanghai
1.1.3.获得节点间距离
geodist china:city shanghai beijing km
unit:
- m : 米
- km :千米
- mi :英里
- ft : 英尺
- 默认是m
- 会有0.5%的误差
1.1.4. 周边搜索
georadius china:city 121.445 31.213 1300 km withdist withcoord
georadius china:city 121.445 31.213 1300 km withdist withcoord asc count 3
georadiusbymember china:city beijing 1300 km withdist withcoord asc count 3
- withdist : 返回节点距离
- withcoord : 带上坐标
#节点hash
geohash china:city xian changan
1) "wqj7p9ku9e0"
2) "wqj1yjgswk0"
1.1.5. 删除节点
zrem china:city changan
1.1.6. 业务实现
x y name1 x y nam2
x y canyin:123 x y canyin:456
1.2. hyperloglog
这个数据类型其实就做了一件事,统计不重复的数据量
比如要记录我们网站的UV量
sadd 20200208 1 2 3 4 5 6 5 4 3 2 1
scard 20200208
只用来存放基数
pfadd 20200207 1 2 3 4 5 6 5 4 3 2 1 #添加记录基数
pfadd 20200206 1 2 3 4 5 6 7 8 9 10
pfcount 20200206 #返回基数
pfmerge 202002 20200206 20200207 #pfmerge newkey sourcekey1 sourcekey2 合并生成了一个新key,原来的key不会消失
还有一个问题
- hyperloglog是一个基数估算算法,有一定误差的
- 误差值在0.81%
- hyperloglog的key占用空间很小只有12K,而你用set就需要把这些value都要保存,set存一年数据有多大
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
网友评论