Redis篇之三种特殊的数据类型

三种特殊的数据类型

1、Geospatial(地理位置)

介绍:Redis3.2 版本开始推出的Geospatial,可以推算地理位置的信息,两地之间的距离,方圆几里的人。常用于:定位、附近的人、距离计算。

1.1、基本命令

命令 用途
GEOADD key 经度 纬度 地点名称 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中
GEOPOS key 地点名称 从key里返回所有给定位置元素的位置(经度和纬度)
GEODIST key 地点1 地点2 单位 返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在, 那么命令返回空值
GEORADIUS key 经度 纬度 范围数值 单位 以给定的经纬度为中心, 找出某一半径内的元素
GEORADIUSBYMEMBER key 地点 距离数值 单位 找出位于指定范围内的元素,中心点是由给定的位置元素决定
GEOHASH key 地点1 地点2 将返回11个字符的Geohash字符串,如果两个字符串越接近,那么则距离越近
ZRANGE key start stop 获得指定key中坐标信息
ZREM key 地点 删除指定key下指定目标的数据

附:城市经纬度查询、国内地区经度纬度查询工具

1.2、基本命令的具体使用

# 需注意:
# 两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
127.0.0.1:6379> GEOADD add 120.14209 30.31968 杭州 # 添加杭州的坐标
(integer) 1
127.0.0.1:6379> GEOPOS add 杭州 # 获取杭州的坐标
1) 1) "120.14208823442459106" # 经度
   2) "30.31967928259284406" # 维度
127.0.0.1:6379> GEOADD add 121.472644 31231706 上海 116.405285 39.904989 北京 # 支持一次性添加多个,如果坐标纬度错误则报错
(error) ERR invalid longitude,latitude pair 121.472644,31231706.000000
127.0.0.1:6379> GEOADD add 121.472644 31.231706 上海 116.405285 39.904989 北京 # 正常添加
(integer) 2

127.0.0.1:6379> GEODIST add 杭州 上海 # 获取杭州和上海两点之间的距离,默认单位为m
"162656.4472"
127.0.0.1:6379> GEODIST add 杭州 上海 km # 指定单位km
"162.6564" 
127.0.0.1:6379> GEODIST add 杭州 成都 # 如果输入一个不存在的地点,返回空值
(nil)

127.0.0.1:6379> GEOADD add 116.405285 39.904989 beijing 121.472644 31.231706 shanghai 120.153576 30.287459 hangzhou 118.767413 32.041544 nanjing # 新增四个坐标(把中文的删掉了)
(integer) 4
127.0.0.1:6379> GEORADIUS add 118 35 500 km # 获取以经度118、维度35为圆心,500km为半径内的坐标点
1) "nanjing"
127.0.0.1:6379> GEORADIUS add 118 35 500 m # 如果没有返回空
(empty array)
127.0.0.1:6379> GEORADIUS add 118 35 1000 km # 获取以经度118、维度35为圆心,1000km为半径内的坐标点
1) "nanjing"
2) "beijing"
3) "hangzhou"
4) "shanghai"
127.0.0.1:6379> GEORADIUS add 118 35 1000 km withdist # 获取此半径内的各个点到118,35的距离,单位指定km
1) 1) "nanjing"
   2) "336.6608"
2) 1) "beijing"
   2) "563.4122"
3) 1) "hangzhou"
   2) "561.5795"
4) 1) "shanghai"
   2) "529.3735"
127.0.0.1:6379> GEORADIUS add 118 35 1000 km withcoord # 获取此半径内的各个点到118,35的具体坐标
1) 1) "nanjing"
   2) 1) "118.76741319894790649"
      2) "32.04154324806454923"
2) 1) "beijing"
   2) 1) "116.40528291463851929"
      2) "39.9049884229125027"
3) 1) "hangzhou"
   2) 1) "120.15357345342636108"
      2) "30.28745790721532671"
4) 1) "shanghai"
   2) 1) "121.47264629602432251"
      2) "31.23170490709807012"
127.0.0.1:6379> GEORADIUS add 118 35 1000 km withdist withcoord count 1 # 获取此半径内距离最近的一个城市,并标明距离、展示坐标
1) 1) "nanjing"
   2) "336.6608"
   3) 1) "118.76741319894790649"
      2) "32.04154324806454923"
