redis基础(四)分布式缓存
所谓缓存就是计算机内存中的一段数据。数据放在内存中有何特点呢答案是一优一劣一优就是读写快一劣就是断电立即丢失。基于此缓存现实中可以解决如下问题1.提高运行效率2.减轻数据库压力适合缓存的数据又有哪些特点呢四个字多查少改——也就是查询频率高且很少会更改的数据。缓存可分为本地缓存和分布式缓存本地缓存数据存储在应用服务器中分布式缓存数据存储在当前应用服务器内存之外。接下来尝试用Mybatis缓存结合redis实现分布式缓存现在我们来开启mybatis二级缓存以上是本地缓存的实现本地缓存访问速度最快但在多实例部署时每个应用节点都有自己的缓存副本存在数据共享和一致性问题Redis 这类独立缓存服务可以让多个应用实例共享同一份缓存数据因此常用于分布式系统如下先查看Cache接口及其实现类源码实现redis缓存也可以建一个类来实现Cache接口。接下来可以在自定义缓存实现类中用RedisTemplate来实现缓存的存取这时就面临一个问题自定义缓存类是由Mybatis实例化(构造方法参数来自Mybatis)而不是Spring因此在自定义缓存实现类中是无法利用Autowired来注入RedisTemplate的目前两张表并没有关联关系各表缓存也自然应该相互独立。但是如果两张表存在关联关系呢比如一对多关系假设User的属性包含Emp对象现在对Emp表进行了更改EmpDAO缓存理所应当被清空了然而UserDao缓存依然存在其中包含的Emp对象内容自然也是过时的这样的错误怎么解决呢接下来可以利用MD5哈希对KEY进行优化MD5 是摘要算法通常将内容转换成 32 位十六进制字符串。相同输入会得到相同结果不同输入通常不同但理论和实际攻击中都存在哈希碰撞因此不能用它保证绝对唯一。缓存常见问题和解决方案一.缓存穿透缓存穿透指的是客户端查询了缓存和数据库中都不存在的数据此请求会越过缓存打在数据库上从而给数据库带来压力。解决方法1.布隆过滤——即将可能存在的所有数据的KEY哈希至bitmap中查询时通过该bitmap过滤对不存在数据的请求会被拦截。2.对返回为空的查询结果(数据不存在或其它原因)也进行缓存过期时间设置短些。MyBatis 缓存可以减少相同查询重复访问数据库但不能认为已经从系统层面解决缓存穿透。实际 Redis 缓存通常仍采用缓存空值、布隆过滤器等方式防护可以验证一下二.缓存击穿缓存击穿和穿透类似一般归为一同一类问题只是发生原因有差异。击穿指的是一个key非常热点在不停的扛着大并发大并发集中对这一个点进行访问当这个key在失效的瞬间持续的大并发就穿破缓存直接打在数据库上。解决方法1.缓存永不过期(不推荐)2.加互斥锁三.缓存雪崩缓存雪崩指的是缓存在某一时间集体失效大量数据涌向数据库造成数据库阻塞。解决方法1.缓存永不过期(不推荐)2.错开缓存过期时间