滚雪球学Redis[1.1讲]:什么是Redis?

全文目录:

  • 1.1 什么是 Redis?
    • 一、Redis 的定义与特点
      • 1.1 Redis 的定义
      • 1.2 Redis 的特点
      • 1.3 案例演示:Redis 的基本使用
    • 二、Redis 的历史与发展
      • 2.1 Redis 的诞生
      • 2.2 Redis 的发展历程
      • 2.3 Redis 的生态系统
    • 三、Redis 在不同场景中的应用
      • 3.1 缓存系统
        • 案例演示:用户会话缓存
      • 3.2 排行榜与计数器
        • 案例演示:简单的积分排行榜
      • 3.3 消息队列
        • 案例演示:发布/订阅模式
      • 3.4 实时分析
      • 3.5 分布式锁
        • 案例演示:使用 Redis 实现分布式锁
    • 四、总结与展望

1.1 什么是 Redis?

在上一期 1.0 数据库的演进到 Redis 中,我们讨论了数据库技术的发展历程。从传统的关系型数据库(如 MySQL、PostgreSQL)到 NoSQL 数据库的兴起,尤其是在互联网高速发展的背景下,传统数据库面临着高并发、大数据处理时的性能瓶颈。为了满足新一代应用对性能、扩展性和实时性的需求,NoSQL 数据库应运而生,而其中最具代表性的便是 Redis。它以卓越的性能和丰富的功能迅速成为了技术架构中不可或缺的一部分。

在本期内容中,我们将重点探讨 什么是 Redis,深入分析它的 定义与特点,追溯 Redis 的历史与发展,并剖析 Redis 在 不同应用场景中的广泛应用。通过这些内容,我们将深入理解 Redis 为什么能在现代互联网架构中如此受欢迎。同时,我们也将为下一期内容 1.2 Redis 的基本架构 做铺垫,为更好地理解 Redis 的内部工作原理奠定基础。

一、Redis 的定义与特点

1.1 Redis 的定义

Redis,全称为 Remote Dictionary Server(远程字典服务),是一种基于内存的高性能键值对存储系统,通常归类为 NoSQL 数据库。它最早由意大利开发者 Salvatore Sanfilippo 于 2009 年开发,旨在解决当时关系型数据库在实时数据处理方面的性能瓶颈。作为 NoSQL 数据库家族的重要成员,Redis 不仅具备传统数据库的持久化特性,还因为其基于内存的架构,能够提供极快的读写速度。

Redis 支持丰富的数据结构,如 字符串(String)哈希(Hash)列表(List)集合(Set)有序集合(Sorted Set)。这些多样化的数据结构使得 Redis 能够应用于更广泛的场景中,而不仅仅是简单的键值对存储。此外,Redis 还支持事务、发布订阅、持久化、多种高可用方案(如主从复制、哨兵和集群模式)等高级功能,极大地增强了系统的可扩展性和数据的持久性。

1.2 Redis 的特点

Redis 之所以在 NoSQL 领域中脱颖而出,主要归功于其以下几大核心特点:

  • 基于内存的存储:Redis 的所有数据都存储在内存中,因此其读写速度极快,通常可以在毫秒级别内完成操作。这使得 Redis 特别适合需要极高性能的场景,如高速缓存、实时分析等。

  • 支持多种数据结构:与其他 NoSQL 数据库不同,Redis 支持多种丰富的数据结构,如字符串、哈希、列表、集合、有序集合、位图(Bitmap)等。这使得 Redis 在处理复杂数据和实现多样化应用时表现出色。

  • 高效的持久化机制:尽管 Redis 主要以内存为核心,但它提供了持久化功能,可以将数据保存在磁盘上。Redis 提供了两种主要的持久化方式:

    • RDB(Redis Database):定期对数据进行快照保存。
    • AOF(Append Only File):记录每次对数据库的修改并追加到日志文件中。
  • 高可用与分布式:Redis 提供了多种高可用性解决方案,包括 主从复制哨兵模式(Sentinel) 以及 Redis 集群(Cluster),可以支持水平扩展和自动故障转移,适应大规模分布式系统的需求。

  • 支持事务和 Lua 脚本:Redis 支持基本的事务功能,通过 MULTIEXEC 可以保证一组命令的原子性。它还支持 Lua 脚本,这让复杂的操作可以在服务器端以脚本形式执行,减少了网络开销。

  • 轻量级和高效:Redis 的核心是单线程设计,通过 I/O 多路复用技术来处理大量并发请求。它的轻量级架构和高效的资源利用率使其在实际应用中非常受欢迎。

