redis缓存设计-Redis(七)

news2024/11/15 21:52:15

上篇文章介绍了redisCluster。

redis集群-Redis(六)icon-default.png?t=N5F7https://blog.csdn.net/ke1ying/article/details/131217674

  • 高并发缓存应对策略

缓存穿透

正常情况下,用户访问某条数据,第一次从数据库获取,后面会set进缓存,从缓存获取。缓存穿透指的是数据库没有这个值,当大量请求时,会经过缓存在数据库不断查询,数据库负担不断增加。这种情况下可能是业务代码异常,也可能是黑客利用不存在的key不断攻击数据库(所以redis不光可以提高性能,还可以利用减轻数据库压力防止黑客攻击)。那这种情况如何解决呢?

可以增加业务代码逻辑,当这个值不存在,则set空值到缓存,给这个空值一个过期时间。

还有一种方式使用bigMap布隆过滤器,在业务代码上先对数据进行一次过滤器过滤,对于不存在的数据,布隆过滤器可以先过滤掉。

缓存击穿

当系统中redis的key大量一起过期,导致同一时间高并发一起请求这些key,全部打到数据库服务器上,这时候导致数据库宕机怎么解决呢?

设置redis过期随机过期时间,并且提供一个过期时间基数。

缓存雪崩

整个redis服务器直接宕机导致不可用,这时候 必须通过我们前面说的集群保证redis高可用,以及预估高峰流量,做限流预案,用队列削峰,服务降级。比如用hystrix服务降级组件,kafka队列等。

  • 热点缓存key重建

当key是一个热点,比如双11某部手机大降价,高并发同时都访问这个key,于是全部一起访问到数据库,这时候怎么解决呢,用redission分布式锁来保证只有一个请求访问到数据库,其他的从缓存冲获取。(顺便一提redission分布式锁源码里通过lua脚本访问redis,保证事务和原子性)

  • 数据库缓存双写不一致设计

线程1:set数据库10,删除缓存

线程2:set数据库6,删除缓存

线程3:get数据库10,set缓存10

当线程3和线程2并行执行:

第一步:线程3获取10,线程2set数据库6,删除缓存

第二步:线程3set缓存10

这时候实际数据库存入的是6,但是缓存存入的是10。

导致了数据库和缓存不一致。这时候如何解决呢?

  1. 这种情况下肯定高并发导致的,如果并发量很小,或者是个人的数据压根不用考虑这种问题。
  2. 就算并发量很高,但是对数据库一致性要去不高,比如商品名称,设置一个过期时间,等读的时候更新就好。
  3. 如果不能容忍不一致,则使用分布式锁,保证排队,让并发变为串行。分布式读写锁,相当于读读或者读写的时候按顺序排队,读读的时候不需要排队。
  4. 引入阿里新的开源中间件canal来监听binlog日志来修改数据。

(延迟双删也是一种解决策略,在删除缓存的时候,sleep 50ms再删一次。但这种情况不推荐,这种小概率事件而让所有请求都停顿)

针对读多写少的情况,加入缓存提高性能,针对写多读少并且不能容忍不一致性的情况,就没必要使用缓存,可以直接操作数据库,没必要为了提高性能,而增加很多复杂的设计。

  • 键值设计
  1. key设计

1)以业务名(或者数据库名)为前缀,防止key冲突,冒号分割。

(微服务的情况下,加上服务名称)

  1. 统一在一个文件下管理,防止重复定义。
  2. 简洁性:在加前缀的情况下必须保证简介,牺牲可读性也是可以的。
  3. 特殊符号不可以:换行空格单双引号不可以出现。

  1. Value设计

Bigkey针对value的,绝对不能放大key,前面强调过很多次。在redis一个字符串最大512mb,哈希,set,zest,list可以存储大约40亿元素。实际情况下我们一般认为:

  1. 字符串:超过10kb就是bigkey。
  2. 非字符串:则以个数为单位,一般不要超过5000。
  3. 非字符串不要使用del进行删除,使用hscan,sscan,zscan方式渐进删除,同时要注意bigkey过期时间,因为过期会触发del,造成阻塞。

  1. bigkey危害

