一.redis基本概念
1.redis支持的类型:String 各种List 各种Hash等等
2.redis:单线程模型,处理业务比较方便
二.为什么用缓存
- .如果客户端并发量,访问量比较大,后端服务器就要接收考验(Tomcat服务器以及mysql数据库), 如果数据库访问量到达一个瓶颈,客户端访问效率降低,访问速度变慢,用户体验不好, 想要解决这种弊端就需要添加缓存
- 加了缓存如何解决数据库瓶颈问题?
可以把经常查询的数据(热点数据)存储在redis缓存中,当要去数据库中拿数据的时候,先去redis中找,如果redis中有,则直接返回,这时就不需要再去数据库中查询了,这样的话,redis就会阻挡一部分接触数据库mysql的请求 - 如果热点数据太多怎么办?(因为redis是一个内存数据库,内存很昂贵)
可以采用多台数据库,这就相当于是redis集群了,也就是我们所说的分布式缓存.
三.redis集群有两个模式:
主从副本模式:
切片模式:
切片规则a::key-value切片规则
a.1 缺点
a.1.1 不利于集群扩展
a.1.2 导致集群中的redis发生网络IO,进而不能对外提供数据服务)
切片规则b::一致性Hash算法
b.1 优点
b.1.1 对集群扩展非常有利
b.1.2 不会出现泛洪问题
b.2 缺点
b.2.1 会出现数据倾斜问题(解决数据倾斜可以多虚拟几个服务器)
四.小记
1 什么是数据倾斜问题?
存储框架:大部分数据存储在少量的服务器上
计算框架:大部分数据由少量的服务器计算
2 什么是缓存穿透?
redis中没有需要查找的数据,需要直接去数据库查(缓存穿透不可怕,可怕的是大量的缓存穿透)
3 如何避免缓存穿透现象?
可以添加一个过滤器,如果请求(携带id)去redis中没有找到数据,首先经过过滤器,过滤器会保存mysql中所有的id号,每次查询都是通过id号查询,如何过滤器中有该id号,则去数据库中查询,如果没有,则将这条请求过滤掉. 随着mysql中数据量越来越大,过滤器会越来越大,会占用大量内存,请求效率也会降低,用户体验不好.
4 如何解决5.3中过滤器越来越大的问题?
可以用布隆算法来降低过滤器对内存的占用,布隆算法是通过错误率来换取空间的占用
5 布隆算法:(数据存在,实际情况不一定存在,数据不存在,那么实际情况一定不存在)