详解Redis

一.Redis的基本概念

首先,什么是Redis?

Redis(Remote Dictionary Server)是一个开源的、高性能的键值对内存数据库,常被用作缓存、消息队列、分布式锁等。

二.Redis的基本数据类型

1. 字符串(String)

  • 特点:Redis 中最基础的数据类型,是二进制安全的,意味着它可以包含任何数据,比如图片或者序列化的对象,一个键最大能存储 512MB 数据。
  • 常见操作
    • SET key value:设置键值对。
    • GET key:获取键对应的值。
    • INCR key:将键的值递增 1,如果键不存在,会先将其值初始化为 0 再递增。
  • 应用场景:缓存、计数器、分布式锁等。

2. 哈希(Hash)

  • 特点:键值对的集合,适合存储对象,比如一个用户的信息可以用哈希来存储,每个字段和值对应着用户的属性和属性值。
  • 常见操作
    • HSET key field value:为哈希表中的字段赋值。
    • HGET key field:获取哈希表中指定字段的值。
    • HGETALL key:获取哈希表中所有的字段和值。
  • 应用场景:存储对象信息,如用户信息、商品信息等。

3. 列表(List)

  • 特点:简单的字符串列表,按照插入顺序排序,可以在列表的头部(LPUSH)或者尾部(RPUSH)插入元素,也可以从头部(LPOP)或者尾部(RPOP)弹出元素。
  • 常见操作
    • LPUSH key value1 [value2]:将一个或多个值插入到列表头部。
    • RPOP key:移除并获取列表的最后一个元素。
    • LRANGE key start stop:获取列表指定范围内的元素。
  • 应用场景:消息队列、最新消息排行等。

4. 集合(Set)

  • 特点:无序且唯一的字符串集合,支持交集、并集、差集等操作。
  • 常见操作
    • SADD key member1 [member2]:向集合中添加一个或多个成员。
    • SMEMBERS key:返回集合中的所有成员。
    • SINTER key1 [key2]:返回给定所有集合的交集。
  • 应用场景:去重、共同好友、兴趣标签等。

5. 有序集合(Sorted Set)

  • 特点:和集合类似,也是唯一的,但每个成员都会关联一个分数(score),根据分数对成员进行排序。
  • 常见操作
    • ZADD key score1 member1 [score2 member2]:向有序集合中添加一个或多个成员。
    • ZRANGE key start stop [WITHSCORES]:返回有序集合中指定区间内的成员。
    • ZREM key member [member ...]:移除有序集合中的一个或多个成员。
  • 应用场景:排行榜、热门列表等。

6. 其他特殊类型(在 Redis 4.0 及以上版本)

  • Bitmaps:它不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作。可以用来实现高效的布尔数组,非常适合处理大量的布尔信息,如统计用户的签到情况。
  • HyperLogLogs:用于进行基数统计的概率性数据结构,它可以用极小的内存空间来统计集合中唯一元素的数量,比如统计网站的日活用户数。
  • Geospatial:用于存储地理位置信息,并对其进行操作,例如计算两个地理位置之间的距离、查找某个位置附近的地点等。

三.Redis高性能的原因

  1. 内存直接操作:数据存储在内存中,读写速度极快(读约 10 万次 / 秒,写约 8 万次 / 秒),避免磁盘 IO 瓶颈。
  2. 单线程模型:避免多线程上下文切换和锁竞争,基于非阻塞 IO(如 epoll)处理大量并发连接,事件驱动架构高效处理请求。
  3. 高效数据结构:内置哈希、跳表、压缩列表等数据结构,操作复杂度低(如 O (1) 或 O (logN)),且底层实现经过高度优化。
  4. 管道(Pipeline)与批量操作:支持一次性发送多个命令到服务端批量执行,减少网络传输开销。

四。Redis用作数据库的原因

  1. 持久化支持:通过 RDB(快照)和 AOF(日志重放)实现数据持久化,确保内存数据可落地存储,兼顾性能与数据可靠性。
  2. 丰富数据模型:支持 String、Hash、List、Set、Sorted Set 等多种数据类型,满足复杂业务场景(如缓存、计数器、排行榜、消息队列等)。
  3. 数据库级特性:支持事务(原子性)、LUA 脚本、过期策略、数据淘汰机制,以及基于键的复杂查询(如模糊匹配、范围查询)。
  4. 高可用性与扩展性:通过主从复制、哨兵(Sentinel)和集群(Redis Cluster)实现高可用和水平扩展,适合大规模数据存储。
  5. 极简架构与易用性:单进程模型部署简单,API 简洁,生态成熟(如与 Spring Data Redis 集成),降低开发和维护成本。

