Redis优化和解决缓存问题

这篇具有很好参考价值的文章主要介绍了Redis优化和解决缓存问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

redis的2种持久化方式

RDB持久化

AOF持久化

redis优化

redis的三大缓存问题

缓存雪崩的解决方案:

缓存穿透的解决方案:

缓存击穿的解决方案:

如何保证 MySQL 和 redis 的数据一致性?


redis的2种持久化方式

RDB持久化

:定时把redis内存中的数据进行快照并压缩保存到硬盘里
手动触发(bgsave命令)     自动触发(满足save指令配置的条件,主从全量同步,执行shutdown命令时)
文件名:dump.rdb
优缺点:RDB持久化保存的文件占用空间小,网络传输块,恢复速度也比AOF更快,性能影响比AOF更小;
实时性不如AOF,兼容性较差,持久化期间在fork子进程时会阻塞redis父进程。


AOF持久化

:以追加的方式将redis写操作的命令记录到aof文件中
执行流程:命令追加(写命令追加到aof_buf缓冲区)
文件写入和同步(文件名:appendonly.aof,同步策略:appendfsync everysec|always|no)
文件重写(减少aof文件占用空间的大小和加快恢复速度,执行bgrewriteaof命令触发)
优缺点:实时性比RDB更好,支持秒级持久化,兼容性较好
持久化保存的文件占用磁盘空间更大,恢复速度更慢,性能影响更大,AOF文件重写期间在fork子进程时会阻塞redis父进程
        
        
RDB/AOF持久化区别可根据 工作方式、实时性、磁盘占用、恢复速度、兼容性、IO性能影响等方面进程阐述。


redis优化

1)设置 config set activedefrag yes 开启内存碎片自动清理,或者定时执行 memory purge 清理内存碎片
2)尽可能使用 hash 数据类型存储数据。因为 hash 类型的一个 key 可包含多个字段,该类型的数据占用空间较小
3)建议给 key 设置过期时间
4)精简 key 的键名和键值,控制 key 占用空间的大小,避免 bigkey 的产生(redis-cli --bigkeys 可用于查找bigKey)
5)修改配置 maxmemory 指定redis可占用的最大内存大小
   修改配置 maxmemory-policy 指定内存数据淘汰策略(key的回收策略),实现保证内存使用率不超过最大内存
   修改配置 maxmemory-samples 指定内存数据淘汰策略的样本数量,一般为3~7,值越大样本越精确
   修改配置 maxclients 指定最大客户端连接数
   修改配置 tcp-backlog 指定最大连接排队数
   修改配置 timeout 指定连接超时时间
   修改配置 lazyfree-lazy-expire yes  设置惰性删除,将删除过期key的操作放在后台中去执行,避免阻塞主线程
   修改配置 no-appendfsync-on-rewrite yes  设置AOF文件重写期间,AOF后台子进程不进行刷盘操作,避免AOF重写和fsync竞争磁盘IO资源,导致redis延迟增加
6)设置AOF持久化和主从复制来备份数据,采用哨兵或集群模式实现redis集群的高可用
7)建议设置 config set requirepass 或 修改配置 requirepass 来设置 redis 密码


redis的三大缓存问题

正常情况下,大部分的访问请求应该是先被redis响应的,在redis那里得不到响应的小部分访问请求才会去请求MySQL数据库获取数据,这样MySQL数据库的负载压力是非常小的,且可以正常工作。缓存雪崩/穿透/击穿三大问题的根本原因在于redis缓存命中率下降,大量请求会直接发送给MySQL数据库,导致MySQL数据库压力过大而崩溃。


缓存雪崩:redis中大量缓存key集体过期
缓存穿透:大量请求访问redis和MySQL都不存在的资源
缓存击穿:redis中一个热点key过期,此时又有大量用户访问这个热点key(redis-cli --hotkeys 可用于查找热Key)


缓存雪崩的解决方案:

使用随机数设置key的过期时间,防止集体过期
设置缓存标记,如果缓存过期,则自动更新缓存
数据库使用排他锁,实现加锁等待


缓存穿透的解决方案:

对空值也进行缓存
使用布隆过滤器进行判断拦截一定不存在的无效请求
使用脚本实时监控,进行黑名单限制


缓存击穿的解决方案:

预先对热点数据进行缓存预热
监控数据,实时调整过期时长
数据库使用排他锁,实现加锁等待


如何保证 MySQL 和 redis 的数据一致性?

读取数据时,先从redis读取数据,如果redis中没有,再从MySQL中读取,并将读取到的数据同步到redis缓存中。
更新数据时,先更新MySQL数据库,再更新redis缓存
删除数据时,先删除redis缓存,再删除MySQL数据库
对于一些关键数据,可以使用MySQL的触发器来实现同步更新redis缓存。也可以使用定时任务,定时自动进行缓存预热,来定期同步MySQL和redis的数据。
 文章来源地址https://www.toymoban.com/news/detail-816740.html

