Redis专题

news2025/4/23 19:37:51

前言

Redis的各种思想跟机组Cache和操作系统对进程的管理非常类似!

一:看到你的简历上写了你的项目里面用到了redis,为啥用redis?

因为传统的关系型数据库如Mysql,已经不能适用所有的场景,比如秒杀的库存扣减,APP首页的访问流量高峰等,都很容易把数据库打崩,所以引入了缓存中间件,redis。

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库;跟机组内存中的cache很相似。

集群:复制模式,每个机器做同一件事

分布式:每台机器分工合作,做的不是同一件事。

二、Redis数据类型

字符串类型String

哈希类型hash

列表类型

集合类型

有序集合类型

三:Redis的使用

1:下载软件

2:Spring-data-redis:提供了通过简单配置访问redis服务,对redis底层开发包jedis进行了高度封装,RedisTemplate类提供了redis各种操作。

     redisTemplate.opsForValue().set("name", "gao1");

    redisTemplate.opsForList().rightPush("nameList1", "刘备");

    redisTemplate.opsForHash().put("nameHash", "c", "八戒");

四、Redis常见问题

1:缓存穿透:恶意请求或者频繁查询一个不存在的数据,导致每次请求都要访问数据库。

解决:缓存空对象,并设置合适的过期时间。

2:缓存击穿:在高并发的情况下,一个热点数据的缓存过期或被删除,恰好有大量的请求同时访问该数据,导致无法从缓存中获取数据,从而直接访问数据库。

解决:互斥锁;单机环境用synchronized,集群环境则使用分布式锁(redis的setnx,Redisson)

3:缓存雪崩:在同一时段大量的缓存Key同时失效或者Redis服务宕机,导致大量请求到达数据库。(与缓存击穿的区别,雪崩是很多key,击穿是某一个key缓存)

解决:合理设置缓存过期时间,给不同的key的·TTL添加随机值;建立redis集群

缓存预热:缓存预热是指在系统启动或高峰期之前,提前将一些热点数据加载到缓存中,以减少后续请求对数据库的访问压力,提高系统的性能和响应速度

五、缓存击穿问题解决

分布式环境下解决:使用 Redisson 会更加合适。

1:引入依赖;配置文件  

 //1、获取一把锁,只要锁的名字一样,就是同一把锁
    RLock lock = redissonClient.getLock("my-lock");
    //2、加锁  阻塞式等待(没有获得锁的线程都要等待)。默认加的锁都是30s,lockWatchdogTimeout = 30 * 1000 【看门狗默认时间】
    lock.lock();
    //1)、锁的自动续期,如果业务超长,运行期间自动续期,不用担心业务时间长,锁自动过期被删掉
    //只要占锁成功,就会启动一个定时任务【重新给锁设置过期时间,新的过期时间就是看门狗的默认时间】,每隔10秒都会自动的再次续期,续成30秒
    // internalLockLeaseTime 【看门狗时间】 / 3, 10s
    //2)、加锁的业务只要运行完成,就不会给当前锁续期,即使不手动解锁,锁默认会在30s内自动过期,不会产生死锁问题
    try {
        System.out.println("加锁成功,执行业务..." + Thread.currentThread().getId());
        try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); }
    } finally {
        //3、解锁  假设解锁代码没有运行,Redisson会不会出现死锁
        System.out.println("释放锁..." + Thread.currentThread().getId());
        lock.unlock();
    }

    return "hello";
}

六、redis与数据库不一致问题

失效模式:修改数据库后,删除缓存后面再重新建立缓存。

双写模式:修改数据库后,修改缓存。

七、SpringCache简化缓存开发

springcache提供了一些核心概念和注解来管理缓存。

    Cache Manager  :是一个缓存的抽象接口。

    Cache:基本操作单元,定义了常见的缓存操作,例如get,put,evict(删除)

   缓存注解:

@Cacheable:触发将数据放入缓存的操作。

@CacheEvict:触发将数据从缓存删除的操作。失效模式

@CachePut:不影响方法执行更新缓存。双写模式。

// value:分组,区分不同模块的缓存
//@Cacheable(value = "product", key = "'selectById:' + #id")
@Cacheable(value = "product", key = "#root.methodName + ':' + #id")
@Override
public Product selectById(Long id) {
    return productMapper.selectById(id);
}
//加锁解决缓存击穿问题:sync = true
//@Cacheable(value = "product", key = "'selectById'")
//多个参数这种方式用“,”分割就不用字符串拼接了, key = "{#root.methodName, #id, #name}"
@Cacheable(value = "product", key = "#root.methodName + ':' + #id", sync = true)
@Override
public Product selectById(Long id) {
    return productMapper.selectById(id);
}

