随着系统访问量和复杂度的增加,响应性能成为重点。而缓存的使用就成为一个重点。Redis作为缓存中间件的佼佼者,已经成为面试必考项目。本文分享Redis的一些常见面试题:CacheAvalanche1.1什么是CacheAvalanche?如果我们的缓存已关闭,则意味着我们所有的请求都已发送到数据库。我们都知道Redis不可能缓存所有的数据(内存昂贵且有限),所以Redis需要为数据设置一个过期时间,采用惰性删除+定时删除两种策略来删除过期的key。如果缓存数据设置的过期时间相同,Redis只是将这部分数据全部删除。这会导致这些缓存在这段时间内同时失效,所有的请求都会发送到数据库。这就是缓存雪崩:Redis挂了,所有的请求都跑到数据库去了。如果发生缓存雪崩,很可能会破坏我们的数据库,导致整个服务瘫痪!1.2如何解决缓存雪崩?在缓存的时候给过期时间加上一个随机值,会大大减少同一个缓存的缓存个数。时间已到。对于“Redis挂了,所有请求都跑到数据库”的情况,我们可以有以下思路:事发前:实现Redis的高可用(主从架构+Sentinel或者RedisCluster),尽量避免使用Redis挂断情况发生。事件过程中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库在redis之后被kill掉(至少保证我们的服务还能正常工作)事件:Redis是持久化的,重启后自动从磁盘加载数据,快速恢复缓存数据。缓存穿透2.1什么是缓存穿透?缓存穿透是指查询一定不存在的数据。因为缓存并不完善,而且为了容错,如果从数据库中查不到数据,就不会写入缓存,这样会导致每次都去数据库中查询不存在的数据被请求了,缓存的意义就没有了。这就是缓存穿透:大量请求的数据在缓存中不准确,导致请求转到数据库。如果发生缓存穿透,还可能拉垮我们的数据库,导致整个服务瘫痪!2.1如何解决缓存穿透?解决缓存穿透有两种方案:因为请求的参数是非法的(每次请求都是不存在的参数),所以我们可以使用布隆过滤器(BloomFilter)或者压缩过滤器提前拦截,如果是非法的,这个请求就会不允许去数据库层!当我们从数据库中找不到它的时候,我们也会将这个空对象设置到缓存中。下次请求时,可以从缓存中获取。这种情况下,我们一般会设置一个过期时间较短的空对象。缓存和数据库双写一致3.1对于读操作,流程如下:如果我们的数据在缓存中,那么直接取缓存。如果缓存中没有我们想要的数据,我们会先查询数据库,然后将数据库中查到的数据写入缓存。***向请求返回数据。3.2缓存和数据库的双写一致性问题是什么?如果只是查询的话,缓存数据和数据库数据都没有问题。但是当我们想要更新时呢?各种情况都可能导致数据库和缓存数据不一致。这里的不一致是指:数据库中的数据与缓存中的数据不一致。理论上只要我们设置key的过期时间,就可以保证缓存中的数据和数据库中的数据最终是一致的。因为只要缓存数据过期,就会被删除。后面读取的时候,因为没有缓存,可以去数据库中查数据,然后把数据库中查到的数据写入缓存中。除了设置过期时间,我们还需要采取更多措施,尽可能避免数据库和缓存不一致的情况。***本文带您了解如何解决缓存雪崩、缓存穿透、双写时缓存与数据库的一致性问题。此外,还有很多问题需要我们注意,其中一些是推荐阅读。希望看完后对大家有所帮助。
