目录

一、Redis概念

1.1 Redis定义

1.2 Redis的特点

1.3 Redis的用途

1.4 Redis与其他数据库的对比

二、Redis数据库

三、Redis五个基本类型

3.1 字符串

3.2 列表(list) ——可以有相同的值

3.3 集合(set) ——值不能重复

3.4 哈希(hash) ——类似于Map集合

3.5 有序集合(zset) ——不能重复

四、事务

4.1 事务定义

4.2 与mysql的事务的区别

4.3 代码解释 

五、乐观锁和悲观锁 

5.1 乐观锁

5.2 悲观锁

5.3 乐观锁与悲观锁的区别和适用场景

六、Redis持久化 

6.1 定义

6.2 两种方式

(1)RDB

(2)AOF

七、主从复制

7.1 概念

7.2 模式

(1)一个主机有两个从机

(2)链路模式

八、哨兵模式

8.1 概念

8.2 优缺点

九、缓存穿透、击穿和雪崩

1.缓存穿透——查不到

2.缓存击穿——量太大,缓存过期

3.缓存雪崩


一、Redis概念

1.1 Redis定义

        Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,通常用作数据库、缓存或消息代理。它支持多种数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,并提供丰富的操作命令。

1.2 Redis的特点

  • 高性能:数据存储在内存中,读写速度极快,适合高并发场景。
  • 持久化:支持RDB(快照)和AOF(日志)两种持久化机制,确保数据安全。
  • 数据结构丰富:支持多种数据结构,满足不同业务需求。
  • 原子操作:所有操作是原子性的,适合分布式锁等场景。
  • 扩展性:支持主从复制、分片(集群)等功能。

1.3 Redis的用途

  • 缓存:加速数据访问,减轻后端数据库压力。
  • 会话存储:存储用户会话信息,支持分布式系统。
  • 消息队列:利用列表或发布/订阅模式实现消息传递。
  • 实时排行榜:使用有序集合实现实时排名功能。
  • 地理空间索引:支持存储和查询地理位置数据。

1.4 Redis与其他数据库的对比

  • 与关系型数据库(如MySQL):Redis基于内存,适合高速读写;关系型数据库适合复杂查询和事务。
  • 与Memcached:Redis支持更多数据结构和持久化,Memcached更简单,仅支持键值存储。

二、Redis数据库

1.Redis有16个(0-15)数据库,默认使用0号数据库。

2.Redis数据库的有关操作

三、Redis五个基本类型

3.1 字符串

(1)特点

最基本数据类型,可以存储文本或二进制数据。

(2)常用的操作

(3)使用场景

①计数器

②统计多个单位数量

③对象缓存存储

3.2 列表(list) ——可以有相同的值

(1)定义

有序的字符串列表,可以在表头或表尾推入或弹出元素(队列或栈结构)。

支持队列(先进先出)和栈(后进先出)的操作。

(2)常用命令

(3)使用场景

①消息队列

②任务调度

3.3 集合(set) ——值不能重复

(1)定义

无序唯一元素的集合。

(2)常见命令

(3)使用场景

可以实现差集、交集、并集。

3.4 哈希(hash) ——类似于Map集合

(1)定义

用于存储键值对的集合。

(2)常用命令

(3)使用场景

需要频繁访问和更新某个实体的多个字段的场景。

3.5 有序集合(zset) ——不能重复

(1)常用命令

(2)使用场景

应用于排行榜、优先队列等场景。

四、事务

4.1 事务定义

是一组命令的集合,不保证原子性。

4.2 与mysql的事务的区别

mysql事务:支持完整的ACID事务,保证所有操作要么全部成功,要么全部失败。

区别:redis事务不支持隔离级别,也不支持回滚。

4.3 代码解释 

注意:

①如果编译出错,则exec执行不成功,所有命令均不会执行。

②运行时错误,其他命令仍可以执行,只是在出错的地方抛出异常。

五、乐观锁和悲观锁 

5.1 乐观锁

(1)定义:假设冲突很少发生,操作过程中不锁定资源,只在提交时检测冲突。检测是否修改过数据,如果有修改,则放弃修改,不提交。

(2)使用场景:冲突较少、读多写少的场景(读取远多于写入的场景)