五.Redis 缓存穿透、缓存击穿和缓存雪崩问题

  • 缓存穿透:指查询一个不存在的数据,导致请求直接穿透缓存到数据库。解决方案有:对不存在的数据也进行缓存(如缓存空值);使用布隆过滤器提前过滤掉不可能存在的数据。
  • 缓存击穿:指一个热点 key 在缓存中过期,此时大量请求同时访问该 key,导致请求直接打到数据库。解决方案有:设置热点 key 永不过期;使用互斥锁,只允许一个线程去更新缓存。
  • 缓存雪崩:指大量缓存同时过期,导致大量请求直接打到数据库。解决方案有:设置不同的过期时间,避免缓存同时失效;使用分布式锁限制并发访问数据库的线程数;使用多级缓存。

六. Redis 的持久化

  • RDB(Redis Database)
    • 优点:文件紧凑,适合备份和灾难恢复;恢复速度快。
    • 缺点:可能会丢失最后一次快照后的所有数据;在快照过程中可能会阻塞主线程。
  • AOF(Append Only File)
    • 优点:数据安全性高,可配置不同的同步策略;日志文件以追加方式写入,不会丢失数据。
    • 缺点:AOF 文件通常比 RDB 文件大;恢复速度相对较慢。

七. Redis 分布式锁

实现原理:Redis 分布式锁通常基于 SETNX(SET if Not eXists)命令实现。

当一个线程尝试获取锁时,使用 SETNX 命令设置一个特定的 key,如果返回 1 表示获取锁成功,返回 0 表示锁已被其他线程持有。

为了避免死锁,还需要为锁设置一个过期时间。

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

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

相关文章

智慧医院的可视化变革:可视化工具助力数字化转型

在科技飞速发展的当下,智慧医院已从概念逐步落地,深刻改变着传统医疗模式。它借助互联网、数字孪生及人工智能等前沿技术,在医疗服务领域掀起革新,涵盖面向医务人员的“智慧医疗”、面向患者的“智慧服务”以及面向医院的“智慧管…

Ubuntu Linux系统配置账号无密码sudo

在Linux系统中,配置无密码sudo可以通过修改sudoers文件来实现。以下是具体的配置步骤 一、编辑sudoers文件 输入sudo visudo命令来编辑sudo的配置文件。visudo是一个专门用于编辑sudoers文件的命令,它会在保存前检查语法错误,从而防止可能的…

graphviz和dot绘制流程图

graphviz和dot绘制流程图 指令 1.写后端需求文档 2.用中文输出结果 3.必须详细全面 4.必须搭配相关流程图step1:下载graphviz,https://graphviz.org/download/ step2:安装,记得添加环境变量 step3:验证是否安装成功 dot --versio…

MongoDB常用操作示例

以下是基于 MongoDB Shell 的完整操作示例,覆盖数据库管理、集合操作、文档处理、聚合分析、索引管理等核心功能,并结合实际场景说明。所有示例均结合搜索结果中的技术要点整理而成。 一、连接与配置管理 1. 启动 MongoDB Shell 并连接实例 # 默认连接…

C++ 模板方法模式详解与实例

模板方法模式概念​ 模板方法模式(Template Method Pattern)属于行为型设计模式,其核心思想是在一个抽象类中定义一个算法的骨架,而将一些步骤延迟到子类中实现。这样可以使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。它通过继承机制,实现代码复用和行为…

MySQL基础关键_012_事务

目 录 一、概述 二、ACID 四大特性 三、MySQL 事务 四、事务隔离级别 1.说明 2.现象 (1)脏读 (2)不可重复读 (3)幻读 3.查看隔离级别 4.设置隔离级别 5.隔离级别 (1)初始…

Hutool中的Pair类详解

1. Pair类概述 Hutool工具库中的Pair类是一个简单的键值对数据结构,用于存储两个相关联的对象。它类似于Map的Entry,但更加轻量级,适用于需要临时存储两个相关联数据的场景。 2. Pair类的主要特点 简单轻量:不依赖复杂的数据结…

02-GBase 8s 事务型数据库 客户端工具dbaccess

dbaccess概述 数据库产品通常会提供一个命令行客户端工具。 数据库厂商 命令行客户端 Oracle sqlplus MySQL mysql Marladb mysql GBase 8s dbaccess Kingbase ES ksql DM8 disql dbaccess 是 GBase 8s 数…