1.3 案例演示:Redis 的基本使用

# 启动 Redis 客户端
redis-cli# 设置一个简单的键值对
127.0.0.1:6379> SET name "Redis"
OK# 获取键对应的值
127.0.0.1:6379> GET name
"Redis"# 使用哈希存储用户信息
127.0.0.1:6379> HSET user:1 name "John Doe" age 30
(integer) 2# 获取哈希中的字段值
127.0.0.1:6379> HGET user:1 name
"John Doe"

这个简单的示例展示了 Redis 基本的键值对操作,以及哈希数据结构的应用。通过这些命令,我们可以直观地体验到 Redis 的高效操作。

二、Redis 的历史与发展

2.1 Redis 的诞生

Redis 由 Salvatore Sanfilippo 于 2009 年发布,最初是为了解决他开发的实时分析系统无法满足性能需求的问题。传统的关系型数据库在处理大量实时数据时,效率很低,无法快速响应。Sanfilippo 意识到需要一种全新的存储系统,该系统可以基于内存运行,并提供极快的读写能力,同时支持持久化。这促使他开发了 Redis,并将其作为一个开源项目发布。

2.2 Redis 的发展历程

自 2009 年发布以来,Redis 迅速获得了开发者的青睐。以下是 Redis 在不同版本中实现的一些重要特性:

  • 2010 年:Redis 2.0 发布
    引入了 RDB 持久化机制,使得 Redis 可以在内存数据库之外,定期将数据存储到磁盘中。同时,Redis 2.0 提供了主从复制机制,支持数据在多个节点之间的同步和备份。

  • 2011 年:哨兵模式(Sentinel)发布
    Redis 2.4 版本推出了哨兵模式,这是 Redis 高可用性的重要一步。哨兵模式通过监控主从节点的状态,实现了自动故障转移,保证系统在出现故障时仍能正常运行。

  • 2013 年:Redis 集群(Cluster)发布
    Redis 3.0 版本发布了集群模式,支持将数据分片存储在多个节点上,并提供自动数据分片和负载均衡能力,从而支持大规模数据处理和系统水平扩展。

  • 2016 年:引入多线程 I/O
    Redis 6.0 引入了多线程 I/O 模型,以进一步提升 Redis 在高并发场景中的性能,特别是当客户端连接数非常高时,这一改进显著提高了 Redis 的响应能力。

  • 2020 年:Redis 6.0 发布,增强安全性和可扩展性
    Redis 6.0 引入了 ACL(访问控制列表)功能,增强了安全性。同时,多线程的引入使得 Redis 在处理大量客户端连接时,性能得到了进一步优化。

2.3 Redis 的生态系统

随着 Redis 的不断发展,围绕 Redis 形成了庞大的生态系统。除了 Redis 核心数据库外,还涌现出了许多扩展和插件,进一步丰富了 Redis 的功能和应用场景。常见的扩展模块包括:

  • RedisJSON:允许 Redis 存储和操作 JSON 数据。
  • RediSearch:提供全文搜索功能,允许在 Redis 中进行复杂的文本搜索操作。
  • RedisGraph:使 Redis 支持图数据结构,能够存储和查询复杂的图数据。

这些扩展模块让 Redis 不仅仅是一个简单的键值存储系统,它还可以作为更复杂的应用平台,支持全文搜索、图查询等高端需求。

三、Redis 在不同场景中的应用

Redis 的高性能、多数据结构支持和持久化特性,使得它在许多业务场景中都能发挥重要作用。以下是 Redis 在实际应用中的一些典型场景:

3.1 缓存系统

Redis 最常见的应用场景就是作为高速缓存。由于 Redis 是基于内存的存储系统,响应速度非常快,因此它常常用来缓存频繁访问的数据,从而减少对后端数据库的压力。例如,在 Web 应用中,Redis 可以缓存用户会话、热点数据、页面片段等。

案例演示:用户会话缓存
# 缓存用户会话信息,并设置 1 小时后过期
SET session:12345 "user data" EX 3600

在这个例子中,Redis 被用于存储用户的会话信息,并设置了一个 1 小时的过期时间,这有助于提升网站性能。

3.2 排行榜与计数器

