当前位置: 首页 > news >正文

深度剖析Redis:从基础到高级应用

目录

引言

1、 Redis基础

1.1 Redis数据结构

1.1.1 字符串(String)

1.1.2 列表(List)

1.1.3 集合(Set)

1.1.4 散列(Hash)

1.1.5 有序集合(Sorted Set)

1.1.6 位图(Bitmap)

1.1.7 HyperLogLog

1.1.8 地理位置(Geospatial)

1.2 Redis持久化

1.2.1 RDB快照

1.2.2 AOF日志

1.3 主从复制

1.3.1 主从复制工作原理

2. 高级应用场景

2.1 分布式锁

2.2 发布订阅

3. 性能优化技巧

3.1 Pipeline

3.2 缓存穿透防护

结语


Redis(Remote Dictionary Server)是一个开源的内存数据库,被广泛用于构建高性能、可扩展的应用。本篇博客将深入探讨Redis的基础知识,包括数据结构、持久化、主从复制等方面,同时介绍一些高级应用场景和性能优化技巧。通过理论和实例相结合的方式,旨在帮助读者全面了解和应用Redis技术。

1、 Redis基础

Redis支持多种数据结构,包括字符串、列表、集合、散列、有序集合等。我们将深入了解每一种数据结构的特性和适用场景,并通过代码演示加深理解。

1.1 Redis数据结构

Redis支持多种数据结构,包括字符串、列表、集合、散列、有序集合等。我们将深入了解每一种数据结构的特性和适用场景,并通过代码演示加深理解。

1.1.1 字符串(String)

 描述:

字符串是Redis最简单的数据结构,可以包含任何形式的数据,比如文本或二进制数据。

 代码演示:

# 设置字符串
SET my_key "Hello, Redis!"# 获取字符串
GET my_key
1.1.2 列表(List)

 描述:

列表是一个有序的字符串元素集合,允许元素重复。可以在列表的两端进行元素的插入和删除操作。

 代码演示:

# 向列表中添加元素到左侧
LPUSH my_list "Item1"
LPUSH my_list "Item2"# 获取列表范围内的元素
LRANGE my_list 0 -1
1.1.3 集合(Set)

 描述:

集合是一个无序的字符串元素集合,不允许元素重复。支持集合运算,如交集、并集、差集等。

代码演示:

# 向集合中添加元素
SADD my_set "Member1"
SADD my_set "Member2"# 获取集合所有成员
SMEMBERS my_set
1.1.4 散列(Hash)

4.1 描述:

散列是一种字段和值的映射表,用于存储对象。每个字段都是一个字符串,值可以是字符串或其他数据类型。

4.2 代码演示:

# 设置散列字段值
HSET my_hash field1 "Value1"
HSET my_hash field2 "Value2"# 获取散列所有字段值
HGETALL my_hash
1.1.5 有序集合(Sorted Set)

5.1 描述:

有序集合是一种有序的字符串元素集合,每个元素关联一个分数。通过分数进行排序,支持范围查询和排名操作。

5.2 代码演示:

# 向有序集合中添加成员及其分数
ZADD my_zset 1 "Member1"
ZADD my_zset 2 "Member2"# 获取有序集合范围内的成员
ZRANGE my_zset 0 -1 WITHSCORES
1.1.6 位图(Bitmap)

6.1 描述:

位图是一种存储位数据的数据结构,支持位操作。通常用于记录用户在线状态、用户签到等。

6.2 代码演示:

# 设置位图位值
SETBIT my_bitmap 0 1# 获取位图位值
GETBIT my_bitmap 0
1.1.7 HyperLogLog

7.1 描述:

HyperLogLog用于估算集合的基数(不重复元素的数量)。它通过使用固定数量的位来表示一个集合,以较小的内存开销进行近似统计。

7.2 代码演示:

# 添加元素到HyperLogLog
PFADD my_hyperloglog "Element1"
PFADD my_hyperloglog "Element2"# 获取HyperLogLog基数估算值
PFCOUNT my_hyperloglog
1.1.8 地理位置(Geospatial)

8.1 描述:

Geospatial数据结构用于存储地理位置信息,支持距离计算和附近成员查询。

8.2 代码演示:

# 添加地理位置信息
GEOADD my_geo 13.361389 38.115556 "Palermo"
GEOADD my_geo 15.087269 37.502669 "Catania"# 获取两地之间的距离
GEODIST my_geo "Palermo" "Catania" km

以上是每种数据结构的详细说明和相应的代码演示。在实际应用中,选择合适的数据结构能够更好地满足业务需求,提高系统性能。

1.2 Redis持久化

Redis提供两种持久化方式:RDB(Redis DataBase)快照和AOF(Append Only File)日志。我们将深入了解这两种方式的工作原理,以及如何根据需求选择合适的持久化方式。

1.2.1 RDB快照

RDB是通过周期性地将内存数据保存到磁盘上的快照文件的方式实现的。可以通过配置文件调整RDB的保存策略。

# 配置文件中设置RDB保存策略
save 900 1   # 在900秒内,发生1次修改则触发保存
save 300 10  # 在300秒内,发生10次修改则触发保存
save 60 10000 # 在60秒内,发生10000次修改则触发保存
1.2.2 AOF日志

AOF通过记录每个写操作的日志来实现持久化。AOF日志文件中包含了可以还原数据库状态的操作记录。同样可以通过配置文件进行相关设置。

# 配置文件中启用AOF
appendonly yes# 配置文件中设置AOF保存策略
appendfsync everysec

1.3 主从复制

Redis支持主从复制机制,可以通过将一个节点设置为主节点,其他节点设置为从节点,实现数据的同步和负载均衡。

1.3.1 主从复制工作原理

当从节点连接到主节点后,主节点将实时发送写操作命令给从节点,从而保持两者数据的同步。当主节点发生故障时,可以快速切换从节点为主节点,保证系统的高可用性。

2. 高级应用场景

2.1 分布式锁

在分布式系统中,实现分布式锁是一个常见的需求。我们将通过Redis的SETNX命令和WATCH机制,演示如何使用Redis实现简单的分布式锁。

// Java代码演示分布式锁
public class DistributedLock {private static final String LOCK_KEY = "my_lock";private static final int EXPIRE_TIME = 300;public boolean tryGetDistributedLock(Jedis jedis, String clientId) {String result = jedis.set(LOCK_KEY, clientId, "NX", "EX", EXPIRE_TIME);return "OK".equals(result);}public void releaseDistributedLock(Jedis jedis, String clientId) {String lockValue = jedis.get(LOCK_KEY);if (clientId.equals(lockValue)) {jedis.del(LOCK_KEY);}}
}

2.2 发布订阅

Redis提供了发布订阅(Pub/Sub)功能,通过订阅频道和发布消息的方式,实现消息的广播。我们将通过代码演示如何使用Redis的发布订阅功能。

// Java代码演示发布订阅
public class PubSubExample {private static final String CHANNEL = "my_channel";public void subscribe(Jedis jedis) {JedisPubSub jedisPubSub = new JedisPubSub() {@Overridepublic void onMessage(String channel, String message) {System.out.println("Received message: " + message + " from channel: " + channel);}};jedis.subscribe(jedisPubSub, CHANNEL);}public void publish(Jedis jedis, String message) {jedis.publish(CHANNEL, message);}
}

3. 性能优化技巧

3.1 Pipeline

Redis Pipeline是一种批量执行命令的机制,通过减少客户端与服务端的通信次数,提高了命令的执行效率。我们将通过代码演示如何使用Pipeline。

// Java代码演示Pipeline
public class PipelineExample {public void usePipeline(Jedis jedis) {Pipeline pipeline = jedis.pipelined();for (int i = 0; i < 1000; i++) {pipeline.set("key" + i, "value" + i);}List<Object> results = pipeline.syncAndReturnAll();}
}

