我是靠谱客的博主 暴躁老师,最近开发中收集的这篇文章主要介绍Redis三种特殊数据类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

geospatial地理位置

朋友的定位,附近的人,打车距离计算?

Redis的Geo在Redis3.2版本就推出了,这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人

可以查询一些测试数据

6个命令

GEOADD

#getadd添加地理位置
#规则:两极无法直接添加,一般会下载城市数据,直接通过java程序一次性导入!
#参数,key,值(纬度、经度、名称)
127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen
(integer) 2
127.0.0.1:6379> GEOADD china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2

getpos
获得当前的定位:一定是一个坐标值

经度127.0.0.1:6379> GEOPOS china:city beijing	#获取指定的城市精度和纬度!
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> GEOPOS china:city beijing chongqing
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"

GEODIST :返回两个位置之间的距离

127.0.0.1:6379> GEODIST china:city beijing shanghai
"1067378.7564"
127.0.0.1:6379> GEODIST china:city beijing shanghai km	#查看北京到上海的距离,单位:km
"1067.3788"
127.0.0.1:6379> GEODIST china:city beijing chongqing km
"1464.0708"

GEORADIUS :以给定的经纬度为中心,找出某一半径内的元素

附近的人,获取所有人的地址,定位!通过半径来查询

获得指定数量的人,200

所有的数据都录入:china:city

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km	#以 110 30 这个经纬度为中心寻找方圆100km里内的城市
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqing"
2) "xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist
#显示到中心距离的位置
1) 1) "chongqing"
2) "341.9374"
2) 1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord	#显示他人的定位信息
1) 1) "chongqing"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"
2) 1) "xian"
2) 1) "108.96000176668167114"
2) "34.25999964418929977"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist withcoord count 1	#筛选出指定的结果
1) 1) "chongqing"
2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"

GEORADIUSBYMEMBER命令—找出位于指定范围内的元素,中心点是由给定的位置元素决定

127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1) "beijing"
2) "xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"

Redis GEOHASH命令 — 返回一个或多个位置元素的Geohash表示

该命令将返回11个字符的Geohash字符串

#将二维的经纬度转换为一维的字符串,如果两个字符串越接近,距离越近
127.0.0.1:6379> GEOHASH china:city beijing chongqing
1) "wx4fbxxfke0"
2) "wm5xzrybty0"

GEO底层的实现原理其实就是zset,可以使用zest命令操作geo

127.0.0.1:6379> ZRANGE china:city 0 -1	#查看地图中全部的元素
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"
6) "beijing"
127.0.0.1:6379> zrem china:city beijing	#移除指定元素
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "xian"
3) "shenzhen"
4) "hangzhou"
5) "shanghai"

Hyperloglog

什么是基数

A{1,3,5,7,9,7}

B{1,3,5,7,8}

基数(不重复的元素)=5,可以接受误差!

简介

Redis Hyperloglog基数统计的算法!

优点:占用的内存是固定的,2^64不同的元素的计数,只要废12KB内存!如果要从内存角度来比较的话Hyperloglog首选。

网页的UV(一个人访问一个网站多次,但是还是算作一个人!)

传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为标准判断

这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id;

0.81%错误率,统计UV任务,可以忽略不计!

测试使用

127.0.0.1:6379> PFADD mykey a b c d e f g h i j	#创建第一组元素mykey
(integer) 1
127.0.0.1:6379> PFCOUNT mykey	#统计mykey元素的基数数量
(integer) 10
127.0.0.1:6379> PFADD mykey2 i j z x c v b n m
(integer) 1
127.0.0.1:6379> PFCOUNT mykey2
(integer) 9
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2	#将mykey与mykey2进行合并,成为mykey3,此时是一个并集
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15

如果允许容错,一定可以使用Hyperloglog

如果不允许容错,就是用set或者自己的数据类型即可

Bitmap

位存储

统计用户信息,活跃,不活跃!登录,未登录!打卡,365打卡!两个状态的,都可以使用Bitmap!

Bitmap位图,数据结构!都是操作二进制为来进行记录,就只有0和1两个状态!

365天 = 365bit

测试

127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0

使用bitmap来记录周一到周日的打卡!

查看某一天是否有打卡!

127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0

统计操作,统计打卡的天数

127.0.0.1:6379> BITCOUNT sign	#统计这周的打卡记录
(integer) 3

最后

以上就是暴躁老师为你收集整理的Redis三种特殊数据类型的全部内容,希望文章能够帮你解决Redis三种特殊数据类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部