1)redis阻塞。

2)网络阻塞:Bigkey意味着产生网络流量较大,假设一个bigkey是1mb,客户端每秒访问1000,那么每秒产生1000mb流量,对于普通千兆网络服务器(按字节每秒128mb/s)直接宕机。

(千兆网卡为什么是128mb/s,因为需要除以8,按字节计算)

3)过期删除:在redis4.0版本设置lazyfree-lazy-expir yes,改为异步删除,如果没有配置,则bigkey过期会造成阻塞。

  1. bigkey产生

正常都是程序设计不当,

  1. 社交类,大v粉丝太多,比是bigkey。
  2. 统计类,按天存储某项功能用户集合,用户多也是bigkey。
  3. 缓存,当我们从数据库查询数据,序列化放入缓存是否放入很多不想干的数据。

如何优化呢?

可以拆分,通过哈希取模拆分更小模块,进行二次存储。

如果实在不可以避免,必须要bigkey,那么只可以在操作的时候不要hgetall,用hmget,删除的时候也要渐进式删除。

  1. 选择合适数据类型

Set user:1:name ky

Set user:1:age 20

可以改为哈希

Hmset user:1 name ky age 20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/659012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Web应用技术》期末复习,更新中...

Web应用技术期末复习 一、MVCMVC概述: 二、Spring:Spring概述:(1)依赖注入(Dependency Injection):(2)控制反转(Inversion of Control)&#xff1…

Win11下配置OpenCV with CUDA

前些天在B站上看到用OpenCV调用CUDA加速目标检测和关键点检测的教程,较Pytorch推理速度提升很明显,最近整了个RTX4070,所以就也想来试一试。由于刚换了电脑,没有相关环境,配置过程中踩了一些坑,因此有了这篇…

立创EDA:(1)AB32VG1开发板画PCB笔记

文章目录 1.准备原理图1.1 原理图参考资料1.2 我的原理图1.2.1 引脚分配1.2.2 电源电路1.2.3Type-c口和USB转串口CH340N1.2.4 三色灯,红外接收器,蓝牙天线1.2.5 ADC按键电路1.2.6 SD卡电路1.2.7 耳塞,麦克风,FM天线1.2.8 功放电路…

期末速成之插入排序(一)

文章目录 1.🍉排序1.1🍈插入排序1.1.1 🍌插入排序 🍌1.1.2 希尔排序 1.🍉排序 (本质:进行一个筛选) 排序在生活中的应用: 1.1🍈插入排序 1.1.1 &#x1f3…

AN13189-移植

AN13189.pdf 2简介 本文件提供了从软件角度将基于PN7160 NXP NCI的NFC控制器集成到Android平台的指南。 它首先解释了如何安装所需的内核驱动程序,然后逐步描述了如何调整Android开源项目源代码以添加PN7160 NFC控制器的支持。图1显示了整个Android NFC堆栈的架构。…

【程序】基于simulink车辆动力学可视化仿真

一、前言 车辆动力学是研究汽车在行驶过程中的运动学和力学特性的学科。它研究车辆在不同路面条件、不同驾驶情况下的加速、制动、转向等运动状态,并通过建立数学模型来分析和优化车辆的性能和安全性。车辆动力学是汽车工程、机械工程和物理学等学科的交叉领域&…

基于SpringBoot的SSM整合案例 -- SpringBoot快速入门保姆级教程(四)

文章目录 前言1.设计创建数据库表tbl_book2.创建新的SpringBoot模块,勾选相关依赖3. 添加SpringBoot创建项目时没有提供的相关坐标4.根据数据库表创建实体类Book5.编写dao层操作BookDao6.编写Service服务层接口BookService7.编写服务层实现类BookServiceImpl8.编写B…

AI催生电影新纪元?大咖们纷纷发声|瞩目上影节

AI催生电影新纪元?大咖们纷纷发声|瞩目上影节 听说“谁懂AI,谁股票就飙高”。博纳影业集团创始人兼总经理于冬一句话引得会场爆笑连连。 AI成为今年上海国际电影节热议话题之一。在金爵电影论坛开幕论坛上,于冬、中国电影股份有限…

