redis 三种特殊数据类型

三种特性数据类型

geospatial

定位,附近的人,打车距离计算。

redis的geo在redis3.2版本就推出了。可推算地理位置的信息,两地之间的距离,方圆几里的人。

6个命令。

GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER

https://redis.io/commands/geoadd
# geoadd china:city 经度 纬度 城市
# 可通过程序将信息读取到redis中..

geoadd china 116.40 39.90 beijing
geoadd china:city 121.47 31.23 shanghai
geoadd china:city 120.16 30.24 hangzhou

# geopos 获取城市所在的经纬度
getpos china:city beijing
getpos china:city hangzhou beijing 

# geodist 获取两个位置之间的距离
# m 米, km 千米, mi 英里, ft 英尺

geodist china:city beijing shanghai km
geodist china:city beijing hangzhou km

# 需求:我附近的人?通过半径来查询。
# 获取指定数量的人。
# georaduis 以给定的经纬度为中心,找出某一半径内的元素
georadius china:city 110 30 1000 km # 当前经度110,维度30 获取半径1000km的城市

georadius china:city 110 30 500 km withdis # 获取到城市,距离

georadius china:city 110 30 500 km withcoord # 获取到城市,经纬度

georadius china:city 110 30 500 kim withdis withcoord count 1 # 获取500千米内一个城市,经纬度,距离,


# georadiusBymember 根据某个城市找到附近的城市
georadiusbymember china:city beijing 1000km # 找出北京附近1000km的城市

# geohash 返回一个或者多个位置元素的geohash表示
# 返回11个字符的geohash字符串
geohash china:city bejing shanghai

# geo的底层实现原理就是zset,可以使用zset来操作geo
# 具体见zset操作有序集合,


127.0.0.1:6379[1]> zrem china:city hangzhou
(integer) 1
127.0.0.1:6379[1]> zrange china:city 0 -1
1) "shanghai"
2) "beijing"

hyperloglogs

2.8.9 hyperloglog 数据结构
redis hyperloglog 基数统计的算法 (不重复)
优点:占用内存是固定的。2^64不同的元素的基数,只需要12kb内存。
网页的uv(一个人访问一个网站多次,但是还是算作一个人。)

传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为标准判断。
set的确定,用户id太长,太多。是为了计数。

测试使用
# 一组数
pfadd mykey a b c d e f g h i j
# 获取不重复长度
pfcount mykey
# new 
pfadd mykey2 i j z x c v b n m
# get len
pfcount mykey2
# 合成新的key 
pfmerge mykey 3 mykey my key2
# 两组key的合并后不重复字符的长度
pfcount mykey3

# demo

# 第一组数
127.0.0.1:6379[1]> pfadd key1 a b c d e f g
(integer) 1
127.0.0.1:6379[1]> pfcount key1
(integer) 7
# 第二组数
127.0.0.1:6379[1]> pfadd key2 e f g h i j k
(integer) 1
127.0.0.1:6379[1]> pfcount key2
(integer) 7
# 合成一组基数
127.0.0.1:6379[1]> pfmerge key3 key1 key2
OK
127.0.0.1:6379[1]> pfcount key3
(integer) 11

如果允许容错,可使用hyperloglog来进行网站访问统计。

不容错,使用set,或者自定义。

bitmap

# 位存储
# 统计疫情的感染人数 01 01 
# 统计用户信息 活跃,不活跃。登录,未登录。打卡。两个状态的都可使用bitMaps.
# 位图,也是一种数据库的。都是操作二进制位来进行记录。就只有0和1两个状态。

# setbit sign offset value 设置值
# getbit sign offset   获取值
# bitcount sign (start, end) 统计值为1的

# 打开demo,假设已经打开的为1,位打开的为0

# 设置周一到周天打开信息 0未打开,1已经打开
127.0.0.1:6379[1]> setbit sign 0 1
(integer) 0
127.0.0.1:6379[1]> setbit sign 1 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 2 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 3 1
(integer) 0
127.0.0.1:6379[1]> setbit sign 4 1
(integer) 0
127.0.0.1:6379[1]> setbit sign 5 0
(integer) 0
127.0.0.1:6379[1]> setbit sign 6 1
(integer) 0
# 获取打开信息 周六
127.0.0.1:6379[1]> getbit sign 5
(integer) 0
# 获取打卡信息 周末
127.0.0.1:6379[1]> getbit sign 6
(integer) 1
# 统计打卡的数量1
127.0.0.1:6379[1]> bitcount sign
(integer) 4
127.0.0.1:6379[1]> bitcount sign 0 6
(integer) 4

猜你喜欢

转载自blog.csdn.net/qq_44783283/article/details/111713187