redis基础(四)分布式缓存

所谓缓存就是计算机内存中的一段数据。数据放在内存中有何特点呢?答案是一优一劣,一优就是读写快,一劣就是断电立即丢失。基于此缓存现实中可以解决如下问题:
1.提高运行效率
2.减轻数据库压力
适合缓存的数据又有哪些特点呢?四个字多查少改——也就是查询频率高且很少会更改的数据。
缓存可分为本地缓存和分布式缓存,本地缓存数据存储在应用服务器中,分布式缓存数据存储在当前应用服务器内存之外。

接下来尝试用Mybatis缓存结合redis实现分布式缓存:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
现在我们来开启mybatis二级缓存:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上是本地缓存的实现,但是因为占用本应用服务器(也就是JVM)的内存,显然有违程序尽可能少占内存的原则,因此分布式缓存应运而生,如下:
先查看Cache接口及其实现类源码,实现redis缓存也可以建一个类来实现Cache接口。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来可以在自定义缓存实现类中用RedisTemplate来实现缓存的存取,这时就面临一个问题,自定义缓存类是由Mybatis实例化(构造方法参数来自Mybatis)而不是Spring,因此在自定义缓存实现类中是无法利用@Autowired来注入RedisTemplate的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

目前两张表并没有关联关系,各表缓存也自然应该相互独立。但是如果两张表存在关联关系呢?比如一对多关系?假设User的属性包含Emp对象,现在对Emp表进行了更改,EmpDAO缓存理所应当被清空了,然而UserDao缓存依然存在,其中包含的Emp对象内容自然也是过时的,这样的错误怎么解决呢?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接下来可以利用MD5加密对KEY进行优化,MD5加密会生成32位16进制字符串,不同内容加密生成的字符串不同,相同内容多次加密后生成的字符串仍然相同。
在这里插入图片描述
在这里插入图片描述
缓存常见问题和解决方案
一.缓存穿透:
缓存穿透指的是客户端查询了缓存和数据库中都不存在的数据,此请求会越过缓存打在数据库上从而给数据库带来压力。
解决方法:
1.布隆过滤——即将可能存在的所有数据的KEY哈希至bitmap中,查询时通过该bitmap过滤,对不存在数据的请求会被拦截。
2.对返回为空的查询结果(数据不存在或其它原因)也进行缓存,过期时间设置短些。
缓存穿透的问题Mybatis已经解决,正是利用第2种存空值的方法,可以验证一下:

在这里插入图片描述

二.缓存击穿:
缓存击穿和穿透类似,一般归为一同一类问题,只是发生原因有差异。击穿指的是一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接打在数据库上。
解决方法:
1.缓存永不过期(不推荐)
2.加互斥锁
三.缓存雪崩:
缓存雪崩指的是缓存在某一时间集体失效,大量数据涌向数据库,造成数据库阻塞。
解决方法:
1.缓存永不过期(不推荐)
2.错开缓存过期时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值