商户查询缓存(缓存穿透)
!!!缓存穿透的理解:(大量请求穿透了redis缓存直接到达数据库)
比如我们客户端随意给个id请求,在redis没有命中,在数据库也没有那么我们就只能返回个空给他,那么他收到空后。恶意的开多线程并发的向不存在的数据发起请求。那么这样就会有很多的请求都会到达我们的数据库,那么我们的数据库可能就会崩溃了。
解决思路:
!!!第一种:缓存空对象(暴力的)
直接在redis中给他缓存一个null到redis,那么它访问的话直接redis给他返回了,就不会到数据库了。
缺点:可能会缓存大量的无效垃圾(我编造各种无效请求给你你都设置东西)
优化:我们可以再给redis的null设置一个ttl(有效时间)
缺点:可能会出现一个短期的不一致(在我们有效时间我们又操作了)
!!!第二种:布隆过滤器
在redis和客户端加一个布隆过滤器(也就是布隆过滤是一个算法会根据数据库的值给他根据各种hash得到一个hash值各种0/1)
缺点:还是有一定得穿透风险(并不是100%),实现也有点复杂。
优点:内存占用就少了。不会去redis缓存什么null了。