RDB和AOF一起使用, 在Redis4.0版本支持混合持久化方式 ( 设置 aof-use-rdb-preamble yes )04- Redis的数据逾期计谋有哪些 ?
数据到达逾期时间,不做处理处罚。等下次访问该数据时,我们需要判定
- 假如未逾期,返回数据
- 发现已逾期,删除,返回nil
默认情况下 Redis 定期查抄的频率是每秒扫描 10 次,用于定期清除逾期键。固然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”即可,默认的值为hz 10
定期删除的扫描并不是遍历全部的键值对,如许的话比力费时且太消耗系统资源。Redis 服务器采用的是随机抽取情势,每次从逾期字典中,取出 20 个键进行逾期检测,逾期字典中存储的是全部设置了逾期时间的键值对。假如这批随机查抄的数据中有 25% 的比例逾期,那么会再抽取 20 个随机键值进行检测和删除,并且会循环执行这个流程,直到抽取的这批数据中逾期键值小于 25%,此次检测才算完成
Redis 服务器为了保证逾期删除计谋不会导致线程卡死,会给逾期扫描增长了最大执行时间为 25ms
主从数据同步重要分二个阶段 :09- Redis分片集群中数据是怎么存储和读取的 ?
第一阶段 : 全量复制阶段
第二阶段 : 增量复制阶段
- slave节点请求增量同步
- master节点判定replid,发现不一致,拒绝增量同步
- master将完整内存数据天生RDB,发送RDB到slave
- slave清空本地数据,加载master的RDB
- master将RDB期间的命令记载在repl_baklog,并持续将log中的命令发送给slave
- slave执行吸收到的命令,保持与master之间的同步
这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,
⽐如线程1删除了 Redis缓存数据,正在更新Mysql,
此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中
例如 : 用户行为数据 , 我们没有做一致性保证 , 因为就算不一致产生的影响也很小
例如 : 接口缓存数据 , 我们会设置缓存的逾期时间为 60S , 那么可能会出现60S之内的数据不一致, 60S后缓存逾期, 重新从数据库加载就一致了
例如 : 首页广告数据 , 首页推荐数据
数据库数据发生修改----> 发送消息到MQ -----> 吸收消息更新缓存
消息不丢失/重复消耗 : 消息状态表/消息消耗表
很少用
在使用分布式锁的时候, 假如因为一些原因导致系统宕机, 锁资源没有被开释, 就会产存亡锁
解决的方案 : 上锁的时候设置锁的超时时间复制代码
- Boolean isLocked = stringRedisTemplate.opsForValue().setIfAbsent(PRODUCT_ID, "binghe", 30, TimeUnit.SECONDS);
假如业务执行需要的时间, 超过的锁的超时时间 , 这个时候业务还没有执行完成, 锁就已经主动被删除了
其他请求就能获取锁, 操作这个资源 , 这个时候就会出现并发问题 , 解决的方案 :
- 引入Redis的watch dog机制, 主动为锁续期
- 开启子线程 , 每隔20S运行一次, 重新设置锁的超时时间
假如一个线程获取了分布式锁, 但是这个线程业务没有执行完成之前 , 锁被其他的线程删掉了 , 又会出现线程并发问题 , 这个时候就需要考虑归一化问题
就是一个线程执行了加锁操作后,后续必须由这个线程执行解锁操作,加锁和解锁操作由同一个线程来完成。
为了解决只有加锁的线程才气进行相应的解锁操作的问题,那么,我们就需要将加锁和解锁操作绑定到同一个线程中,可以使用ThreadLocal来解决这个问题 , 加锁的时候天生唯一标识保存到ThreadLocal , 并且设置到锁的值中 , 开释锁的时候, 判定线程中的唯一标识和锁的唯一标识是否相同, 只有相同才会开释
"""
当一个线程乐成设置了锁标志位后,其他的线程再设置锁标志位时,就会返回失败。"""
还有一种场景就是在一个业务中, 有个操作都需要获取到锁, 这个时候第二个操作就无法获取锁了 , 操作会失败
例如 : 下单业务中, 扣减商品库存会给商品加锁, 增长商品销量也需要给商品加锁 , 这个时候需要获取二次锁
第二次获取商品锁就会失败 , 这就需要我们的分布式锁能够实现可重入
实现可重入锁最简单的方式就是使用计数器 , 加锁乐成之后计数器 + 1 , 取消锁之后计数器 -1 , 计数器减为0 , 真正从Redis删除锁
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |