美文网首页
Redis入门--缓存介绍

Redis入门--缓存介绍

作者: 特快捷键 | 来源:发表于2020-08-18 19:04 被阅读0次

    学习笔记

    缓存的类型:

    1. 本地缓存

        本地缓存就是在进程的内存中进行缓存,比如JVM中的堆。

        本地缓存是内存访问,没有远程交互开销,性能最好,但是受限于单机容量,一般缓存较小,且无法扩展。

    2. 分布式缓存

        分布式缓存一般都具有良好的水平扩展能力,对于较大数据量的场景能应付自如,缺点就是需要进行远程请求,性能不如本地缓存。

    3. 多级缓存

        为了平衡前两种缓存的优缺点,实际业务中一般采用多级缓存,本地缓存只是保存访问频次最高的部分热点数据,其他的热点数据存储在分布式缓存中。

    缓存淘汰策略:

    不管是本地缓存还是分布式缓存,为了保障较高的性能,都是使用内存来保存数据,由于成本和内存的限制,当存储的数据超过缓存容量的时候,都需要对缓存的数据进行剔除。

    1. FIFO:淘汰最早的数据。

    2. LRU:淘汰最近最少使用的数据。

    3. LFU:淘汰最近使用频率最低的数据。

    4. 超时剔除:设置超时时间,到了超时时间,就剔除。

    缓存常见的问题:

    1. 缓存更新方式(需要针对具体的业务场景来分析,查询的数据是不是需要实时性)

        缓存的数据在数据源发生变更时需要对缓存进行更新,数据源可能是数据库,也可能是远程服务。更新的方式可以是主动更新。数据源是数据库时,可以在更新完DB后就直接更新缓存。当数据源不是数据库而是远程服务时,可能无法及时主动感知数据变更,这种情况下一般会设置失效时间,也就是数据不一致的最大容忍时间。这种场景下,可以选择失效更新。key不存在或失效时先请求数据源获取更新数据,然后再次缓存,并更新失效时间。但这种做法会出现一个问题,如果依赖的远程服务在更新时出现异常,则会导致数据不可用,改进的方法就是异步更新,当失效时先不清除原先的数据,继续使用旧的数据,然后由异步线程去执行更新任务。这样就避免了失效瞬时的空窗期。

    2. 数据不一致

        缓存数据不一致产生的原因一般是主动更新失败,例如更新数据库后,更新Redis,因为网络原因请求超时,或者异步更新失败导致。解决的办法就是:如果服务对耗时不是特别敏感,可以增加重试来更新Redis中的数据,如果服务对耗时敏感可以通过异步补偿任务来处理失败的更新,或者短期的数据不一致不会影响业务,那么只要下次更新时成功,保证最终一致性就可以了。

    3. 缓存穿透

        缓存穿透的原因可能是外部的恶意攻击,例如:对用户信息进行了缓存,但恶意攻击者使用不存在的用户ID(key)频繁请求接口,导致缓存不命中,然后穿透到数据库查询依然不命中,这时会有大量请求穿透缓存访问数据库。

        解决办法:

        a)对不存在的用户(key),在查询数据库后,在缓存中保存一个空对象进行标记,防止相同的key再次访问数据库。但是,这会造成缓存中存储了大量无用的数据。

        b)使用布隆过滤器,布隆过滤器的特点就是存在性检测。如果布隆过滤器中不存在,那么数据一定不存在,如果布隆过滤器中存在,但是实际的数据也有可能不存在。

    4. 缓存击穿

        缓存击穿,是指某个缓存的数据到了过期时间,这个数据失效的时候,查询该数据导致查询直接访问数据库。

        解决办法:

        a)可以使用互斥锁更新,保证同一个进程中针对同一个数据不会并发请求到数据库,减少数据库的压力。

        b)使用随机退避的方式,失效时随机sleep一个很短的时间,再次查询,如果失败再执行更新。

        c)针对多个热点数据同时失效,可以在缓存时使用固定时间加上一个小的随机数,避免大量热点数据在同一个时刻失效。

    5. 缓存雪崩

        缓存雪崩产生的原因是缓存服务器挂掉了,这时所有的请求都会直接访问数据库。

        解决办法:

        a)使用熔断策略,当请求过大时,直接拒绝访问,来减少数据库的压力。

        b)使用主从模式或者集群模式来尽量保证缓存的高可用。

    相关文章

      网友评论

          本文标题:Redis入门--缓存介绍

          本文链接:https://www.haomeiwen.com/subject/avbkjktx.html