Redis 是一个开源的内存中的数据结构存储系统,可以用来做缓存、数据库、消息队列等。它的缓存是把经常访问的数据放在内存中,这样可以提高访问速度。然后,缓存雪崩是指大量的缓存同时失效,导致所有的请求都直接访问数据库,可能会导致数据库崩溃。缓存击穿是指一个热点数据的缓存失效,导致大量的请求直接访问数据库,可能会导致数据库崩溃。缓存穿透是指一个请求的缓存和数据库中都没有,导致每次都要直接访问数据库,可能会导致数据库崩溃。解决这些问题的技术点有很多,比如设置缓存过期时间、使用分布式缓存、使用布隆过滤器等。
1-解决缓存雪崩的问题。一种是在缓存失效的时候,加一个随机的延迟,这样可以错开缓存失效的时间,减少对数据库的压力。还有一种是使用分布式缓存,把缓存的数据分布在多个节点上,这样即使有一些节点失效,其他节点还可以继续提供服务。另外,也可以使用缓存预热,在系统启动的时候,把一些常用的数据预先加载到缓存中,这样可以减少缓存失效的次数。
除了上面说的方法,还有一些其他的方法可以解决缓存雪崩的问题。比如说,可以使用二级缓存,在一级缓存失效的时候,先去查询二级缓存,嗯,除了上面说的方法,还有一些其他的方法可以解决缓存雪崩的问题。比如说,可以使用二级缓存,在一级缓存失效的时候,先去查询二级缓存
2-解决缓存穿透的方案有几种。一种是使用布隆过滤器,它是一种概率性的数据结构,可以快速判断一个元素是否存在于一个集合中。在缓存之前,可以先用布隆过滤器检查一下请求的数据是否存在于数据库中,如果不存在,就直接返回,不需要访问数据库。这样可以减少对数据库的压力,也可以防止恶意攻击。还有一种是使用缓存空值,就是在缓存中设置一个默认的空值,当数据库中没有对应的数据时,就返回这个空值。这样可以避免每次都要访问数据库,也可以给用户一个友好的提示。
3-解决缓存击穿的方案也有几种。一种是使用互斥锁,就是在缓存失效的时候,加一个锁,只有一个线程可以访问数据库,其他线程等待。这样可以保证只有一个线程更新缓存,避免了并发更新导致的数据不一致。还有一种是使用永不过期,就是把缓存的数据设置为永远不过期,这样就不会出现缓存失效的情况。但是这样会占用更多的内存,需要根据业务情况来权衡。
举个例子,假如你有一个电商网站,用户可以搜索商品。你可以把所有的商品名称作为布隆过滤器的键,把一个随机的二进制数作为布隆过滤器的值。当用户搜索一个商品时,你可以先用布隆过滤器检查一下这个商品是否存在于你的数据库中。嗯,举个例子,假如你有一个电商网站,用户可以搜索商品。你可以把所有的商品名称作为布隆过滤器的键,把一个随机的二进制数作为布隆过滤器的值。当用户搜索一个商品时,你可以先用布隆过滤器检查一下这个商品是否存在于你的数据库中
4-布隆过滤器的使用很简单,就是在插入数据的时候,把数据通过多个哈希函数映射成多个比特位,然后把这些比特位设置为 1。在查询数据的时候,把数据通过同样的哈希函数映射成多个比特位,然后检查这些比特位是否都为 1。如果都为 1,就说明数据可能存在于集合中;如果有一个为 0,就说明数据一定不存在于集合中。布隆过滤器的优点是空间效率高,可以用很少的内存存储大量的元素。它的缺点是有一定的误判率,可能会把不存在的元素判断为存在。嗯,布隆过滤器里面的数据是在插入的时候加载进去的,它不存储具体的数据,只存储数据的哈希值。所以,在查询的时候,它不能返回具体的数据,只能返回是否存在的信息
-----------------------------------------------------------------------------------------------------------------
再结合业务场景来聊聊缓存问题的分类及其影响
缓存击穿
定义与影响: 缓存击穿发生在高并发环境下,大量请求查询一个热点key时,恰好这个key在缓存中失效(过期),导致所有请求都落到数据库上,可能会导致数据库瞬间压力过大。
缓存穿透
定义与影响: 缓存穿透指查询不存在于缓存和数据库中的数据。由于缓存不命中,每次查询都会穿透到数据库,如果大量这样的请求出现,会对数据库造成很大压力。
缓存雪崩
定义与影响: 缓存雪崩是指在缓存服务重启或大量缓存同时过期的情况下,原本应该访问缓存的请求都转向了数据库,导致数据库压力剧增,可能引发整个系统的崩溃。
解决方案
针对缓存击穿的解决策略
热点key长期有效: 对于热点数据,可以设置永不过期,或者定期更新缓存。
使用互斥锁: 当缓存失效时,不是所有请求都去加载数据库,而是使用锁或队列的方式,使得只有一个请求去查询数据库并更新缓存。
针对缓存穿透的解决策略
布隆过滤器: 在请求查询数据库前,使用布隆过滤器检查key是否存在,不存在则拦截请求。
空对象缓存: 对查询不到的数据,也可以进行短暂的缓存,防止对数据库的频繁访问。
针对缓存雪崩的解决策略
缓存数据的过期时间分散设置: 为防止大量数据同时过期,可以设置不同的过期时间。
建立备用缓存: 使用二级缓存或者多个缓存服务,即使主缓存失效,仍然可以从备用缓存获取数据。
实践案例
商城系统中的缓存优化
热点数据处理: 在大型促销或秒杀活动中,提前分析并加载热点商品数据到Redis,确保这些数据在缓存中长期有效。
无效请求过滤: 对商品ID等关键数据使用布隆过滤器,确保只有有效请求能够访问数据库。
多级缓存策略: 构建一级和二级缓存,一级缓存处理大部分请求,二级缓存处理一级缓
存失效的情况。
结语
Redis作为商城系统中的关键组件,正确处理缓存问题对于保持系统的高性能和稳定性至关重要。理解缓存击穿、缓存穿透和缓存雪崩的区别,并采取适当的预防和应对措施,可以显著提升商城系统的用户体验和处理效率。