为什么使用redis?什么是缓存穿透?布隆过滤器是什么? 什么是缓存击穿? 什么是缓存雪崩? redis集群是什么?hash一致性算法?

目录

为什么使用redis?什么是缓存穿透?布隆过滤器是什么?

什么是缓存击穿?

什么是缓存雪崩?

redis集群是什么?hash一致性算法?


为什么使用redis?什么是缓存穿透?布隆过滤器是什么?

从客户端发出大量的请求到Tomcat,Tomcat再到数据库,在Tomcat到数据库容易达到瓶颈。

解决:1、创建一个数据库连接池,已成为一个标配,但是效果不大;2、使用redis减轻数据库的压力,redis存放热门数据;

选择2,当一个请求到来时先去redis中找,没找到才去数据库中找;

当一个低端黑客,频繁根据id号发起一个数据库中没有的请求,这样就会频繁的到数据库中寻找,使数据库崩溃。这是利用了缓存穿透,即在redis中查找不到,而后去数据库中找的现象称之为缓存穿透

解决:将数据库中查询到的数据缓存到redis中。

当一个正常黑客,频繁根据id号发起数据库中没有的请求,上面的解决方案只会适得其反,可能会使redis 中本来有价值的数据被根据淘汰策略被淘汰走。需要明白,磁盘读存是毫秒级,内存是ns级。

解决:在redis和数据库之间加上一个过滤器(在内存),过滤器将数据库中的数据放在里面,那么怎么使过滤器是不占用太多内存的?过滤器保存未来可能查询的字段值,通过布隆算法解决,标识数据。

布隆算法:通过错误率换取空间的一种方法。能得出数据可能存在 和 一定不存在情况。可能存在的原因是由于hash碰撞那导致的。错误率:显示可能存在,但是实际不存在。错误率受数组的长度L和hash函数个数K的影响,为

为什么使用redis?什么是缓存穿透?布隆过滤器是什么? 什么是缓存击穿? 什么是缓存雪崩? redis集群是什么?hash一致性算法?

显然,k并不是越来越大就好,一般k=3~5,举个例子就知道了。

向数据库中插数据,过程是怎么样的?

是先在过滤器中标识数据,还是先放入数据库中,再启动一个线程在过滤器中标识一下?一般选择后面这种,使用户体验更好。

为什么使用redis?什么是缓存穿透?布隆过滤器是什么? 什么是缓存击穿? 什么是缓存雪崩? redis集群是什么?hash一致性算法?

什么是缓存击穿?

因为redis中的数据并不是一直都热门,因此对数据设置一个有效期。如果一条数据设置有效期一天,一条之后再redis中就查不到了,但是它依然是热门数据。因此一天之后所有去redis中查询的该条数据,都会去数据库中查找。此时数据库就会承接比较大的压力。可以看出缓存击穿是缓存穿透的一个特殊情况。

解决:一般业务场景不用解决,如果是微博头条这类就必须解决。解决需要用到分布式锁。

什么时候需要用锁? 1、共享资源;2、访问互斥;3、多任务环境;

多个JVM互斥访问共享资源,就需要使用分布式锁。

基于MySql的分布式锁,本质是MySql一个value。首先JVM去抢锁(本质是在MySql中插入一个值),谁抢到谁就可以访问共享资源。访问完后,就释放(将插入的值删除),其它JVM就可以抢锁了。

如果释放不了锁(比如JVM宕机),就会产生死锁。可以通过一个JVM监督锁,加一个超时时间,超时该JVM将其释放。如果超时,抢到锁的JVM还未完成,这种情况下就会有其它JVM抢到锁,就会导致数据不一致。时间设置需要合适。

所以一般通过zookeeper管理分布式锁。

 为什么使用redis?什么是缓存穿透?布隆过滤器是什么? 什么是缓存击穿? 什么是缓存雪崩? redis集群是什么?hash一致性算法?

所以MySql只需要处理一个请求,后面的JVM直接到redis中拿就可以了。

什么是缓存雪崩?

上面缓存击穿说的都是一条数据,如果是多条数据情况,同时过期,过期后依然是热门数据,然后请求访问,就是缓存雪崩。这也是缓存穿透的一种特殊情况。产生缓存雪崩的两个原因:有效期一致;redis挂了;

解决:设置随机的有效期,给出缓冲时间;使用redis集群,将热门数据放在多台redis上;

redis集群是什么?hash一致性算法?

使用主从复制或者切片。切片的方式,当新增加一台redis就会出现所有redis都复制的情况,这时需要使用到hash一致性算法。hash环上上面有2^32次方个点。数据KV,使用hash(key)%2^32,将KV映射在环上。redis使用hash(ip+端口)%2^32,将redis映射到环上。然后将数据按照顺时针存放在redis中。这样新redis只需要更改顺势针下一个redis的数据。

为什么使用redis?什么是缓存穿透?布隆过滤器是什么? 什么是缓存击穿? 什么是缓存雪崩? redis集群是什么?hash一致性算法?

但是会发生数据倾斜,这时需要构造虚拟节点。

参考资料:https://www.bilibili.com/video/BV1xf4y1278g