文章目录
目录
前言
一、Geospatial地理位置
注意点1:两极无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
注意点2:有效的经度从-180度到180度。
注意点3:有效的纬度从-85.05112878度到85.05112878度。
注意点4:m 为米。km 为千米。mi 为英里。ft 为英尺。城市经纬度查询工具http://www.jsons.cn/lngcode/
通常用以实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。
geospatial的数据类型是zset 他有六个常用命令 geoadd geopos geodist georadius georadiusbymember gethash
geoadd 将给定的空间元素(纬度、经度、名字)添加到指定的键里面。
格式geoadd key longitude latitude member ...
127.0.0.1:6379> geoadd china:city 116.23 40.22 北京
(integer) 1
geopos 从 key 里返回所有给定位置元素的位置(经度和纬度)
127.0.0.1:6379> geopos china:city 北京
1) "116.23000055551528931"
2) "40.2200010338739844"
geodist 返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值。
m 表示单位为米
km 表示单位为千米
mi 表示单位为英里
ft 表示单位为英尺
如果用户没有显式地指定单位参数,那么 geodist 默认使用米作为单位。
127.0.0.1:6379> geodist china:city 北京 上海
"1088785.4302"
127.0.0.1:6379> geodist china:city 北京 上海 km
"1088.7854"
georadius以给定的经纬度为中心,找出某一半径内的元素。
在 china:city 中寻找坐标 100 30 半径为 1000km 的城市
127.0.0.1:6379> georadius china:city 100 30 1000 km
withdist 返回位置名称和中心距离 georadius china:city 100 30 1000 km withdist
withcoord 返回位置名称和经纬度 georadius china:city 100 30 1000 km withcoord
withdist withcoord 返回位置名称 距离 和 经纬度
count 限定寻找个数
georadius china:city 100 30 1000 km withcoord withdist count 1
georadiusbymember找出位于指定范围内的元素,中心点是由给定的位置元素决定
北京 1000 km 内的城市georadiusbymember china:city 北京 1000 km
geohash将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近。
命令格式geohash key member [member...]
geohash china:city 北京 上海
删除地理坐标
没有提供删除成员的命令,但是因为 GEO 的底层实现是 zset,所以可以借用 zrem 命令实现对地理位置信息的删除。
# 查看全部的元素 zrange china:city 0 -1
# 移除元素 zrem china:city 上海
二、Hyperloglog基数
基数可以理解为再数学层面上可以说是:两个数据集中不重复的元素~
但是再Redis中,可能会有一定的误差性。 官方给出的误差率是0.81%。
Hyperloglog的优点: 占用的内存是固定的,2^64个元素,相当于只需要12kb的内存即可。效率极高!
应用
比如统计网页的浏览用户数量,一天内同一个用户多次访问只算一次。
传统的解决方案是使用 Set 来保存用户 id,然后统计 Set 中的元素数量。
这种方案只能承载少量用户,一旦用户数量大起来就需要消耗大量的空间。
而且目的是统计用户数量而不是保存用户,这是个吃力不讨好的方案。
使用 HyperLogLog 最多需要 12k 就可以统计大量的用户数。
尽管它大概有 0.81% 的错误率,但对于统计用户数量这种不需要很精确的数据是可以忽略不计的。
他有三条主要命令pfadd(添加数据集)、pfcount(统计数据集)、pfmegre(合并数据集-自动去重)
127.0.0.1:6379> pfadd dataList 1 2 3 #添加数据集
(integer) 1
127.0.0.1:6379> pfcount dataList #统计数据集中的元素
(integer) 3
127.0.0.1:6379> pfadd dataList1 3 4 5 #添加数据集
(integer) 1
127.0.0.1:6379> pfcount dataList1 #统计数据集中的元素
(integer) 3
#将dataList 和dataList1 两个数据集合并成一个新的 newdata数据集,并且自动去重
127.0.0.1:6379> pfmerge newdata dataList dataList1
OK
127.0.0.1:6379> pfcount newdata
(integer) 5
三、Bitmap位图
Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!
应用场景
当需要统计用户一年的某些信息,如活跃或不活跃,登录或不登录,打卡或没打卡。
setbit(添加)、getset(获取)、bitcount(统计)操作
setbit格式setbit key offset value
getset格式getbit key offset
bitcount格式bitcount key [start, end]
使用 bitmap 来记录一周的打卡记录(1 为打卡,0 为没打卡)
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
# 查看周四是否打卡
127.0.0.1:6379> getbit sign 3
(integer) 1
# 查看周六是否打卡
127.0.0.1:6379> getbit sign 5
(integer) 0
127.0.0.1:6379> bitcount sign 统计这周打卡的记录
(integer) 3
四、持久化
RDB持久化方式
其实就是把数据以快照的形式保存在磁盘上,什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。
默认保存在dump.rdb
优点:
持久化速度比较快,而且数据恢复也比较快
缺点:
由于是某个时间断触发RDB,这样会导致丢失一个时间断的数据。数据完整性比较差。
RDB的触发机制有哪些?
1. 第一种: 手动触发。
save命令
bgsave命令。
2. 第二种: 自动触发。
如何设置自动触发
AOF持久化方式
优点: 数据完整性比较高。最多丢失一条命令。
缺点: 随着写操作越来越大,日志文件也越来越大。数据恢复非常慢。AOF:日志追加 记录服务器接受的每个==写入操作==,当服务器启动时再次加载该日志,会把日志中的命令重新执行一遍。
该模式默认不启动,而且这个日志文件的名字appendonly.aof
修改为此模式需要修改配置文件即可 为了防止影响可以关闭rdb模式
总结
待补充