
分布式
Charles_yy
记录一切
展开
-
分布式锁有三种实现方式
分布式锁有三种实现方式:1. 数据库乐观锁;利用数据版本 Version 记录机制实现:2. 基于Redis的分布式锁; SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。缓存过期时,通过 SetNX 获取锁,如果成功了,那么更新缓存,删除锁,需要注意的是:如果请求执行因为某些原因意外退出了,导致创建了锁但是没有删除锁,那么这个锁将一直存在,以至于以后缓存再也得不到更新。于是乎我们需要给锁加一个过期时间以防...原创 2020-10-22 20:44:09 · 514 阅读 · 0 评论 -
Redis 缓存穿透+缓存击穿+缓存雪崩
Redis 缓存穿透+缓存击穿+缓存雪崩1.缓存穿透:缓存穿透是指读的请求在缓存redis中没有命中,需要从mysql数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。 1.2解决办法: 缓存空对象 当存储层不命中后,即使数据库返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,依次保护了后端数据源。 ...原创 2020-10-22 20:25:04 · 421 阅读 · 0 评论 -
缓存与数据库数据不一致 解决方法
Redis缓存与数据库数据一致性不管是先写数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况:1.如果删除了缓存,还没有来得及写数据库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。 2.如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。1.第一种方案:延时双删策略+缓存超时设置在写库前后都进行删除缓存操作(redis.del(key)),并且设定合理的缓存过期时间。具体的步骤就是:.原创 2020-10-22 17:41:23 · 1237 阅读 · 0 评论 -
CAS下ABA问题及优化方案
CAS下ABA问题及优化方案一、什么是CAS二、什么是ABA问题三、解决方法1. 表结构加字段解决版本号: Version(更新数据时通过对比原始版本号,如果一致则更新,同时版本号version+1) 更新时间:update_time: update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP2. 优化锁粒度防止因乐观锁,导致并发失败次数较多,引起用户体验不好,需要.原创 2020-10-08 11:09:57 · 283 阅读 · 1 评论