在做项目时 使用redis 对热点数据做缓存 虽然有提供的注解 但是这里我们自己实现以下 并解决其中的缓存击穿 穿透 雪崩问题 以提高接口的RT 减少数据库的压力 使用aop 加注解加缓存。
首先自定义一个注解
然后使用aop 首先我们使用around 注解 对我们自定义的注解进行环绕通知 因为我们使用的环绕通知可以 使用ProcessdingJoinPoint 类型 然后通过这个对象获取该注解下的方法的参数 以及注解中的前缀 进行拼装key 然后去redis 中获取 如果获取到了则直接返回 如果缓存中获取不到 则
使用joinpoint .process()方法 执行自己的方法中的代码 这里的代码主要写的是从数据库中查询获得值 如果短时间高并发下次key 过期 那么大量的请求会到数据库中 造成数据库压力很大 这就是缓存击穿问题 一个key过期 数据库存在数据 我们可以使用分布式锁去解决这一问题 因为分布式锁 只能允许一个进程中的一个线程去访问数据库 这样对数据库的压力会大大减少 减少数据库的连接数 这样别的连接就能连接到数据库 可以减少sql的执行时间 分布式锁 我们对该id 进行加锁 如果获得到了锁 则执行查询数据库 如果未获得到则重新执行该方法 查询数据库并写回redis 这里会有一个问题 如果数据库中也不存在 那么 放入该缓存的为null 下一次进来还会重写进行加锁 查询数据库 这里就是缓存穿透问题 查询的key 不存在 这里我们可以 直接创建一个object对象 并设置过期时间 也可以 使用布隆过滤器 对key 进行校验判断该key 存不存在 最终返回 还有一个缓存雪崩 缓存雪崩是指 大量的key 在同一时间进行过期 我们可以对key 进行随机过期世界进行解决。