redis使用进阶 数据备份 事务详解 高可用详解
- 2025-07-31 20:44:00
- admin
- 原创 272
一、redis使用进阶
HyperLogLog操作:
1、统计日活、月活、每个页面不同用户访问量、每天搜索不同词条的个数;
2、用于统计不同元素数量,误差率为0.81%,最多消耗12K内存;
3、存储元素哈希值第一个1位置,使用伯努利方程计算元素数量;
4、使用多桶计数方式减少误差,桶越多误差率越低;
5、使用调和平均数去掉不健康统计值,减少误差;
6、pfadd myhll,创建数据结构,已创建则直接返回;
7、pfadd myhll elem,增加元素,已增加则直接返回;
8、pfcount myhll,查询近似元素数量,最后8字节缓存统计结果;
9、pfmerge desthll hll1 hll2,合并操作,相同元素不会重复计数;
Geospatial原理:
1、地理空间的平面地图一般使用墨卡托坐标,编码是EPSG:900913;
2、地球周长40075公里,地球周长一半20037公里,跟墨卡托坐标对应;
3、墨卡托坐标范围:-20037508,-20037508,20037508,20037508;
4、墨卡托坐标经度范围:-180 to 180,纬度范围:-85.0511 to 85.0511;
5、经度:0.0001度是10米精度,0.00001是1米精度,0.000001是10厘米精度;
6、纬度:0.0001度是20米精度,0.00001是2米精度,0.000001是20厘米精度;
Geospatial操作:
1、底层实际使用有序集合,因此可以使用有序集合的删除命令;
2、geohash算法对二维地图递归分割成子块,每个子块有唯一编码;
3、数值比较接近时地理位置一般比较接近,可能产生跳变,因此需要校验;
4、跳变示例:子块内酒店和人员编码一致,但是人员实际与隔壁子块内酒店更近;
5、校验算法:查询命中子块以及周围八个子块,使用九个子块同时进行计算;
6、geoadd cars:locations 116.034579 39.030452 elem,添加元素的位置信息;
7、geopos cars:locations elem,查询元素的位置信息,可能存在细微误差;
8、geodist cars:locations elem1 elem2,查询元素之间的距离,单位默认为米;
9、geosearch cars:locations fromlonlat 116.034579 39.030452 byradius 1000 m asc,查找指定位置附近的元素;
stream操作:
1、xadd mystream * field1 value1 field2 value2,增加元素,一个元素可以包含多个字段;
2、xread count 10 block 0 streams mystream id,阻塞查询指定id之后的元素;
3、xrange mystream - + count 1000,查询所有元素,可以限制查询元素数量;
二、redis数据备份
RDB:
1、RDB,Redis DataBase,定时备份数据到硬盘,相当于mysql的dump;
2、备份数据是二进制,占用较少磁盘空间,服务启动时可以快速加载大量数据;
3、手动备份:save同步备份,阻塞所有客户端,bgsave异步备份,lastsave最近异步备份成功时间;
4、自动备份:save <seconds> <changes>,指定时间内达到指定写操作数量,服务进行自动备份;
5、默认备份策略:save 3600 1,save 300 100,save 60 10000
AOF:
1、AOF,Append Only File,备份写操作记录到硬盘,相当于mysql的binlog;
2、每次写操作都会备份到磁盘,减少数据丢失风险,但是备份文件较大,恢复速度较慢;
3、配置说明:appendonly开启开关、appendfilename备份文件名、appendfsync同步策略;
4、配置说明:no-appendfsync-on-rewrite,RDB操作执行时,暂缓同步到磁盘;
5、操作记录重写用于优化AOF文件,读取现有记录,然后生成少量写操作记录;
6、操作记录重写用于优化AOF文件大小,提升AOF恢复速度;
7、重写配置:auto-aof-rewrite-percentage,新增内容达到多少重写,默认上次一倍;
8、重写配置:auto-aof-rewrite-min-size,备份文件至少多大才能重写,默认64mb;
三、事务详解
1、multi+exec执行事务,multi+discard取消事务;
2、watch监视变量是否修改,变量未修改,才能执行事务成功;
3、变量未修改,是指未执行写操作,而不是变量内容没有修改;
4、exec、discard自动取消变量监视,unwatch手动取消变量监视;
执行事务:
multi
set key1 v1
set key2 v2
exec
取消事务:
multi
set key1 v1
set key2 v2
discard
变量未修改,执行事务:
watch key1 key2
multi
set key1 v1
set key2 v2
exec
四、高可用详解
1、内存淘汰策略:volatile-lru应用于带有效期数据的LRU,allkeys-lru应用于所有数据的LRU;
2、内存淘汰策略:volatile-lfu应用于带有效期数据的LFU,allkeys-lfu应用于所有数据的LFU;
3、内存淘汰策略:volatile-ttl淘汰最近快过期的数据,noeviction不淘汰任何数据,默认策略;
4、从库不会进行过期扫描,主库数据到期时,在AOF文件增加一条删除命令,同步到所有从库;
5、从库通过执行删除命令,实现数据过期删除,属于异步过程,所以会出现主从不一致情况;
缓存各种问题:
1、缓存穿透问题:访问一个不存在的数据,缓存没有命中,导致持续请求数据库;
2、缓存穿透解决:校验请求资源ID是否有效,在缓存中设置不存在的资源内容为null;
3、缓存击穿问题:缓存没有数据但数据库有数据,请求量特别大,导致持续请求数据库;
4、缓存击穿解决:设置热点数据永不过期,读取数据库之前需要先获取分布式锁;
5、缓存雪崩问题:缓存数据批量到期,导致大量请求只能同时请求数据库;
6、缓存雪崩解决:设置热点数据永不过期,设置缓存过期时间为随机值;
分布式锁:
1、为了防止分布式锁没有删除,可以使用带过期时间的分布式锁;
2、任务没有执行完成,分布式锁已经过期,不要用于较长时间的任务;
3、防止分布式锁过期问题,Redisson使用定时任务不断对锁进行续期;
4、分布式锁已经过期,防止释放其他客户端的锁,设置锁的内容为一个token;
5、释放分布式锁时,锁的内容是客户端设置的token,才能释放分布式锁;
6、比较token之后再释放分布式锁使用lua脚本,执行lua脚本是原子操作;
7、分布式锁没有过期,但是主节点挂掉,这时候在从节点可能请求到锁;