//@CacheEvict(value = "product", allEntries = true) //删除分区中所有数据
@CacheEvict(value = "product", key = "'selectById:' + #product.id")
@Override
public void update(Product product) {
    productMapper.updateById(product);
}

八、Redis持久化机制

1:RDB:Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。

简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

2:AOF:Append Only File(追加文件)

Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件(不记录读命令)。

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF

AOF重写

比如我们有个计数的服务,有很多自增的操作,比如有一个key自增到1个亿,对AOF文件来说就是一亿次incr。AOF重写就只用记1条记录。

九、Redis过期数据删除策略

​​​​​​​惰性删除 

只会在取出key的时候才对数据进行过期检查,如果过期,我们就删掉它,反之返回该key。

优点 :对CPU友好,只会在使用该key时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查

缺点 :对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放

​​​​​​​定期删除 

每隔一段时间抽取一批 key进行检查,删除里面过期的key。

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。也能有效释放过期键占用的内存。

缺点:难以确定删除操作执行的时长和频率。

Redis的过期删除策略:惰性删除 + 定期删除两种策略进行配合使用

十、Redis数据淘汰策略(和操作系统的进程管理类似)

当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

Redis支持8种不同策略来选择要删除的key:

noeviction:当内存不足时,Redis 不会淘汰任何数据,而是直接返回错误信息。这是默认的淘汰策略。

allkeys-lru: 对全体key,基于LRU算法进行淘汰

allkeys-lfu: 对全体key,基于LFU算法进行淘汰

allkeys-random:对全体key ,随机进行淘汰。

volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰

volatile-lfu: 对设置了TTL的key,基于LFU算法进行淘汰

volatile-random:对设置了TTL的key ,随机进行淘汰。

volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰

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

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

相关文章

Flask API 项目 Swagger 版本打架不兼容

Flask API 项目 Swagger 版本打架不兼容 1. 问题背景 在使用 Flask 3.0.0 时遇到以下问题: 安装 flask_restful_swagger 时,它强制将 Flask 降级到 1.1.4,并导致其他依赖(如 flask-sqlalchemy、flask-apispec)出现版…

基于YOLOv11 和 ByteTrack 实现目标跟踪

介 绍 之前我们介绍了使用YOLOv9与 ByteTrack 结合进行对象跟踪的概念,展示了这两种强大的技术如何有效地协同工作。现在,让我们通过探索与 ByteTrack 结合的 YOLOv11 来进一步了解这一概念。 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤…

Qt Creator 创建 Qt Quick Application一些问题

一、Qt Creator 创建 Qt Quick Application 时无法选择 MSVC 编译器(即使已安装 Qt 5.15.2 和 MSVC2019) 1、打开 Qt Creator 的编译器设置 工具 (Tools) → 选项 (Options) → Kits → 编译器 (Compilers) 检查是否存在 Microsoft Visual C++ Compiler (x86_amd64) 或类似条…

编码转换器

大批量转换编码 可以将整个工程文件夹从GB18030转为UTF-8 使用Qt C制作 项目背景 比较老的工程,尤其是keil嵌入式的工程,其文本文件(.c、.cpp、.h、.txt、……)编码为gb2312,这为移植维护等带来了不便。现在uit-8用…

[密码学实战]密评考试训练系统v1.0程序及密评参考题库(获取路径在文末)

[密码学实战]密评考试训练系统v1.0程序及密评参考题库 引言:密评考试的重要性与挑战 商用密码应用安全性评估(简称"密评") 作为我国密码领域的重要认证体系,已成为信息安全从业者的必备技能。根据国家密码管理局最新数据,截至2024年6月,全国仅有3000余人持有…

蓝桥杯常考的找规律题