5.2 悲观锁

(1)定义:假设冲突总是会发生,操作前就锁定资源,直到操作结束再解锁

(2)使用场景:需要极强一致性、冲突频繁的场景(金融交易、多写操作)

5.3 乐观锁与悲观锁的区别和适用场景

实现方式差异:

        乐观锁通常通过版本号(Version)或时间戳实现。例如数据库表中增加version字段,更新时检查版本是否一致:

UPDATE table SET column = new_value, version = version + 1 WHERE id = ? AND version = old_version

        悲观锁依赖数据库或编程语言提供的锁机制,如:数据库:SELECT FOR UPDATE

性能对比:

        乐观锁在低冲突场景下性能更高,因为无需加锁和解锁,减少了线程阻塞的开销。

        悲观锁在高冲突场景中更稳定,但加锁会导致线程阻塞,可能引发死锁或性能下降。

适用场景:

乐观锁适合:

  • 读多写少的场景(如热点数据缓存更新)

  • 冲突概率较低的业务(如用户信息修改)

  • 需要高吞吐量的系统(如电商库存扣减)

悲观锁适合:

  • 写多读少的场景(如银行转账)

  • 关键数据的强一致性要求(如订单状态变更)

  • 短事务且冲突概率高的操作

优缺点总结:

乐观锁优点:

  • 无阻塞,并发性能高

  • 避免死锁问题

  • 适合分布式环境

乐观锁缺点:

  • 冲突频繁时重试成本高

  • 需处理业务逻辑的回滚

悲观锁优点:

  • 保证强一致性

  • 实现简单

悲观锁缺点:

  • 线程阻塞影响性能

  • 可能引发死锁

  • 不适合分布式系统

六、Redis持久化 

6.1 定义

将内存中的数据保存到磁盘中。

6.2 两种方式

(1)RDB

①原理:通过fork创建一个子进程,子进程将内存的内容写入到一个临时文件,持久化过程结束,把临时文件替换上一次持久化好的文件。(但要注意:整个过程中,主进程不进行任何IO操作)。

②优点:适合大规模数据恢复;对数据完整性要求不高。

③缺点:fork进程会占用一定的空间;需要一定的时间间隔操作,如果redis意外宕机,最后一次持久化后的数据就没有。

(2)AOF

①原理:将所有命令记录下来,恢复时将所有命令执行一遍。

②优点:每修改一次,都会同步,文件完整性比较好。

③缺点:AOF数据文件大,修复速度慢,运行效率低。

七、主从复制

7.1 概念

        将一个Redis服务器数据复制(数据复制是单向的)到其他服务器,前者称为主节点,后者称为从节点。主机负责写数据,从机读数据。(注意:从机不能写数据,从机将主机中的数据备份,同步主机数据)

7.2 模式

(1)一个主机有两个从机

(2)链路模式

八、哨兵模式

8.1 概念

        Redis哨兵(Sentinel)是Redis官方提供的高可用性解决方案,用于监控和管理Redis主从集群。哨兵模式的核心功能包括:自动故障检测、主从切换(failover)、配置更新和通知。哨兵通过心跳机制监测主节点和从节点的健康状态,当主节点故障时,哨兵会自动选举一个从节点晋升为新的主节点,并更新其他从节点的配置。

        简而言之:哨兵监测主机是否宕机,如果宕机则进行“投票”选举新的主节点,自动切换新主机。

8.2 优缺点

优点:

高可用性:自动故障转移机制确保主节点故障时服务不中断,提升系统容错能力。
自动化运维:无需人工干预即可完成主从切换和配置更新,降低运维成本。
监控与告警:哨兵持续监控节点状态,支持通过API或通知机制推送故障事件。
兼容性:与Redis主从复制无缝集成,无需修改客户端代码即可使用。

缺点:

脑裂问题:网络分区可能导致多个主节点同时存在(split-brain),需额外配置解决(如min-slaves-to-write)。
性能开销:哨兵进程本身需要资源,且故障转移期间可能存在短暂服务不可用。
配置复杂度:需部署多个哨兵节点(建议至少3个)以避免单点故障,配置和管理较复杂。
客户端适配:部分旧版客户端可能不支持哨兵协议,需升级或使用代理(如Twemproxy)。

