谈谈你对redis的理解,redis血崩

在传统的javaweb项目中,使用数据库进行存储数据,在性能方面有一定的弊端,由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,在一般的管理系统上,由于不存在高并发,因此没有需要瞬间需要读/写大量书写数据的要求,这时候数据库的读写是没有问题的。但是在互联网中,往往存在大量数据的需求,比如抢票,发红包等等。或者是主页访问量瞬间较大的时候,一瞬间成千上万的请求的到来,需要系统在极短的时间内完成成千上万次的读写操作。这个数据库根本承受不来,容易造成数据库系统瘫痪,最终导致服务器宕机

为了克服这些功能,我们的javaweb就要引入nosql技术。Nosql也是一种数据库。他主要是一种基于内存的数据库,并提供一定的持久化功能Redis和MongoDB是当前使用最广泛的Nosal的技术,redis它的性能非常优秀,可以支持每秒几十万次的读写操作,性能远优于数据库,并且支持集群和分布式,主从配置,它还支持一定的事务,高并发场景下的数据安全和一致性,在javaWEB中redis主要用于缓存常用数据或者需要高速读写的场景;redis为了增强可靠性和性能,加入了负载均衡和高可用,高可用为主从结构。一个主节点对应一个或多个从节点,主节点提供提供数据存储,从节点则是从主节点拉取数据备份,当主节点挂掉后,就会从这个主节点的从节点拉取一个从节点来充当主节点,保证集群不会挂掉。

了解什么是 redis 的雪崩、穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透?

  1. redis雪崩是当大量的请求交给redis处理,单位时间内的请求量大于他处理的上限,导致redis全盘宕机,然后这大量的请求发送到数据库,导致数据库宕机,这就是缓存雪崩,

  2. 解决为:将redis设置为高可用的,避免全盘崩溃,加入本地的ehcache缓存和Hystrix限流和降级,避免mysql挂了,将redis设置成持久化,

  3. 缓存穿透:是指查询一个一定不存在的数据,由于缓存不命中,接着查询数据库也无查询结果,因此也不会写入到缓存中,这将会导致每个查询都会去请求数据库,造成缓存击穿;

  4. 解决方案

    1.  布隆过滤:对所有可能查询的参数以hash形式储存,在控制层先进行校验,不符合则丢弃,从而避免了对底层储存系统的查询压力;

    2. 缓存空对象:当存储层不命中后,即使返回空对象也将其缓存起来,同时设置一个过期时间,之后在访问这个数据就是从缓存中获取,包含了后端数据源。

      1. 存在的问题:需要更多的空间存储更多的建,即使对空键设置了过期时间,还是会存在缓存层和存储层的数据会在一段时间内不一致,对于需要保证一致性的业务会有影响。

猜你喜欢

转载自www.cnblogs.com/Web-spring/p/12195791.html
今日推荐