redis的三大特殊数据类型和持久化

文章目录

目录

文章目录

前言

一、Geospatial地理位置

二、Hyperloglog基数

三、Bitmap位图

四、持久化

RDB持久化方式

 AOF持久化方式

总结



前言


一、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模式

 


总结

待补充

猜你喜欢

转载自blog.csdn.net/qq_55648724/article/details/128175137