九、缓存穿透、击穿和雪崩

1.缓存穿透——查不到

(1)定义

        客户端查询要查询数据,但发现Redis(缓存)中没有,向持久层数据库发起查询,数据库中也没有该数据,多次重复,会给持久层数据库造成较大的压力。

(2)解决办法

        ①布隆过滤器

        ②缓存空对象

2.缓存击穿——量太大,缓存过期

(1)定义

        对于热点数据,存在大量的并发,当热点数据消失时,持续并发穿破缓存,直接请求数据库,导致数据库瞬间压力大。

(2)解决办法

        ①互斥锁

        ②热点数据不过期

3.缓存雪崩

(1)定义

        缓存集中过期/Redis宕机

(2)解决办法

        ①限流降级

        ②数据预热

        ③Redis高可用

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

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

相关文章

【AI大模型】部署优化量化:INT8压缩模型

INT8(8位整数)量化是AI大模型部署中最激进的压缩技术,通过将模型权重和激活值从FP32降至INT8(-128~127整数),实现4倍内存压缩2-4倍推理加速,是边缘计算和高并发服务的核心优化手段。…

LFU 缓存

题目链接 LFU 缓存 题目描述 注意点 1 < capacity < 10^40 < key < 10^50 < value < 10^9对缓存中的键执行 get 或 put 操作&#xff0c;使用计数器的值将会递增当缓存达到其容量 capacity 时&#xff0c;则应该在插入新项之前&#xff0c;移除最不经常使…

检查输入有效性(指针是否为NULL)和检查字符串长度是否为0

检查输入有效性&#xff08;指针是否为NULL&#xff09;和检查字符串长度是否为0 这两个检查针对的是完全不同的边界情况&#xff0c;都是必要的防御性编程措施&#xff1a; 1. 空指针检查 if(!src) 目的&#xff1a;防止解引用空指针场景&#xff1a;当调用者传入 NULL 时风险…

Apache POI 的 HSSFWorkbook、SXSSFWorkbook和XSSFWorkbook三者的区别

HSSFWorkbook 专用于处理Excel 97-2003&#xff08;.xls&#xff09;格式的二进制文件。基于纯Java实现&#xff0c;所有数据存储在内存中&#xff0c;适合小规模数据&#xff08;通常不超过万行&#xff09;。内存占用较高&#xff0c;但功能完整&#xff0c;支持所有旧版Exce…

冷冻电镜重构的GPU加速破局:从Relion到CryoSPARC的并行重构算法

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、冷冻电镜重构的算力困局 随着单粒子冷冻电镜&#xff08;cryo-EM&#xff09;分辨率突破…

算法学习笔记:16.哈希算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题

在计算机科学中&#xff0c;哈希算法&#xff08;Hash Algorithm&#xff09;是一种将任意长度的输入数据映射到固定长度输出的技术&#xff0c;其输出称为哈希值&#xff08;Hash Value&#xff09;或散列值。哈希算法凭借高效的查找、插入和删除性能&#xff0c;在数据存储、…

16018.UE4+Airsim仿真环境搭建超级详细

文章目录 1 源码下载2 下载安装软件2.1 安装 UE4 软件2.2 安装visual studio 20223 编译airsim源码4 进入AirSim工程,打开工程5 UE4 工程创建5.1 下载免费场景 CityPark,并创建工程5.2 工程编译5.2.1 将airsim 插件拷贝到 UE4工程路径中5.2.2 修改工程配置文件5.2.3 创建c++类…

Python 实战:构建 Git 自动化助手

在多项目协作、企业级工程管理或开源社区维护中&#xff0c;经常面临需要同时管理数十甚至上百个 Git 仓库的场景&#xff1a;多仓库需要统一 pull 拉取更新定期向多个项目批量 commit 和 push自动备份 Git 项目批量拉取私有仓库并管理密钥为解决这类高频、重复、机械性工作&am…

【PTA数据结构 | C语言版】出栈序列的合法性

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 给定一个最大容量为 m 的堆栈&#xff0c;将 n 个数字按 1, 2, 3, …, n 的顺序入栈&#xff0c;允许按任何顺序出栈&#xff0c;则哪些数字序列是不可能得到的&#xff1f;例如给定 m5、n7&#xf…