目录 灵感来源: B站视频链接: 找规律题具有什么样的特点: 报数游戏(Java组): 题目描述: 题目链接: 思路详解: 代码详解: 阶乘求和(Java组…

MySQL_MCP_Server_pro接入cherry_studio实现大模型操作数据库

大模型直接与数据库交互,实现基本增删改查操作。首先贴下代码地址: https://github.com/wenb1n-dev/mysql_mcp_server_pro 安装环境:win10 1、下载代码 git clone https://github.com/wenb1n-dev/mysql_mcp_server_pro 2、使用conda创建…

Spark-Streaming

WordCount案例 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"…

transformer 子层连接结构

子层连接结构 目标 了解什么是子层连接结构掌握子层连接结构的实现过程 什么是子层连接结构? 输入到每个子层以及规范化层的过程中, 使用了残差连接(跳跃连接, 从Add&Norm -> Add&Norm), 因此我们把这一部分结构整体叫做子层连接(代表子层及其链接结构), 在每个…

linux oracle 19c 静默安装

oracle数据库有个比较很抓瞎的事情&#xff0c;不同的版本搭建的大致流程是一样的&#xff0c;但是在实操细节上会有不同&#xff0c;比如操作的脚本位置和配置项等等&#xff0c;这些会变&#xff0c;所以需要时常积累不同版本的文档 这里有一点要说明&#xff0c;之所以使用…

C++ 的 输入输出流(I/O Streams)

什么是输入输出流 C 的输入输出操作是通过 流&#xff08;stream&#xff09; 机制实现的。 流——就是数据的流动通道&#xff0c;比如&#xff1a; 输入流&#xff1a;从设备&#xff08;如键盘、文件&#xff09;读取数据 → 程序 输出流&#xff1a;程序将数据写入设备&…

电子电器架构 --- DFMEA设计失效模式和后果分析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

Apache SeaTunnel:新一代开源、高性能数据集成工具

Apache SeaTunnel 是一款开源、分布式、高性能的数据集成工具&#xff0c;可以通过配置快速搭建数据管道&#xff0c;支持实时海量数据同步。 Apache SeaTunnel 专注于数据集成和数据同步&#xff0c;主要旨在解决数据集成领域的常见问题&#xff1a; 数据源多样性&#xff1a…

python+selenium+pytest自动化测试chrome driver版本下载

chrome浏览器chromedriver版本下载地址 https://googlechromelabs.github.io/chrome-for-testing/#stable

3.1 WPF使用MaterialDesign的介绍1

MaterialDesignInXAML Toolkit 是一个流行的开源 C# WPF 控件库,它实现了 Google 的 Material Design 规范,让开发者可以轻松创建现代化的 WPF 应用程序界面 Material Design 是一个流行的设计语言,由 Google 开发,旨在帮助开发者构建美观且一致的 UI 界面。对于使用 C# 的…

从 0 到 1 打通 AI 工作流:Dify+Zapier 实现工具自动化调用实战

一、引言&#xff1a;当 AI 遇到工具孤岛 在企业数字化转型的浪潮中&#xff0c;AI 工具的应用早已从单一的对话交互进阶到复杂的业务流程自动化。但开发者常常面临这样的困境&#xff1a;本地开发的 MCP 工具&#xff08;如 ERP 数据清洗脚本、CRM 工单系统 API&#xff09;如…

Spring Boot中`logging.config`配置项的详解及使用说明

以下是Spring Boot中logging.config配置项的详解及使用说明&#xff1a; 1. logging.config 作用 功能&#xff1a;指定自定义日志配置文件的路径&#xff0c;覆盖Spring Boot默认的日志配置。适用场景&#xff1a;当需要深度定制日志行为&#xff08;如输出格式、文件路径、…

相机模型--CMOS和CCD的区别

1--CMOS和CCD的工作原理 CCD&#xff08;Charge Coupled Device&#xff0c;电荷耦合器件&#xff09;&#xff1a; 1. 图像通过光电效应在感光单元中转化为电荷&#xff1b; 2. 每个像素上的电荷被依次“耦合”并传输到芯片的角落&#xff0c;通过一个或几个模拟输出放大器输…

el-date-picker时间范围 赋值报错问题

问题&#xff1a; 点击时间范围组件右边清除图标&#xff0c;点击近6小时会把设置好的时间赋值给时间范围组件 但是出现报错 原因&#xff1a; 尝试对null值进行属性设置操作&#xff1a;修改一个数组的元素&#xff0c;但此时这个数组是null&#xff0c;而不是预期的数组类型…

为啥低速MCU单板辐射测试会有200M-1Ghz的辐射信号

低速MCU&#xff08;如8位或16位单片机&#xff09;单板在辐射测试中出现 200MHz~1GHz的高频辐射信号&#xff0c;看似不合理&#xff0c;但实际上是由多种因素共同导致的。以下是详细原因分析及解决方案&#xff1a; 1.根本原因分析: (1) 时钟谐波与开关噪声 低速MCU的时钟谐…