一、redisson - redis客户端工具哪家强?
你可能听过jedis,你可能也听过lettuce ,但是redisson 这玩意 相当于把java中的常用数据结构比如下面的集合,还有锁 都在redis中实现了, 除了不支持事务(这玩意可以用lua脚本)集群啊啥的他也都支持 分布式环境下 就用它了
主要它还是我们中国人写的 链接如右 redisson使用链接
如下为使用分布式锁demo
二、数据一致性
一般我们使用缓存的场景如上 但是高并发情况下,可能出现很多问题 比如缓存穿透,雪崩,击穿啥的
2.1缓存穿透
2.2缓存雪崩
2.3缓存击穿
三、布隆过滤器
3.1引入场景
然后还有个布隆过滤器,这玩意已经出来五十多年了,做的就是下面这个事
3.2原理
使用位图 第一篇基础篇说过的 BitMap 为啥使用它呢?如果使用别的数据结构,占用内存太大了
它的大致原理就是 比如 我要从 上架商品id中 判断当前的商品是否存在 那么 通过当前商品id进行
hash hash的值是多少 就数组长度根据相除 取模 位图的对应index处值就置为多少 那这样很容易产生hash 碰撞 所以 一般会进行多次hash算法
3.3结论
下面这个结论 好好思考下 为啥
代码中咋引入呢?如下引入guava包
3.4代码中使用方式
使用方式
可以看到会有误判率 这个没办法 比如 我商品id 为 135 与 146 的 三次的hash值取模后 由于三次都hash碰撞 所以存在误判率
2 5 7 所以由于hash碰撞
存在误判率也没办法 布隆过滤器已经帮了大忙了 因为如果布隆过滤器判断不存在 那么一定不存在所以后续流程也不用走了 优化后的逻辑如下图 查询缓存前查查布隆过滤器
引入布隆过滤器之前由于某片redis数据都同时失效或者被删除 可能同时访问 数据库 的连接数过多 ,导致 报如下连接不够的异常 而且数据不存在还一直访问数据库 对其他 的业务也会有很大影响,毕竟连接都被没用请求占了 所以 适当时候引入 布隆过滤器 尤为重要,可以在每天定时任务预处理把对应核心数据比如商品id啥的给刷进去 这样就算还有 3%的误差 也拦截了百分之97的无用请求 能极大缓解数据库的压力 这个精度还可以设置的 当然设置越大 对应 hash的函数就越多 然后
位图就越大
3.5 优化版 可计数布隆过滤器
因为布隆过滤器无法删除 为啥呢? hash碰撞呗 前面说了 位的格子是被数据公用的
后面 争对布隆过滤器 因为hash碰撞 所以无法删值 所以 对 布隆过滤器优化后又有了个 计数版的
每删除一次对应 位的计数减一 减到0对应位就置为0
如下 计数版的布隆过滤器可以删除
如果能看到这里 你是真滴秀 欢迎关注 B站 请叫我觉哥 我会定期在B站直播陪伴学习