手撕基于AMQP协议的简易消息队列-8(单元测试的编写)

在MQTest中编写模块的单元测试 在MQTest中编写makefile文件来编译客户端模块 all:Test_FileHelper Test_Exchange Test_Queue Test_Binding Test_Message Test_VirtualHost Test_Route Test_Consumer Test_Channel Test_Connection Test_VirtualHost:Test_VirtualHost.cpp ..…

Spark 之 metrics

peak memory.//sql/core/src/main/scala/org/apache/spark/sql/execution/aggregate/HashAggregateExec.scala: “peakMemory” -> SQLMetrics.createSizeMetric(sparkContext, “peak memory”), .//sql/core/src/main/scala/org/apache/spark/sql/execution/SortExec.scal…

HTTP/HTTPS协议(请求响应模型、状态码)

目录 HTTP/HTTPS协议简介 HTTP协议 HTTPS协议 请求 - 响应模型 HTTP请求 (二)HTTP响应 HTTPS协议与HTTP协议在请求 - 响应模型中的区别 HTTP/HTTPS协议简介 HTTP协议 定义 HTTP(HyperText Transfer Protocol)即超文本传输…

OpenHarmony 5.0 切换已连接过的wifi切换失败

目录 1.背景 2.流程分析 3.方案 1.背景 在OpenHarmony 5.0的设置中,输入密码进行wifi连接可以正常连接,然后多个已经连接过的wifi进行切换发现大概率切换失败 2.流程分析 wifi连接过程其实是先进行断开当前的wifi连接,然后再连接另一个wifi,如下: 虽然上述流程看起来没…

【Ollama】docker离线部署Ollama+deepseek

因为要做项目,实验室的服务器不联网,所以只能先打包一个基础的docker环境,然后再在实验室的服务器上进行解压和配置环境 参考:https://zhuanlan.zhihu.com/p/23377266873 1.打包基础的docker环境 这里最好用有cuda的&#xff0c…

如何使用极狐GitLab 软件包仓库功能托管 terraform?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Terraform 模块库 (BASIC ALL) 基础设施仓库和 Terraform 模块仓库合并到单个 Terraform 模块仓库功能引入于极狐GitLab 15.1…

【QT】深入理解 Qt 中的对象树:机制、用途与最佳实践

深入理解 Qt 中的对象树:机制、用途与最佳实践 在使用 Qt 编程时,你是否注意到很多对象可以设置“父对象”?比如: QPushButton* btn new QPushButton(parentWidget);这不是简单的层级结构,而是 Qt 强大而优雅的 对象…

比较入站和出站防火墙规则

组织需要仔细配置防火墙规则,监控网络的传入和传出流量,从而最大限度降低遭受攻击的风险。在有效管理入站和出站防火墙规则前,了解入站与出站流量的区别至关重要。 一、什么是入站流量? 入站流量指的是并非源自网络内部&#xf…

Unity-Shader详解-其五

关于Unity的Shader部分的基础知识其实已经讲解得差不多了,今天我们来一些实例分享: 溶解 效果如下: 代码如下: Shader "Chapter8/chapter8_1" {Properties{// 定义属性[NoScaleOffset]_Albedo("Albedo", 2…

COLT_CMDB_linux_userInfo_20250508.sh修复历史脚本输出指标信息中userName与输出信息不一致问题

#!/bin/bash #IT_BEGIN #IT_TYPE3 #IT SYSTEM_LINUX_AGENTUSERDISCOVER|discovery.user[disc] #原型指标 #IT_RULE SYSTEM_LINUX_AGENTUSERGROUPID|groupId[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERHOME|userHome[{#USERNAME}] #IT_RULE SYSTEM_LINUX_AGENTUSERNAME|user…

TCP 与 UDP报文

** TCP 与 UDP报文** 1. 引言 在网络通信中,TCP(传输控制协议) 和 UDP(用户数据报协议) 是两种最核心的传输层协议。它们各自适用于不同的场景,理解其工作原理对开发高性能网络应用至关重要。本文将详细解…

LabVIEW燃气轮机测控系统

在能源需求不断增长以及生态环境保护备受重视的背景下,微型燃气轮机凭借其在经济性、可靠性、维护性及排放性等方面的显著优势,在航空航天、分布式发电等众多领域得到广泛应用。随着计算机技术的快速发展,虚拟仪器应运而生,LabVIE…