3.2 缓存穿透防护

缓存穿透是指查询一个数据库或缓存中一定不存在的数据,导致每次请求都穿透到数据库,影响性能。我们将通过使用布隆过滤器来防护缓存穿透。

// Java代码演示缓存穿透防护
public class BloomFilterExample {private BloomFilter<String> bloomFilter;public BloomFilterExample(int expectedInsertions, double falsePositiveRate) {this.bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()),expectedInsertions, falsePositiveRate);}public void addToBloomFilter(String key) {bloomFilter.put(key);}public boolean mayContain(String key) {return bloomFilter.mightContain(key);}
}

结语

通过本篇博客的深度剖析,我们全面了解了Redis的基础知识、主从复制、高级应用场景以及性能优化技巧。Redis作为一款高性能的内存数据库,其丰富的功能和灵活的应用场景使得它在分布式系统中有着重要的地位。希望读者通过这篇博客,能够更深入地理解Redis。

朋友,不要忘了开心!

相关文章:

深度剖析Redis:从基础到高级应用

目录 引言 1、 Redis基础 1.1 Redis数据结构 1.1.1 字符串&#xff08;String&#xff09; 1.1.2 列表&#xff08;List&#xff09; 1.1.3 集合&#xff08;Set&#xff09; 1.1.4 散列&#xff08;Hash&#xff09; 1.1.5 有序集合&#xff08;Sorted Set&#xff09;…...

视频监控录像服务器(中心录像服务器)功能详细介绍

目 录 一、概述 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;视频监控中心录像服务器 二、存储策略服务 &#xff08;一&#xff09;存储策略配置 1、 录入页面 2、 选择需要进行录像的视频 3、批量选择多个通道号 4、其他关键参数…...

SouthernBiotech抗荧光淬灭封片剂

荧光淬灭又称荧光熄灭或萃灭&#xff0c;是指导致特定物质的荧光强度和寿命减少的所有现象。引起荧光淬灭的物质称为荧光淬灭剂。SouthernBiotech专门开发的Fluoromount-G系列荧光封片剂是以甘油为基础&#xff0c;加入抗荧光淬灭剂&#xff0c;可明显降低荧光淬灭现象&#xf…...

[Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例

在群組中看到上述問題&#xff0c;研判應是一份隨月份變動的產品報價表單&#xff0c;空白欄可能表示該月份價格與上個月份一致。這個問題是需要取得最近一次單價和倒數第二次單價&#xff0c;常用且實務的excel案例值得紀錄。 最近一次單價: INDEX($B2:$G2,1,LARGE(IF(ISBLAN…...

TypeScript进阶(二)深入理解装饰器

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…...

书生·浦语第三次作业

我最近在参加书生浦语大模型实战营&#xff0c;这是第三次作业打卡&#xff01; 如果你也想两周玩转大模型微调&#xff0c;部署与测评全链路。报名链接&#xff1a;invite 书生浦语大模型实战营报名 邀请码可以填026014 一、基础作业&#xff1a;复现课程知识库助手搭建过程…...

GPT实战系列-LangChain + ChatGLM3构建天气查询助手

GPT实战系列-LangChain ChatGLM3构建天气查询助手 用ChatGLM的工具可以实现很多查询接口和执行命令&#xff0c;而LangChain是很热的大模型应用框架。如何联合它们实现大模型查询助手功能&#xff1f;例如调用工具实现网络天气查询助手功能。 LLM大模型相关文章&#xff1a; …...

LeetCode 2696.删除子串后的字符串最小长度:栈

【LetMeFly】2696.删除子串后的字符串最小长度&#xff1a;栈 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-string-length-after-removing-substrings/ 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作&#xff0c;在每一步操…...

Xcode15 升级问题记录

这里写自定义目录标题 新版本Xcode15升级问题1&#xff1a;rsync error: some files could not be transferred (code 23) at ...参考 新版本Xcode15升级 下载地址&#xff1a;https://developer.apple.com/download/all/ 我目前使用的版本是Xcode15.2 我新创建了一个项目&…...

List、Set、Map有什么区别?

List、Set和Map是Java中的三种基本数据结构&#xff0c;它们在元素重复性、有序性和用途方面存在显著的区别。 元素重复性&#xff1a; List允许有重复的元素。任何数量的重复元素都可以在不影响现有重复元素的值及其索引的情况下插入到List集合中。 Set集合不允许元素重复。…...

centOS系统yum安装和卸载mongodb

0.1 什么是mongodb&#xff1f; 0.2 Mongodb是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 0.3 Mongodb是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据…...

2023年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分…...

Python爬虫---Scrapy项目的创建及运行

Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架。 可以应用在包括数据挖 掘&#xff0c;信息处理或存储历史数据等一系列的程序中。 1. 安装scrapy&#xff1a; pip install scrapy 注意&#xff1a;需要安装在python解释器相同的位置,例如&#xf…...

PyTorch: torch.nn 子模块及其在循环神经网络中的应用

目录 torch.nn子模块详解 nn.utils.rnn.PackedSequence 参数说明 注意事项 示例代码 nn.utils.rnn.pack_padded_sequence 参数说明 返回值 注意事项 示例代码 nn.utils.rnn.pad_packed_sequence 参数说明 返回值 注意事项 示例代码 nn.utils.rnn.pad_sequence …...

【QT】自定义代理类

目录 1 我们为什么要使用自定义代理类&#xff1f; 2 自定义代理类的基本设计要求 3 自定义代理的功能 4 基于QSpinBox的自定义代理类 5 自定义代理类的使用 1 我们为什么要使用自定义代理类&#xff1f; 传统的模型-视图框架可以让我们实现逻辑展示相分离&#xff0c;我们…...

线程休眠、线程让步、线程优先级相关内容学习笔记

1、线程休眠 &#xff08;1&#xff09;sleep() 如果需要让当前正在执行的线程暂停一段时间&#xff0c;并进入阻塞状态&#xff08;Timed_Waiting)&#xff0c;则可以通过调用Thread类的静态sleep()方法来实现。 static void sleep(long millis)&#xff1a;让当前正在执行的线…...

paddle指定运行gpu

在PaddlePaddle中指定使用GPU进行运行非常简单。首先&#xff0c;确保你的机器上已经安装了CUDA和cuDNN&#xff0c;并且正确配置了GPU环境。然后&#xff0c;按照以下步骤进行操作&#xff1a; 导入PaddlePaddle库&#xff1a; import paddle设置使用的设备为GPU&#xff1a…...

Java异常及网络编程

异常续 throws关键字 当一个方法中使用throw抛出一个非RuntimeException的异常时&#xff0c;就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常&#xff0c;否则编译不通过。 package exception; ​ /*** 测试异常的抛出*/ public clas…...

通过 Elastic Stack 充分利用电信领域生成式 AI 的力量

作者&#xff1a;Elastic Piotr Kobziakowski, Jrgen Obermann 在瞬息万变的电信领域&#xff0c;Elastic Stack 与生成式 AI 的集成正在开创运营效率和创新的新时代。 这些技术不仅增强了网络运营&#xff0c;而且还彻底改变了各个部门的内部流程。 下面&#xff0c;我们将深入…...

Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战7&#xff08;优惠券秒杀细节解决超卖、一人一单问题&#xff09; &#x1f4d…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

react-pdf(pdfjs-dist)如何兼容老浏览器(chrome 49)

之前都是使用react-pdf来渲染pdf文件&#xff0c;这次有个需求是要兼容xp环境&#xff0c;xp上chrome最高支持到49&#xff0c;虽然说iframe或者embed都可以实现预览pdf&#xff0c;但为了后续的定制化需求&#xff0c;还是需要使用js库来渲染。 chrome 49测试环境 能用的测试…...