博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis缓存穿透解决方案
阅读量:3931 次
发布时间:2019-05-23

本文共 898 字,大约阅读时间需要 2 分钟。

1.redis介绍

redis是一款基于内存的非关系型数据库,存储key-value。

2.redis缓存穿透

2.1 缓存穿透

  • 概念:指在redis中查询不到,从而查询数据库的现象,就叫缓存穿透。

  • 场景:请求一个id=-n的数据!

  • 解决办法1:数据库查询完成之后放入redis中。不太建议。

  • 办法1的问题:资源浪费。并不是所有数据都值得存到内存中,会造成资源浪费。

  • 解决办法2:在redis和数据库之间加一个过滤器,过滤掉不合法的查询条件。

  • 办法2的问题:查询可能会有很多条件,那就需要提前把尽可能常用的查询条件放到过滤器中,也很浪费资源。

  • 办法2优化:过滤器使用布隆算法。

    • 布隆算法是一个用错误率换取空间的算法。主要是先创建一个一定长度的数组,对要存储的数据用一个或多个hash函数计算hash值,hash值不能大于数组长度,计算完之后将hash值放进下标=hash的数组里。
    • 错误率的体现:错误率=1/数组长度,主要是由hash碰撞导致的。过滤器告诉我们该数据不存在,那就一定不存在;反之,过滤器告诉我们存在,不一定真的存在。
    • 降低错误率:1.数组长度尽可能大;2.hash函数个数适中,不可过多;

2.2 缓存击穿

  • 概念:当redis中只有一条数据,在这条数据过期时,大量请求访问数据库的现象为缓存击穿。

2.3 缓存雪崩

  • 概念:当redis中有多条数据,在这多条数据同时过期时,大量请求访问数据库的现象为缓存雪崩。
  • 解决办法:过期时间不能设置在同一时间,有间隔的过期,减轻数据库压力。

要加锁的情况,三者缺一不可:

  • 共享资源;
  • 共享资源间互斥;
  • 多任务情况;

同步锁

指在同一个jvm中,加同步锁使不同线程排队进行资源访问。

分布式锁

指在不同的jvm中,加分布式锁使不同的jvm排队进行资源访问。

基于mysql的分布式锁

思想:让多个jvm先抢数据库insert value,添加成功即抢占锁成功。抢占锁成功后进行资源访问,访问结束后释放锁。

  • 死锁问题:一个jvm抢占锁成功后,由于各种原因(挂了)没有释放锁,就会导致死锁问题。
  • 解决方案:设置超时时间,超过指定时间自动释放锁。

转载地址:http://swqgn.baihongyu.com/

你可能感兴趣的文章
EXPORT_SYMBOL() 错误--warning: type defaults to 'int' in declaration of 'EXPORT_SYMBOL'
查看>>
Qt 使用 QSettings 读写ini文件
查看>>
Uboot LCD 添加进度条功能
查看>>
Git diff 使用 vimdiff 对比差异
查看>>
使用debugfs来调试内核
查看>>
Qt4 程序 QWS 启动参数详解
查看>>
QT 支持鼠标和触摸屏输入
查看>>
svn diff 使用 vimdiff 对比差异
查看>>
使用 vimdiff 比较文件的技巧
查看>>
Ubuntu 安装 SSH 服务
查看>>
Git commit 设置提交日志编辑器
查看>>
Git config 配置文件详解
查看>>
Git config alias 设置命令别名
查看>>
Git 追踪内容详解
查看>>
Git 打包文件详解
查看>>
C 数据对齐算法
查看>>
Openssl 移植
查看>>
wireless tools 移植和使用
查看>>
libnl1.1.4 移植
查看>>
udhcpc 移植和使用
查看>>