127.0.0.1:6379> GEORADIUS add 118 35 1000 km withdist withcoord count 2 获取此半径内距离最近的两个城市,并标明距离、展示坐标
1) 1) "nanjing"
   2) "336.6608"
   3) 1) "118.76741319894790649"
      2) "32.04154324806454923"
2) 1) "shanghai"
   2) "529.3735"
   3) 1) "121.47264629602432251"
      2) "31.23170490709807012"
127.0.0.1:6379> GEORADIUSBYMEMBER add beijing 1000 km # 以beijing这个点的坐标为圆心,获取周边1000km以内的坐标点
1) "nanjing"
2) "beijing"
127.0.0.1:6379> GEOHASH add hangzhou beijing shanghai # 将返回11个字符的Geohash字符串,如果两个字符串越接近,那么则距离越近。
1) "wtmkq1tjjp0"
2) "wx4g0b7xrt0"
3) "wtw3sjt9vg0"

127.0.0.1:6379> ZRANGE add 0 -1 # 获取add所有的坐标数据
1) "hangzhou"
2) "shanghai"
3) "nanjing"
4) "beijing"
127.0.0.1:6379> ZREM add beijing # 删除beijing的坐标
(integer) 1
127.0.0.1:6379> ZRANGE add 0 -1
1) "hangzhou"
2) "shanghai"
3) "nanjing"

2、HyperLogLog(基数统计)

2.1、什么是基数统计

现有数据集: {1, 2, 3, 3, 5, 5,}, 那么这个数据集的基数集为 {1,2,3,5}

此数据集的基数(不重复元素)为:4,也就是说基数就是不重复元素的个数

2.2、使用HyperLogLog 的好处

每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。如果要从内存角度来比较的话Hyperloglog是首选

需要注意:如果允许容错(0.81% 错误率,计数的话可以忽略不计),那么一定可以使用Hyperloglog!如果不允许容错,就使用set或者自己的数据类型即可!

2.3、基本命令

命令 描述
PFADD key element [element …] 添加指定元素到 HyperLogLog 中
PFCOUNT key [key …] 返回给定 HyperLogLog 的基数估算值
PFMERGE destkey sourcekey [sourcekey …] 将多个 HyperLogLog 合并为一个 HyperLogLog

2.4、基本命令的具体使用

127.0.0.1:6379> PFADD hkey1 a b c d e f g h i # 新建hkey1
(integer) 1
127.0.0.1:6379> PFCOUNT hkey1 # 统计hkey1的基数数量
(integer) 9
127.0.0.1:6379> PFADD hkey2 e e i j k l m n # 新建hkey2
(integer) 1
127.0.0.1:6379> PFCOUNT hkey2 # 统计hkey2的基数数量
(integer) 7
127.0.0.1:6379> PFMERGE hkey3 hkey1 hkey2 # 合并hkey1和hkey2,命名新集合为hkey3
OK
127.0.0.1:6379> PFCOUNT hkey3 # 统计hkey3的基数数量
(integer) 14

3、BitMap

介绍:BitMap位存储,通过操作二进制位来进行记录,只有0和1两个状态。一般对于只有两个状态的数据,比如统计用户的信息:活跃/不活跃、在线/离线、打卡/缺卡等等,都可以使用BitMap进行存储。

举例:用BitMap来记录一周的打卡情况

127.0.0.1:6379> SETBIT bit 0 1 # 新增bit,在本例中,前一位数字可以代表星期几(0即1,1即2,2即3,以此类推),后一位代表是否打卡(0未打,1打卡)
(integer) 0
127.0.0.1:6379> SETBIT bit 1 1
(integer) 0
127.0.0.1:6379> SETBIT bit 2 0
(integer) 0
127.0.0.1:6379> SETBIT bit 3 1
(integer) 0
127.0.0.1:6379> SETBIT bit 4 1
(integer) 0
127.0.0.1:6379> SETBIT bit 5 0
(integer) 0
127.0.0.1:6379> SETBIT bit 6 0
(integer) 0
127.0.0.1:6379> GETBIT bit 4 # 查看周五是否打卡
(integer) 1 # 是
127.0.0.1:6379> GETBIT bit 6 # 查看周六是否打卡
(integer) 0 # 否
127.0.0.1:6379> BITCOUNT bit #统计打卡的天数
(integer) 4

你可能感兴趣的:(数据库相关笔记,redis,数据库,缓存)