首先是复习了一下Redis的知识点
Redis知识点
redis缓存会存在的三种问题:
缓存击穿:这个问题又叫做热点数据问题,当某一个热点键值过期时,我们的数据库会突然接受到大量的请求,就有可能被击穿。
解决方案:
- 使用逻辑过期
- 使用互斥锁
缓存穿透:这个问题是因为如果有很多查询在数据库都不存在的数据的请求访问,那么redis缓存就失效了,相当于被穿透了,大量的请求就直接打到了数据库上面
解决方案:
- 使用布隆过滤器(实际上就是哈希判断,判断请求值是否在数据库里面存在,如果存在再进行访问,但是缺点是会有哈希冲突)
- 如果一次访问数据库也没有查询到值就在redis里面缓存空值解决
- 做好用户权限校验(这样就不会有很多非法请求了)、
- 可以限定热点数据的请求量(热点数据参数的请求限流)
- 增加id的复杂度,防止被人猜测到id的规律
- 对数据的基本格式做好校验
缓存雪崩:这个主要是由于在某一个时刻,redis大量键值对的过期,导致大量请求打到了数据库,给数据库带来了大量的压力,还有一种情况就是redis宕机了,请求全部打到了数据库
解决方式:
- 使用随机化键值对的过期时间,防止大量键值对在同一时间过期
- 可以部署redis集群
- 给业务添加多级缓存
- 给缓存业务增加降级限流策略
- 在缓存失效的情况下降级表现为返回过期的key
- 在redis服务宕机的情况下,降级的表现为返回商品的默认图片和 “数据加载中” 提示。
- 限流指的是限制数据库的访问请求,超出限制的请求就直接执行降级操作,返回过期key或是返回商品的默认图片。
其次我还复习了一下函数式编程
函数式编程
函数式编成分为是三个部分
-
Lambda 表达式
-
函数式接口(Function<T, R>这种的接口)
- stream流
主要复习了函数式接口Function<T, R>
Function<T, R>这种函数式接口就是可以放在函数的参数里面,表示接受一个方法(这个方法的参数是T型,返回值是R型),下面以我的一个代码为例子
public <R, ID> R queryWithLogicalExpire(String keyPrefix, ID id, Class<R> type, Function<ID, R> dbFallback, Long time, TimeUnit unit)
前面的<R,ID> R 指的就是接收两个泛型参数R和ID ,返回值类型为R
posted on
浙公网安备 33010602011771号