Redis: 在项目中的应用

文章目录

  • 一、Redis的共享session应用
  • 二、分布式缓存
    • 1、缓存
    • 2、缓存一致性问题解决方案(缓存更新策略)
      • (1)作用
      • (2)三种策略
      • (3)主动更新策略(数据库、缓存不一致解决方案)
    • 3、缓存使用过程中产生的问题
      • (1)缓存穿透
      • (2)缓存击穿(热点key)
      • (3)缓存雪崩
  • 三、分布式锁

一、Redis的共享session应用

二、分布式缓存

1、缓存

  • 什么是缓存:缓存就是一种具备高效读写能力的数据暂存区域(称作Cache),是存储数据的临时地方,一般读写性能较高。

  • 缓存的作用

    • 降低后端负载。
    • 提高读写效率,降低响应时间。
    • 缓存内存的读写性能远高于磁盘,缓存可以大大降低用户方法并发量带来的服务器读写压力。
  • 缓存的成本

    • 数据一致性成本。
    • 代码维护成本。
    • 运维成本。
  • 如何使用缓存

    • 实际开发中,会构建多级缓存使得系统的运行速度进一步提升,例如本地缓存与redis缓存并发使用。
      在这里插入图片描述

      • 浏览器缓存:主要存在于浏览器端的缓存。
      • 应用层缓存:可以分为tomact本地缓存,比如map或者使用redis作为缓存。
      • 数据库缓存:在数据库中有一片空间buffer pool,增改查数据都会先加载到mysql的缓存中。
      • CPU缓存:当代计算机最大的问题是CPU性能提升了,但内存读写速度没有跟上,所以为了适应当下的情况,增加了CPU的L1、L2、L3级的缓存。
    • 缓存模型和思路
      标准的操作方法就是查询数据库之前先查询缓存,如果缓存数据存在,则直接从缓存中返回,如果缓存数据不存在,再查数据库,然后将数据存入redis。

2、缓存一致性问题解决方案(缓存更新策略)

(1)作用

缓存更新策略是缓存系统中的重要组成部分,用于确定何时以及如何更新缓存中的数据。

(2)三种策略

  • 内存淘汰:Redis自带的内存淘汰机制。
  • 过期淘汰:利用expire命令给数据设置过期时间。
  • 主动更新:主动完成数据库与缓存的同时更新。

总结:
在这里插入图片描述

(3)主动更新策略(数据库、缓存不一致解决方案)

  • Cache Aside Pattern

    • 由缓存的调用者,在更新数据库的同时更新缓存:
      • 一致性良好。
      • 实现难度一般。
    • 操作缓存和数据库时有三个问题需要考虑:
      • 删除缓存还是更新缓存
        • 更新缓存:每次更新数据库都更新缓存,无效写操作较多,并且存在较大的线程安全问题。
        • 删除缓存:更新数据库时让缓存失效,查询时再更新缓存,没有无效更新,线程安全问题相对较低。(可以解决双写问题)
      • 如何保证缓存与数据库的操作同时成功或失败
        • 单体系统:将缓存与数据库操作放在一个事务。
        • 分布式系统:利用TCC等分布式事务方案。
      • 先操作缓存还是先操作数据库
        • 先删除缓存,再操作数据库
          安全问题概率较高。
        • 先操作数据库,再删除缓存
          在满足原子性的情况下,安全问题概率较低。
  • Read/Write Through Pattern
    缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性:

    • 一致性优秀。
    • 实现复杂。
    • 性能一般。
  • Write Behind Caching Pattern
    调用者只操作缓存,由其他线程异步的将缓存数据持久化到数据库,保证最终一致性。

    • 一致性差。
    • 性能好。
    • 实现复杂。
  • 缓存更新策略的最佳实践方案

    • 低一致性需求:使用Redis自带的内存淘汰机制。
    • 高一致性需求:主动更新,并以超时剔除作为兜底方案。
      • 读操作
        • 缓存命中则直接返回
        • 缓存未命中则查询数据库,并写入缓存,设定超时时间。
      • 写操作
        • 先写数据库,然后再删除缓存。
        • 要确保数据库与缓存操作的原子性。

3、缓存使用过程中产生的问题

(1)缓存穿透

(2)缓存击穿(热点key)

(3)缓存雪崩

三、分布式锁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SSL证书在HTTP与HTTPS中的角色差异是什么?

在互联网的广泛应用背景下,随着网络攻击和数据泄露事件频发,保障用户的数据安全已成为至关重要的议题。传统的HTTP协议在传输数据时不进行加密处理,导致数据在传输过程中暴露于潜在的窃听和篡改风险中,安全性薄弱。而通过引入SSL/…

【HC32L110】华大低功耗单片机启动文件详解

本文主要记录华大低功耗单片机 HC32L110 的 汇编启动过程,包括startup_hc32l110启动文件详细注释 目录 1.启动文件的作用2.堆栈定义2.1 栈2.2堆 3.向量表4.复位程序5.中断服务程序6.堆栈初始化启动过程详解7.1从0地址开始7.2在Reset_Handler中干了啥? 8.…

危险场景智能运维巡检系统

在石油、天然气、煤炭和化工等行业,特别是在I/IIC级防爆区场景中,存在着诸如易燃、易爆、高温、有毒有害以及粉尘等危险因素。例如,油气转运站、催化裂化装置、煤化工甲醇车间以及制氢站等地点,都面临着这些潜在的危险。传统的人工…

VOJ 网页跳转 题解 STL栈