到了这里,关于Redis优化和解决缓存问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis缓存设计与性能优化【并发创建同一个缓存,解决方案:互斥锁】

    开发人员使用“缓存+过期时间”的策略既可以加速数据读写, 又保证数据的定期更新, 这种模式基本能够满足绝大部分需求。 但是有两个问题如果同时出现, 可能就会对应用造成致命的危害: 当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。 重建缓存不

    2024年04月09日
    浏览(35)
  • 【Redis】电商项目秒杀问题之下单接口优化:Redis缓存、MQ以及lua脚本优化高并发背景下的秒杀下单问题

    目录 一、优化思路 二、缓存库存与订单 1、库存缓存的redis数据结构 2、订单信息缓存的redis数据结构 三、整体流程 四、lua脚本确保权限校验操作的原子性 【Redis】电商项目秒杀问题之超卖问题与一人一单问题_1373i的博客-CSDN博客 https://blog.csdn.net/qq_61903414/article/details/1305689

    2024年02月05日
    浏览(31)
  • 【Redis】封装Redis缓存工具解决缓存穿透与缓存击穿问题

    基于StringRedisTemplate封装一个缓存工具,主要有一下几个方法 方法1:将任意Java对象序列化为json并存储在String的指定key中且设置TTL 方法2:将任意Java对象序列化为json并存储在String的指定key中,并可以设置逻辑过期时间,用户处理缓存击穿问题 方法3:根据指定的key进行查询缓

    2024年02月06日
    浏览(40)
  • 探讨Redis缓存问题及解决方案:缓存穿透、缓存击穿、缓存雪崩与缓存预热(如何解决Redis缓存中的常见问题并提高应用性能)

    Redis是一种非常流行的开源缓存系统,用于缓存数据以提高应用程序性能。但是,如果我们不注意一些缓存问题,Redis也可能会导致一些性能问题。在本文中,我们将探讨Redis中的一些常见缓存问题,并提供解决方案。 缓存穿透指的是当一个请求尝试访问一个不存在于缓存中的

    2024年02月03日
    浏览(48)
  • [Redis]缓存穿透、缓存击穿、缓存雪崩问题及解决方法

    缓存穿透就是指在高并发的情况下大量的请求去查询一个不存在于缓存中的数据,导致这些请求都直接访问数据库,给数据库造成压力。例如:我存储在缓存中的key是数字类型(123),但是网络攻击者频繁地用字符串(abc)去获取缓存。导致永远都无法命中缓存,请求最终都

    2024年02月15日
    浏览(34)
  • redis的缓存穿透,缓存并发,缓存雪崩,缓存问题及解决方案

    缓存穿透 问题原因 解决方案 缓存并发 缓存雪崩 缓存失效时间设置一致导致的。 解决方案: 1)方案一 2)方案二 如何设计一个缓存策略,缓存热点数据?

    2024年02月21日
    浏览(28)
  • 【Redis(8)】Spring Boot整合Redis和Guava,解决缓存穿透、缓存击穿、缓存雪崩等缓存问题

    在缓存技术的挑战及设计方案我们介绍了使用缓存技术可能会遇到的一些问题,那么如何解决这些问题呢? 在构建缓存系统时,Spring Boot和Redis的结合提供了强大的支持,而Guava的 LoadingCache 则为缓存管理带来了便捷的解决方案。下面我将介绍如何通过整合Spring Boot、Redis和Gu

    2024年04月22日
    浏览(41)
  • Redis缓存穿透、击穿、雪崩问题及其解决方法

    缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。 常见的解决方案有两种: 缓存空对象 优点:实现简单,维护方便 缺点: 额外的内存消耗 可能造成短期的不一致 布隆过滤 优点:内存占用较少,

    2024年02月02日
    浏览(30)
  • MyBatis缓存和二级缓存整合Redis

    缓存验证 在⼀个sqlSession中,对user表根据username进⾏两次查询,查看他们发出sql语句的情况 查看控制台打印情况: 看控制台输出可以看出来,第一次执行了SQL查询,第二次直接打印的结果集,没有查询数据库。 同样是对user表进⾏两次查询,只不过两次查询之间进⾏了⼀次

    2024年02月06日
    浏览(31)
  • redis中使用bloomfilter的白名单功能解决缓存穿透问题

    将需要的数据提前缓存到缓存redis中,可以在服务启动时候,或者在使用前一天完成数据的同步等操作。保证后续能够正常使用。 在redis中,查询redis缓存数据没有内容,接着查询mysql数据库,也没有需要的内容,做了两次无用的查询。进而造成mysql数据库的负担,造成一系列

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包