Redis 实战 问题

前言


 相关系列

  • 《Redis & 目录》
  • 《Redis & 实战 & 源码》
  • 《Redis & 实战 & 总结》
  • 《Redis & 实战 & 问题》
     
     

什么缓存击穿?怎么避免?


    所谓缓存击穿是指请求因缓存失效而直接访问数据库的情况,由于热点数据访问者众多的原因,该情况会有很大概率导致数据库压力在短时间内骤增,从而影响程序的性能乃至令其崩溃…避免缓存击穿的常用解决方案如下:

  • 设置热点数据永不过期;
  • 对向数据库请求的过程加互斥锁。
     
     

什么是缓存雪崩?怎么避免?


    所谓缓存雪崩是缓存击穿的并发情况,即短时间内有大量缓存失效而导致更大数量的请求直接访问数据库…避免缓存雪崩的常用解决方案如下:

  • 设置热点数据永不过期;
  • 为热点数据设置不同的存活时间;
  • 使用惰性缓存方案,确保热点数据只在使用时才被缓存,从而分散热点数据的缓存时间;
  • 对向数据库请求的过程加互斥锁;
  • 将热点数据的缓存更新交由专属的后台线程处理,而后台线程则需频繁检查缓存是否失效,并在失效时及时加载缓存(不推荐)。
     
     

什么是缓存穿透?怎么避免?


    所谓缓存穿透是指在缓存&数据库都不存在指定数据的情况下请求持续向数据库访问而导致数据库压力增大的情况…避免缓存传统的常用解决方案如下:

  • 对向数据库请求的过程加互斥锁;
  • 在数据库不存在热点数据的情况下缓存标识不存在的默认数据。不建议存null,因为存null存在两意性,建议存空对象;
  • 在程序层面对不合法的数据键进行拦截;
  • 采用布隆过滤器缓存所有已存在数据键的哈希值,从而过滤掉键不存在的请求。
     
     

什么是缓存预热?


    所谓缓存预热是指在程序上线时便将热点数据加载至缓存中,从而避免请求向数据库访问的情况发生。注意!预热的数据通常不设置过期时间,因为其失效会因为难以“快速”恢复而导致程序不可用。也因此如果程序使用了缓存预热,那么Redis的淘汰策略也要注意不要覆盖到永久存活的数据上…缓存预热的常用解决方案如下:

  • 编写相应的数据预热接口,并在程序上后手动调用;
  • 在程序自动调用数据预热接口;
  • 定时器定时调用数据预热接口。
     
     

什么是缓存降级?


    所谓缓存降级是指在缓存服务器宕机时直接返回默认数据的情况。在高并发环境中,缓存服务器宕机会在无异常处理的情况下导致程序直接崩溃;或是在有异常处理的情况下导致请求直接向数据库访问,并进一步造成程序性能骤降乃至崩溃的情况发生。而为了避免上述情况程序则可以使用缓存降级的方式对之进行处理,即在服务器宕机时直接返回默认数据。

    需要注意的是!缓存降级这种处理方案并不具备通用性,即并非所有程序/业务在遭遇缓存服务器宕机时都可以使用缓存降级来处理。这是因为缓存降级对程序/业务的影响是有损的,即其大概率会导致程序的运行结果错误。因此开发者在使用缓存降级前必须要先确保错误的运行结果造成的各方面影响是可控的,否则就会给自身/公司带来诸多麻烦。这其中的典型就是涉及到金钱的业务是绝对不能使用缓存降级的。
 
 

如何保证缓存与数据库双写时的数据一致性?


    保证数据一致性的通用方案是先写数据库再写缓存,因为数据只有在被持久化后才能为缓存的首次/再次构建提供可靠基础。而由于缓存具备多种构建方式的原因,数据在具体写入缓存时的行为也会有所变化。缓存通常由两种构建方式:一是在插入/更新时永久缓存;二是在查询时定时缓存。对于前者数据通常会在写入数据库后直接写入缓存,这是为了避免读线程对数据库的查询;而后者则会在数据写入数据库中后删除原缓存,从而令新缓存得以在查询时重新构建。

    需要注意的是!在不加锁的情况下,想要保证数据的强一致性是不可能的。但又因为“绝对完善”的加锁会对程序的性能造成严重损失,因此出于性能/开销/安全等多方面考量我们通常只追求数据的弱/最终一致性。
 
 

