本文共 898 字,大约阅读时间需要 2 分钟。
1.redis介绍
redis是一款基于内存的非关系型数据库,存储key-value。
2.redis缓存穿透
2.1 缓存穿透
-
概念:指在redis中查询不到,从而查询数据库的现象,就叫缓存穿透。
-
场景:请求一个id=-n的数据!
-
解决办法1:数据库查询完成之后放入redis中。不太建议。
-
办法1的问题:资源浪费。并不是所有数据都值得存到内存中,会造成资源浪费。
-
解决办法2:在redis和数据库之间加一个过滤器,过滤掉不合法的查询条件。
-
办法2的问题:查询可能会有很多条件,那就需要提前把尽可能常用的查询条件放到过滤器中,也很浪费资源。
-
办法2优化:过滤器使用布隆算法。
-
- 布隆算法是一个用错误率换取空间的算法。主要是先创建一个一定长度的数组,对要存储的数据用一个或多个hash函数计算hash值,hash值不能大于数组长度,计算完之后将hash值放进下标=hash的数组里。
-
- 错误率的体现:错误率=1/数组长度,主要是由hash碰撞导致的。过滤器告诉我们该数据不存在,那就一定不存在;反之,过滤器告诉我们存在,不一定真的存在。
-
- 降低错误率:1.数组长度尽可能大;2.hash函数个数适中,不可过多;
2.2 缓存击穿
- 概念:当redis中只有一条数据,在这条数据过期时,大量请求访问数据库的现象为缓存击穿。
2.3 缓存雪崩
- 概念:当redis中有多条数据,在这多条数据同时过期时,大量请求访问数据库的现象为缓存雪崩。
- 解决办法:过期时间不能设置在同一时间,有间隔的过期,减轻数据库压力。
锁
要加锁的情况,三者缺一不可:
同步锁
指在同一个jvm中,加同步锁使不同线程排队进行资源访问。
分布式锁
指在不同的jvm中,加分布式锁使不同的jvm排队进行资源访问。
基于mysql的分布式锁
思想:让多个jvm先抢数据库insert value,添加成功即抢占锁成功。抢占锁成功后进行资源访问,访问结束后释放锁。
- 死锁问题:一个jvm抢占锁成功后,由于各种原因(挂了)没有释放锁,就会导致死锁问题。
- 解决方案:设置超时时间,超过指定时间自动释放锁。
转载地址:http://swqgn.baihongyu.com/