keyclock==纯java实现第三方登录

官网Guides - Keycloak 下载 Downloads 18.0.0 - Keycloak GitHub: https://github.com/keycloak/keycloak/tags?after17.0.1 1-安装启动 参照readme文件 启动 bin\kc.bat start-dev 初始化超管账号密码admin admin 参考官方教程 OpenJDK - Keycloak 打开超管界面h…

Mac 上的搜狗输入法卡顿问题

我的 Mac 使用的中文输入法是搜狗拼音输入法,一直有一个问题,就是 Mac 开机太久,输入法会出现卡顿问题,按下按键 0.5s 后需才会显示对应的汉字,用着非常难受,以前这种情况我都是通过重启 Mac 来解决&#x…

Python算法练习6.18

leetcode 1431 拥有最多糖果的孩子 给你一个数组 candies 和一个整数 extraCandies ,其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子,检查是否存在一种方案,将额外的 extraCandies 个糖果分配给孩子们之后,此孩…

全国大数据与计算智能挑战赛:面向低资源的命名实体识别基线方案,排名13/64,组织单位:国防科技大学系统工程学院(大数据与决策实验室)

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

管理类联考——英语二——技巧篇——写作——B节——图表作文——必备词汇句型

图表作文必备词汇句型 1.该表格展示了…… The table reveals The table demonstrates The table shows The table depicts The tableillustrates The table presents The table describes 2.占…… Comprise Take up Account for Constitute C…

【MySQL】不就是索引

前言 嗨!小伙伴们周末快乐呀!想必你们周末都在家里边呆着吧,外面实在是太热了!在家里吹着空调做着自己喜欢做的事情吧!本期我们主要学习的是MySQL中的约束条件。 目录 前言 索引概述 外键约束 1.概念 2.语法 1.添加…

机器学习的学习准则(期望风险最小化、经验风险最小化、结构风险最小化)

训练集是有N个独立同分布的样本组成,即每个样本(x,y)是独立的从相同的分布中抽取的。这个真实的分布未知 输入空间X和输出空间Y构成样本空间,对于样本空间中的样本(x, y)∈X x Y,假定x和y之间可通过一个未知的真实隐射yg(x)来描述&#xff0…

九、提交代码自动触发Jenkins构建版本

提交代码自动触发Jenkins构建版本 1. 下载Generic Webhook Trigger 2. 配置Generic Webhook Trigger http://JENKINS_URL/generic-webhook-trigger/invoke?tokenruoyi-ui-8978456465 http://192.168.1.183:8080 为jenkisn地址,/generic-webhook-trigger/invoke?…

学习潘海东博士的《潮汐调和分析原理和应用》

潘海东博士在B站(用户名:ocean_tide)分享了他的电子书《潮汐调和分析原理和应用》,以及他开发的潮汐调和分析工具包S_Tide,非常厉害。 在学习《潮汐调和分析原理和应用》之前,我们需要安装matlab软件。 1 、…

阿里云免费服务器申请流程、领取入口、主机配置及限制条件

阿里云服务器免费试用申请链接入口 aliyunfuwuqi.com/go/free 阿里云个人用户和企业用户均可申请免费试用,最高可以免费使用3个小时,阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置: 目录 阿里云服务器免费试用 企业…

高通 Android 12 调试产测NFC功能

1、在dev/nxpnfc节点添加对应的文件权限 on property:sys.boot_completed1# nfc add by zmchmod 777 /dev/nxpnfc 2、在vendor/nxp/nfcdevice-nfc.mk文件中 修改NFC添加到编译路径如下所示,跟平时内置apk方式有点类似 PRODUCT_PACKAGES NFCTestApp-include \vendor\nxp\nfc\…

powerdesigner简单使用

批量修改表名schema vb里面好像没有!的功能&#xff1f;我之前疯狂报错&#xff0c;直到把"!“改成了”<>"; table中的字段名&#xff0c;似乎用下面的界面就可以调用&#xff1b; 推荐找一些vbs的语法记录看一下 批量加入前缀后&#xff0c;所有的表名竟然…