如何优化Redis大量数据的导入/导出?


  • 使用管道技术向/令Redis服务器一次性发送/执行多个指令,从而避免网络多次传输指令/数据所造成的性能损耗;
  • 向/令服务端发送/执行包含所有指令的Lua脚本,从而避免网络多次传输指令/数据的同时增强执行指令的执行效率。
     
     

如何找出Redis中指定前缀的所有键?


  • 使用{KEYS}指令进行同步查询,但可能阻塞Redis的内存读/写,因此不推荐;
  • 使用{SCAN}指令进行异步查询,不会阻塞Redis的内存读/写,推荐。但查询结果可能重复,因此需要视情况进行去重。
     
     

如何使用Redis实现队列?


  • 采用列表类型,并令生产者/消费者使用{RPUSH}/{LPOP/BLPOP}指令向尾部插入/从头部移除数据。{LPOP/BLPOP}指令用于实现移除的特殊值/阻塞形式;
  • 直接使用Redis的发布/订阅功能,但数据不会被持久化,因此消费者下线时数据会丢失。
     
     

如何使用Redis实现延时队列?


    使用有序集合类型,将数据的score @ 分数用来保存实际的可移除时间,并令消费者只移除已到移除时间的数据或先查看分数最小的数据是否可被移除。消息内容作为key,调用zadd来生产消息,消费者使用zrangbyscore获取n秒之前的数据做轮询处理。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的汽车票网上预订系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

前端好用的网站分享——CSS(持续更新中)

1.CSS Scan 点击进入CSS Scan CSS盒子阴影大全 2.渐变背景 点击进入color.oulu 3.CSS简化压缩 点击进入toptal 4.CSS可视化 点击进入CSS可视化 这个强推,话不多说,看图! 5.Marko 点击进入Marko 有很多按钮样式 6.getwaves 点击进入getwaves 生…

【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】

在 Kubernetes 中,LoadBalancer 类型的 Service 允许用户轻松地将应用暴露给外部流量。它自动创建一个云负载均衡器并分配一个外部 IP 地址。然而,在某些情况下,LoadBalancer 类型的 Service 可能未能成功分配 IP 地址,导致外部无…

Tomcat servlet response关于中文乱码的经验

前言 最近修改老项目项目,使用zuul网关返回的中文内容乱码了,如果使用GBK或者GB2312编码确正常显示,稍微实验了一下,发现里面很多细节,毕竟Springboot对我们做了很多事情,而且当我们使用不同的模式会出现很…

微服务之间调用,OpenFeign传递用户(RequestInterceptor接口)

场景:微服务之黑马商城项目-登录拦截器在网关完成用户的校验,并将用户信息(用户id)存入请求头,假设将购物车里面的商品进行结算就会生成订单并清空购物车,这里涉及到了交易服务模块远程调用购物车模块&…

Java中String的length与Oracle数据库中VARCHAR2实际存储长度不一致的问题

目录 一、根本原因 二、解决方案 一、根本原因 Oracle数据库新增数据的时候报如下错误: 先给大家看个小案例,这样更好去理解,下面是一段测试代码: 这里面我分别列举了三种字符串,中文,英文和数字以及两种…

探索 CrewAI:引领多智能体协作的未来

探索 CrewAI:引领多智能体协作的未来 在人工智能领域,如何让多个智能体协同工作以解决复杂问题一直是一个热门话题。CrewAI 作为一个前沿的框架,正是为了解决这一挑战而生。它通过角色扮演和自主智能体的协作,赋予了智能体无缝合…

ViSual studio如何安装 并使用GeographicLib

