redis 三种特殊的数据类型geospatial 地理位置
hyperloglog 基数统计
bitmap 位图场景
【相关推荐:redis视频教程】
geospatial 地理位置redis 3.2 版本就推出了 geospatial
官方文档上可以详细的看到用法:
https://www.redis.net.cn/order/3685.html
geospatial 可以使用在如下场景:
附近的人打车计算距离朋友定位等一系列跟定位有关的场景geospatial 只有 六个命令
geoaddgeodistgeohashgeoposgeoradiusgeoradiusbymembergeoadd添加地理位置
有效的经度从-180度到180度。有效的纬度从-85.05112878度到85.05112878度。当坐标位置超出上述指定范围时,该命令将会返回一个错误。
geoadd key [nx|xx] [ch] longitude latitude member [longitude latitude member ...]添加经纬度,城市名
127.0.0.1:6379> geoadd city 113.087559 28.251818 changsha(integer) 1127.0.0.1:6379> geoadd city 114.064552 22.548457 shenzhen(integer) 1127.0.0.1:6379> geoadd city 104.087045 30.666416 chengdu(integer) 1127.0.0.1:6379> geoadd city 118.802422 32.064653 nanjing(integer) 1127.0.0.1:6379> geoadd city 106.558434 29.568996 chongqing(integer) 1127.0.0.1:6379> geoadd city 121.463615 31.195908 shanghai(integer) 1127.0.0.1:6379> geoadd city 117.208093 39.091103 tianjin(integer) 1
geoposgeopos key member [member ...]获取指定城市的经纬度信息
127.0.0.1:6379> geopos city changsha1) 1) "113.08755666017532349" 2) "28.25181827470789386"127.0.0.1:6379> geopos city tianjin1) 1) "117.20809489488601685" 2) "39.0911021322545551"
geodistgeodist key member1 member2 [m|km|ft|mi]其中有如下 4 个单位:
m :米
km:公里
ft:英尺
mi:英里
获取两个城市之间的距离
127.0.0.1:6379> geodist city changsha tianjin"1264101.6876"127.0.0.1:6379> geodist city changsha tianjin km"1264.1017"127.0.0.1:6379> geodist city changsha shenzhen km"641.9034"
geohashgeohash key member [member ...]返回一个或者多个geohash 表示的元素, 返回 11 个字符 geohash 字符串
127.0.0.1:6379> geohash city changsha1) "wt02tr5fg00"127.0.0.1:6379> geohash city changsha beijing1) "wt02tr5fg00"2) (nil)127.0.0.1:6379> geohash city changsha beijing tianjin chongqing1) "wt02tr5fg00"2) (nil)3) "wwgq7hk64t0"4) "wm7b0yc7zk0"
georadiusgeoradius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count [any]] [asc|desc] [store key] [stor指定经纬度作为原点,指定半径,查询在指定范围内的城市,这些城市都是在我们自己的集合里面
127.0.0.1:6379> georadius city 110 30 500 m(empty array)127.0.0.1:6379> georadius city 110 30 500 km1) "chongqing"2) "changsha"127.0.0.1:6379> georadius city 110 30 1000 km1) "chongqing"2) "chengdu"3) "shenzhen"4) "changsha"5) "nanjing"127.0.0.1:6379> georadius city 110 30 700 km withcoord1) 1) "chongqing" 2) 1) "106.55843228101730347" 2) "29.56899626404301529"2) 1) "chengdu" 2) 1) "104.08704489469528198" 2) "30.6664164635846177"3) 1) "changsha" 2) 1) "113.08755666017532349" 2) "28.25181827470789386"127.0.0.1:6379> georadius city 110 30 700 km withdist1) 1) "chongqing" 2) "335.6530"2) 1) "chengdu" 2) "572.3911"3) 1) "changsha" 2) "357.4711"127.0.0.1:6379> georadius city 110 30 700 km withhash1) 1) "chongqing" 2) (integer) 40260594356999312) 1) "chengdu" 2) (integer) 40261378317985063) 1) "changsha" 2) (integer) 4050903792284309
georadiusbymember
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count [any]] [asc|desc] [store key] [storedist key]找出位于指定元素周围的城市
127.0.0.1:6379> georadiusbymember city tianjin 1000 km1) "nanjing"2) "tianjin"3) "shanghai"127.0.0.1:6379> georadiusbymember city tianjin 500 km1) "tianjin"127.0.0.1:6379> georadiusbymember city tianjin 5000 km1) "chongqing"2) "chengdu"3) "shenzhen"4) "changsha"5) "shanghai"6) "nanjing"7) "tianjin"
geospatial 底层的原理就是使用 zset 有序集合来实现的,我们可以使用 zset 有序集合的命令来操作 geo ,咱们是用 zset 的指令来感受一波
127.0.0.1:6379> zrange city 0 -11) "chongqing"2) "chengdu"3) "shenzhen"4) "changsha"5) "shanghai"6) "nanjing"7) "tianjin"127.0.0.1:6379> zcard city(integer) 7
hyperloglog 基数统计基数是个啥?
基数,就是不重复的数,例如:
a = {1,2,3,4,5}
b = {2,3,4,5,6}
那么 a 和 b 的取并集的基数就是 6
简介
hyperloglog 是 redis 2.8.9 版本开始有的这种数据结构
redis hyperloglog 基数统计也是一种算法
例如有这样的应用场景:
网页访问人数统计,同一个用户多次访问网站,也是只算作 1
传统的方式是使用 set 集合的方式来保存 id,统计 set 里面 id 的个数,来计算人数
这种方式也没有问题,但是若数据量很大的时候,就会非常麻烦,因为我们拿 id 是没有用的,我们只需要计数而已
优点
hyperloglog 占用的内存空间是固定的,2^16 次方,只需要占用 12 kb 内存,从内存的角度来技术选型,hyperloglog 是首选哦
pfadd key element [element ...]向 hyperloglog 中添加一个或者多个元素
pfmerge destkey sourcekey [sourcekey ...]将多个 hyperloglog 取并集,得到一个结果 hyperloglog ,里面的数据是不会重复的
127.0.0.1:6379> pfadd myhash 1 2 3 4 5 6 7 8(integer) 1127.0.0.1:6379> pfadd myhash2 3 4 5 6 7 8 9 0 88 99(integer) 1127.0.0.1:6379> pfmerge res myhash myhash2ok127.0.0.1:6379> pfcount res(integer) 12127.0.0.1:6379> pfcount myhash(integer) 8127.0.0.1:6379> pfcount myhash2(integer) 10
bitmaps 位图场景bitmaps 位图,位存储
一般用于,统计用户信息,活跃,不活跃,
登录,不登录
打卡,不打卡 等等,两种状态
bitmaps 位图,也是一种数据结构,是操作二进制的方式来进行记录的,只有 0 和 1 两种状态
例如我们举个例子,来记录着一周每天的心情,1 是开心,0 是沮丧
setbit key offset value设置 bit 位的值
getbit key offset获取 bit 位的值
127.0.0.1:6379> setbit week 0 1(integer) 0127.0.0.1:6379> setbit week 1 1(integer) 0127.0.0.1:6379> setbit week 2 1(integer) 0127.0.0.1:6379> setbit week 3 0(integer) 0127.0.0.1:6379> setbit week 4 0(integer) 0127.0.0.1:6379> setbit week 5 1(integer) 0127.0.0.1:6379> setbit week 6 1(integer) 0127.0.0.1:6379> getbit week 6(integer) 1127.0.0.1:6379> getbit week 5(integer) 1
更多编程相关知识,请访问:编程视频!!
以上就是深入浅析redis中的三种特殊数据类型的详细内容。
