redis使用进阶 数据备份 事务详解 高可用详解

2025-07-31 20:44:00
admin
原创 272
摘要:redis使用进阶 数据备份 事务详解 高可用详解

一、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、分布式锁没有过期,但是主节点挂掉,这时候在从节点可能请求到锁;

发表评论
评论通过审核之后才会显示。