在C的 Boost.Geometry、GDAL/OGR 和 GeographicLib。这些库都可以用于计算两个经纬度点之间的地面距离。 . Boost.Geometry 描述:Boost库的一部分,提供了几何计算功能,包括计算两点之间的地面距离。 优势:轻量级、易于集成到C项…

网站攻击,XSS攻击的类型

XSS(跨站脚本)攻击是一种网络安全攻击方式,攻击者通过在网站页面中注入恶意脚本,使脚本在其他用户的浏览器中执行,从而窃取用户信息、篡改页面内容或操控用户账户。这类攻击通常利用网站对输入数据的过滤不严格&#x…

接口测试加密了怎么测试

各位小伙伴,大家好,今天给大家带来的是接口测试加密了我们该怎么测试。 首先我们来了解一下什么是接口,在我们生活中,水管接口,管道接口等等,在我们软件中通常说的是客户端和服务端之间数据传输的接口。我…

尽可能连续的基于挤压的表面模型制造

🦌🦌🦌宝子们好,今天我们来看一个关于外壳打印的路径优化问题。同样的,红色的是术语、橙色的是方法、绿色的是算法过程,这次多加了紫色,是文章的创新点或目标等。废话不多说,上论文 …

linux驱动—在自己的总线目录下创建属性文件

在总线目录下创建属性文件以扩展其功能。 通过创建属性文件, 我们可以为总线添加额外的信息和控制选项, 以便与设备和驱动进行交互。 简单就是,属性文件,可以完成用户空间和内核空间的数据交互, 比如在应用层快速修改g…

【Searxng】Searxng docker 安装

SearXNG将用户的查询请求分发至多个支持的搜索引擎,并收集返回的结果进行汇总处理。在这个过程中,它通过内置的过滤器功能屏蔽广告和其他不相关内容,确保搜索结果的纯净度。 一键部署 docker run \--name searxng \-p ????:8080 \-v ~/s…

gitlab不同账号间·仓库转移

背景:公司业务调整,原先在海外仓库的代码转移回国内 诉求:完整的保留项目记录 操作: 步骤一: 定位到需要迁移的原项目地址 步骤二:创建新项目 步骤三:打开命令行,创建好文件路径为需要clo…

Ubuntu 安装 npm

1. 升级apt sudo apt-get update 2. 安装nodejs sudo apt install nodejs 3. 安装npm sudo apt-get install npm 4. 查看版本 node -v npm -v 完成安装!

Pytorch学习--神经网络--线性层及其他层

一、正则化层 torch.nn.BatchNorm2d torch.nn.BatchNorm2d(num_features, eps1e-05, momentum0.1, affineTrue, track_running_statsTrue, deviceNone, dtypeNone)正则化的意义: 加速训练收敛:在每一层网络的输入上执行批量归一化可以保持数据的分布稳…

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二 Zig 语言是一种新的系统编程语言,其生态位类同与 C,是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust,尤其是在开发过程中无穷无尽抛错的过程&#x…

复现第一周24

1.[SWPUCTF 2021 新生赛]gift_F12 1)打开题目 2)看源码 3)直接ctrl+f搜索flag 2.[SWPUCTF 2021 新生赛]nc签到 1)开题 2)下载附件用记事本打开 3)打开kali使用nc连接代码 输入l\s命令绕过黑名…

warmup

首页只有一个笑脸&#xff0c;没有什么有效信息&#xff0c; 查看源代码发现,source.php。 访问source.php,显而易见&#xff0c;php代码审计。 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){ //设立白名单&#xff0c;so…

Python 的安装及开发环境搭建

Python 的安装及开发环境搭建 文章目录 Python 的安装及开发环境搭建一、基础环境二、适用场景三、过程方法 版权声明&#xff1a;本文为CSDN博主「杨群」的原创文章&#xff0c;遵循 CC 4.0 BY-SA版权协议&#xff0c;于2024年10月29日首发于CSDN&#xff0c;转载请附上原文出…