Redis 的有序集合(Sorted Set)提供了强大的数据排序功能,可以轻松实现排行榜系统。此外,Redis 的原子操作支持高效的计数器实现,适用于实时统计和分析。

案例演示:简单的积分排行榜
# 添加用户积分
ZADD leaderboard 1000 "user1"
ZADD leaderboard 950 "user2"# 获取积分最高的前两名用户
ZRANGE leaderboard 0 1 WITHSCORES

通过有序集合,Redis 可以快速获得指定范围内的元素,确保排行榜的实时性和准确性。

3.3 消息队列

Redis 提供了发布/订阅(Pub/Sub)功能,使其能够作为消息队列使用。在实时通信、日志处理和任务调度中,Redis 可以实现轻量级、高效的消息分发。

案例演示:发布/订阅模式
# 订阅频道
SUBSCRIBE news_channel# 发布消息
PUBLISH news_channel "Breaking News!"

这一机制使得 Redis 可以高效处理消息传递,特别适用于实时通信和数据推送的场景。

3.4 实时分析

Redis 的基于内存的架构和丰富的数据结构使其成为实时分析的理想选择。在用户行为跟踪、网站监控、数据流处理等场景中,Redis 能够快速处理海量数据,提供实时反馈。

3.5 分布式锁

Redis 的原子性操作使其能够实现高效的分布式锁,用于解决分布式系统中的并发问题。通过 SETNX 命令,Redis 可以确保锁的独占性。

案例演示:使用 Redis 实现分布式锁
# 尝试获取锁,设置过期时间为 10 秒
SET lock:resource "locked" NX EX 10

Redis 的分布式锁功能在处理高并发事务时表现尤为出色,确保了系统的一致性和可靠性。

四、总结与展望

通过本期内容的学习,我们详细了解了 Redis 的定义、特点,以及其发展历程。同时,我们分析了 Redis 在不同应用场景中的典型用例,如缓存、排行榜、消息队列、实时分析和分布式锁等。Redis 以其卓越的性能和多功能的特性,成为现代互联网应用中不可或缺的组件。

在下一期 1.2 Redis 的基本架构 中,我们将深入探讨 Redis 的内部架构设计,剖析它的客户端-服务器模型、单线程与多线程模型、持久化机制等关键技术点。理解这些核心架构对于我们进一步优化和使用 Redis 至关重要。敬请期待!

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

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

相关文章

Kron Reduction消去法如何操作,矩阵推导过程

