业务场景:做缓存使用时
数据缓存在redis中,过滤大部分请求,实现只有少量请求达到数据库服务。给数据库减轻压力
原因
解决方案
有并发时,阻止并发到达数据库,但是redis中又没有key
redis是单进程单实例的,让访问的请求当发现key不存在的时候,使用setnx()创建一个key ,相当于向redis申请一把锁。因为setnx()只有没有这个key时,才会返回成功。所以一定只有一个请求能获得这把锁。只有获得锁的请求才允许访问数据库
1.取key,发现没有key
2.使用setnx()设置Key,相当于申请锁
存在的问题
死锁了,获得锁的线程挂掉了怎么办
获得锁的线程没挂,但是阻塞了,因为设置的锁过期时间不够。第一个获得获得还没有取回数据,锁就被释放了,就会导致多个请求到达数据库、可能会导致部分请求延迟,丢失。
第一个从数据库获取到数据,返回了,没有获取到锁的,苏醒之后取到Key返回了
而其他获取到锁的请求,还在阻塞
解决方案
多线程,开启一个守护线程
第一个请求获取到锁之后,一个线程去数据库取数据,另一个线程监控值是不是取回来了,如果没有取回来,就更新锁时间
业务场景:做缓存使用时
原因
解决方案
使用布隆过滤器,三种方式
缺点:布隆过滤器只能增加,不能删除
业务场景:做缓存使用时
原因
解决方案
当业务层面数据必须在同一时间大量进行更新时
当业务层面对数据更新时间没有要求时