zoukankan      html  css  js  c++  java
  • Redis 缓存问题及解决方案

    相关概念

    • 缓存击穿:指的是一些热点数据过期,由于热点数据存在并发量大的特性,所以短时间内对数据库的造成很大的冲击,导致系统瘫痪。常见于例如微博系统中明星结婚或出轨时微博瘫痪的情况。
    • 缓存雪崩:指的是大量数据或全部数据集中过期失效的情况,这种情况是由于大量数据设置了相同的过期时间而导致的。

    使用缓存的流程

    • 缓存存在,命中缓存并返回
    • 缓存不存在,数据库存在,则查询数据库返回(缓存过期了 / 数据库新增数据未同步至缓存)(这种情况下,一定要给 Redis 加锁,否则会在短时间产生有大量的数据库访问,造成数据库瘫痪)
    • 缓存不存在,数据库也不存在,则返回空数据

    缓存不存在,数据库也不存在,则返回空数据

      可能问题:如果持续查询不存在的数据,并发量大时同样会在短时间产生有大量的数据库访问,造成数据库瘫痪。

      解决方法 1:当数据库查询不到的时候,同样往缓存中插入一条记录,并设置过期时间。这样的方案对于正常的访问来讲是有效的。但是,如果某些用户研究了ID生成规律,恶意捏造大量不存在的 ID,同样会造成缓存击穿的问题。所以该方案存在一定安全性问题。

    • 如何在海量数据中(例如10亿无序、不定长、不重复)快速判断一个元素是否存在?
    • 使用布隆过滤器。如果布隆过滤器判断元素在集合中存在,不一定存在;如果布隆过滤器判断元素在集合中不存在,则一定不存在。可以把数据库里所有的 ID 存放于布隆过滤器中,先通过布隆过滤器判断元素是否存在,若在布隆过滤器判断元素不存在,则不需要进行缓存和数据库访问;若布隆过滤器判断元素存在,则再判断缓存是否存在,在缓存也不存在的情况下,再通过数据库查询结果并返回。布隆过滤器是加在缓存之前的一道屏障。

    布隆过滤器 Java实现

  • 相关阅读:
    python参考手册--第3章类型和对象
    python参考手册--第2章词汇和语法约定
    Kafka 分布式环境搭建
    常用sql语句
    ValueError: Attempted relative import in non-package
    mysql查询缓存
    secureCRT配色
    mysql deadlock处理
    How to Cope with Deadlocks
    ajax同步
  • 原文地址:https://www.cnblogs.com/zlxyt/p/11817389.html
Copyright © 2011-2022 走看看