三阶矩阵消去单节点 在电力系统中,母线上的电流注入始终为0,这样的节点可以通过一定的方法消除。以三节点为例,假设注入节点3的电流为0,则: [ I 1 I 2 I 3 ] = [ I 1 I 2 0 ] = [ Y 11 Y 12 Y 13 Y 21 Y 22 Y 23 Y 31 Y 32 Y 33 ] [ V 1 V 2 V 3 ] \left[\begin{array}{…

计算机网络:数据链路层 —— 数据链路层概述

文章目录 数据链路层主要功能 基本概念链路数据链路帧 数据链路层 在计算机网络中,链路层(Data Link Layer)是网络协议栈中的一层,负责管理和控制链路的建立、维护和释放,以及处理链路层的数据帧传输和错误控制等功能…

go发送邮件:在Go语言中实现发邮件的教程?

go发送邮件的教程指南?怎么使用Go语言发送电子邮件? Go语言,作为一种简洁、高效且并发性强的编程语言,自然也提供了丰富的库来支持邮件发送功能。AokSend将详细介绍如何在Go语言中实现发送邮件的功能,帮助你快速掌握这…

服务器数据恢复—硬盘坏扇区导致Linux系统服务器数据丢失的数据恢复案例

服务器数据恢复环境: 一台linux操作系统网站服务器,该服务器上部署了几十个网站,使用一块SATA硬盘。 服务器故障&原因: 服务器在工作过程中突然宕机。管理员尝试重新启动服务器失败,于是将服务器上的硬盘拆下检测…

腾讯云SDK地址生成器

音视频终端 SDK(腾讯云视立方)将新版连麦管理方案的多个功能集成至 腾讯云视立方控制台 > 连麦管理,便于用户快捷使用,具体分为快速上手、连麦应用、用量统计和地址生成器四个功能页面。更多连麦功能说明,请参见 新…

查询v$asm_disk等待enq: DD - contention

1.两个节点查询v$asm_disk均卡住,等待enq: DD - contention,阻塞源头为rbal进程,rbal进程未发生阻塞,未在异常等待事件上。 2.阻塞源头RBAL,在CPU上运行。没有在做rebalance磁盘平衡。 3.diag诊断日志中,阻…

springboot 整合 rabbitMQ(2)

springboot 整合 rabbitMQ(1)-CSDN博客 上期说了rabbitMQ的基础用法(普通队列模式) 这期学习一下如何防止消息重复消费和进阶用法(订阅者模式) 目录 重复消费问题 导致 RabbitMQ 重复消费问题的原因&a…

《Windows PE》4.1.4 手工重构导入表

接下来我们做一个稍微复杂一些的实验,实验需要四个程序: HelloWorld.exe:弹出MessageBox窗口(实验1已实现)。 Regedit.exe:添加注册表启动项。 LockTray.exe:锁定任务栏窗口。 UnLockTray.exe&…

pandas的用法

1.简介: pandas是一个开源的python数据分析库提供了快速,灵活和表达力强的数据结构,使数据清洗和分析工作变得更加简单易行。pandas的核心数据结构是DataFrame和Series 2.DataFrame的基本操作: DataFrame是pandas库中的一个二维…

【项目记录】大模型基于llama.cpp在Qemu-riscv64向量扩展指令下的部署

概述 本文在qemu-riscv64平台上,利用向量扩展指令加速运行基于llama.cpp构建的大模型。 参考博客链接: Accelerating llama.cpp with RISC-V Vector Extension 基于RVV的llama.cpp在Banana Pi F3 RISCV开发板上的演示 llama.cpp工程 Llama.cpp是一个基…

AI教父荣获2024诺贝尔物理学奖:杰弗里·辛顿和他的深度学习之路!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…

Chrome浏览器调用ActiveX控件--allWebOffice控件功能介绍

allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作微软Office及WPS办公文档的应用(阅读、编辑、保存等),支持编辑文档时保留修改痕迹,支持书签位置内容动态填充,支持公文套红,支持文档…

springMVC添加webapp

项目结构-->模块-->找到想添加的模块下的web 点击号 添加路径 会在.../src/main/目录下自动生成目录

Golang | Leetcode Golang题解之第467题环绕字符串中唯一的子字符串

题目: 题解: func findSubstringInWraproundString(p string) (ans int) {dp : [26]int{}k : 0for i, ch : range p {if i > 0 && (byte(ch)-p[i-1]26)%26 1 { // 字符之差为 1 或 -25k} else {k 1}dp[ch-a] max(dp[ch-a], k)}for _, v :…

【xilinx-versal】【Petalinux】I2C驱动开发问题记录

问题 调试中发现系统起来后无I2C设备。 仔细查找后发现没有配置versal的I2C控制器。 解决方法 打开versal的I2C控制器的配置 起来后I2C设备注册成功

使用idea和vecode创建vue项目并启动(超详细)

一、idea创建vue项目 创建项目之前先下载好插件 新建项目找到vue生成器 写好名称,找到自己需要存放的地址,node解释器安装方式可以看我上一个博客,vueCLI是选择vue的版本,我们可以使用idea自带的vue版本默认是vue3,创…

标准正态分布的数据 tensorflow 实现正态分布图,python 编程,数据分析和人工智能

import tensorflow as tf import matplotlib.pyplot as plt # 设置随机种子以获得可重复的结果 tf.random.set_seed(42) # 生成正态分布的数据 # mean0 和 stddev1 表示生成标准正态分布的数据 # shape(1000,) 表示生成1000个数据点 data tf.random.normal(mean0, stddev1, …

postman变量,断言,参数化

环境变量 1.创建环境变量 正式环境是错误的,方便验证环境变化 2.在请求中添加变量 3.运行前选择环境变量 全局变量 能够在任何接口访问的变量 console中打印日志 console.log(responseBody);//将数据解析为json格式 var data JSON.parse(responseBody); conso…

k8s中pod的管理

资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务 所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器&…

NLP: SBERT介绍及sentence-transformers库的使用

1. Sentence-BERT Sentence-BERT(简写SBERT)模型是BERT模型最有趣的变体之一,通过扩展预训练的BERT模型来获得固定长度的句子特征,主要用于句子对分类、计算两个句子之间的相似度任务。 1.1 计算句子特征 SBERT模型同样是将句子标记送入预训练的BERT模型…