网页跳转 用例输入 10 VISIT https://www.jisuanke.com/course/476 VISIT https://www.taobao.com/ BACK BACK FORWARD FORWARD BACK VISIT https://www.jisuanke.com/course/429 FORWARD BACK用例输出 https://www.jisuanke.com/course/476 https://www.taobao.com/ https…

echart实现排名列表

function createHorizontalBarChart(chartId, data) {if (typeof echarts undefined) {console.error(请先引入 ECharts 库);return;}// 初始化echarts实例var myChart echarts.init(document.getElementById(chartId));// 对数据按照 value 进行降序排序var sortedData dat…

k8s配置configmap指定到容器的指定文件

我们需要将名称为walletkey.properties的文件做成configmap,然后将walletkey.properties文件单独挂载出来到/data/walletkey.properties,且不能覆盖/data目录,具体如下 1、创建configmap configmap文件内容 其中walletkey.properties: >-引…

课时100:正则表达式_基础实践_基础知识

3.1.1 基础知识 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 需求 我们之前的一些操作,很大程度上都是基于特定的关键字来进行实践的,尤其是面对一些灵活的场景,我们因为过于限定一些关键字&am…

【配电网故障定位】基于二进制矮猫鼬优化算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#82】

文章目录 【获取资源请见文章第6节:资源获取】1. 配电网故障定位2. 二进制矮猫鼬优化算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节:资源获取】 1. 配电网故障定位 配电系统故障定位,即在配电网络发生…

Tensorflow2.0笔记 - 使用卷积神经网络层做CIFA100数据集训练(类VGG13)

本笔记记录CNN做CIFAR100数据集的训练相关内容,代码中使用了类似VGG13的网络结构,做了两个Sequetial(CNN和全连接层),没有用Flatten层而是用reshape操作做CNN和全连接层的中转操作。由于网络层次较深,参数量…

在 Node.js 中配置代理 IP 采集文章

不说废话,直接上代码: const http require(http); const https require(https);// 之后可以使用 http 或 https 模块发起请求,它们将自动使用配置的代理 // 代理ip:https://www.kuaidaili.com/?refrg3jlsko0ymg const proxy …

JavaScript算数运算符

源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> <b…

Bert语言大模型基础

一、Bert整体模型架构 基础架构是transformer的encoder部分&#xff0c;bert使用多个encoder堆叠在一起。 主要分为三个部分&#xff1a;1、输入部分 2、注意力机制 3、前馈神经网络 bertbase使用12层encoder堆叠在一起&#xff0c;6个encoder堆叠在一起组成编码端&#xf…

ZooKeeper设置监听器

ZooKeeper设置监听器&#xff0c;通过getData()/getChildern()/xists()方法。 步骤&#xff1a; 1.创建监听器&#xff1a;创建一个实现Watcher接口的类&#xff0c;实现process()方法。这个方法会在ZooKeeper向客户端发送一个Watcher事件通知的时候被调用。 2.注册监听器&…

【工厂模式】工厂方法模式、抽象工厂模式-简单例子

简单工厂模式&#xff0c;请跳转到我的另一篇博客【工厂模式】简单工厂模式-简单例子-CSDN博客 四、工厂方法模式 &#xff08;1&#xff09;这部分还是不变&#xff0c;创建一个Car接口&#xff0c;和两个实现类。 public interface Car {void name(); }public class WuLing…

深入刨析 mysql 底层索引结构B+树

文章目录 前言一、什么是索引&#xff1f;二、不同索引结构对比2.1 二叉树2.2 平衡二叉树2.3 B-树2.4 B树 三、mysql 的索引3.1 聚簇索引3.2 非聚簇索引 前言 很多人看过mysql索引的介绍&#xff1a;hash表、B-树、B树、聚簇索引、主键索引、唯一索引、辅助索引、二级索引、联…

C#语法知识之循环语句

5、循环语句 文章目录 1、while思考1 斐波那契数列思考2 判断一个数是否为质数思考3 找出100以内的质数 2、do...while3、for思考1 找水仙花数思考2 乘法表 1、while 1、作用 让代码重复去执行 2、语法相关 while(bool类型值){//当满足条件时&#xff0c;就会执行while语句…

大话设计模式-里氏代换原则

里氏代换原则&#xff08;Liskov Substitution Principle&#xff0c;LSP&#xff09; 概念 里氏代换原则是面向对象设计的基本原则之一&#xff0c;由美国计算机科学家芭芭拉利斯科夫&#xff08;Barbara Liskov&#xff09;提出。这个原则定义了子类型之间的关系&#xff0…

linux下使用qt+mpv调用GPU硬件解码

linux下GPU硬件解码接口&#xff0c;常用的有vdpau和vaapi。 mpv是基于mplayer开发的一个播放器。此外&#xff0c;mpv还提供了函数库libmpv&#xff0c;通过使用libmpv可以编写一个简单的播放器。 基于qtlibmpv的demo&#xff0c;官方例子代码如下&#xff1a;https://github.…

Java maven项目打包自动测试并集成jacoco生成代码测试覆盖度报告

引入Junit 引入 junit5 单元测试依赖 <properties><junit.version>5.10.2</junit.version><jacoco.version>0.8.12</jacoco.version></properties><dependencies><!-- 单元测试 --><dependency><groupId>org.jun…

JUC 线程间通信

前言 本篇文章我将解释《并发编程的艺术》一书中一个经典的实现线程间通信的案例&#xff0c;主要是使用wait() 和 notifyAll() 方法来实现的。 这段代码的作用是通过 wait() 和 notifyAll() 方法实现线程间的等待和通知机制。具体来说&#xff0c;代码中创建了两个线程&…
最新文章