【LangGraph】create_react_agent 方法详细解释

create_react_agent 方法详细解释 create_react_agent 方法是一个在 LangGraph 中创建 React 代理的核心函数,接下来我们将一起探讨这个函数的作用、参数、返回值以及工作原理。 @_convert_modifier_to_prompt def create_react_agent(model: Union[str, LanguageModelLike]…

【时间之外】尘封的智能套件复活记

目录 尘封的奖品 初次触网的挫败 客服只会诱导消费 意外发现的生机 真相与反思 尘封的奖品 五年前那个蝉鸣阵阵的夏日&#xff0c;我抱着创新比赛特等奖的奖品礼盒走下领奖台时&#xff0c;绝对想不到这份荣誉会衍生出如此曲折的故事。礼盒里静静躺着的智能家居套装&…

从零开始学前端html篇1

1基本结构<!DOCTYPE html> <html><head><title>this is a good website</title></head><body><h1>hello!</h1></body> </html>运行效果如下&#xff08;编辑器提示waings:"缺少所需的 lang 特性"…

Redis Cluster 手动部署(小白的“升级打怪”成长之路)

目录 一、环境规划 二、基础环境 1、创建配置目录 2、生成配置文件 3、修改监听端口 4、修改数据目录 5、修改日志目录 6、修改PID文件目录 7、修改保护模式 8、修改进程运行模式 9、修改监听地址 10、生成集群配置 11、启动服务 三、构建集群 1、将其他节点加入…

【Java入门到精通】(三)Java基础语法(下)

一、面向对象&#xff08;类和对象&#xff09;1.1 万事万物皆对象类&#xff1a;对对象向上抽取出像的部分、公共的部分以此形成类&#xff0c;类就相当于一个模板。对象&#xff1a;模板下具体的产物可以理解为具体对象&#xff0c;对象就是一个一个具体的实例&#xff0c;就…

Java文件传输要点

Java文件传输要点 一、前端 <form action"/upload" method"post" enctype"multipart/form-data"> <!--<form action"/upload" method"post">-->姓名: <input type"text" name"username…

Spring Boot 中使用 Lombok 进行依赖注入的示例

Spring Boot 中使用 Lombok 进行依赖注入的示例 下面我将展示 Spring Boot 中使用 Lombok 进行依赖注入的不同方式&#xff0c;包括构造器注入、属性注入和 setter 方法注入&#xff0c;以及相应的测试用例。 1. 构造器注入&#xff08;推荐方式&#xff09; import lombok.Req…

vue3+vit+vue-router路由,侧边栏菜单,面包屑导航设置层级结构

文章目录注意效果图目录结构代码vite.config.ts需要配置路径别名符号main.tsApp.vueBreadcrumb.vue面包屑组件menus.ts// src/router/index.ts其他文件注意 目录结构仅供参考DefaultLayout.vue 没有用到&#xff0c;我直接写在APP文件中vux-store我也没有用到&#xff0c;单独…

使用Selenium自动化获取抖音创作者平台视频数据

前言 在当今短视频盛行的时代&#xff0c;抖音作为国内领先的短视频平台&#xff0c;吸引了大量内容创作者。对于创作者而言&#xff0c;了解自己发布的视频表现&#xff08;如播放量、发布时间等&#xff09;至关重要。本文将介绍如何使用Python的Selenium库来自动化获取抖音…

SpringCloud之Eureka

SpringCloud之Eureka 推荐参考&#xff1a;https://www.springcloud.cc/spring-cloud-dalston.html#_service_discovery_eureka_clients 1. 什么是Eureka Eureka 用于简化分布式系统的服务治理&#xff0c;基于REST的服务&#xff0c;用于服务的注册与发现。通过注册发现、客户…

squash压缩合并

要将test分支的多次提交合并到dev分支并压缩为一个commit&#xff0c;核心是使用 git merge --squash 命令&#xff08;压缩合并&#xff09;&#xff0c;具体步骤如下&#xff1a; 详细步骤&#xff1a; 1. 切换到dev分支并拉取最新代码先确保本地dev分支是最新的&#xff0c;…