深度剖析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 字符串(String) 1.1.2 列表(List) 1.1.3 集合(Set) 1.1.4 散列(Hash) 1.1.5 有序集合(Sorted Set)…...
视频监控录像服务器(中心录像服务器)功能详细介绍
目 录 一、概述 (一)定义 (二)视频监控中心录像服务器 二、存储策略服务 (一)存储策略配置 1、 录入页面 2、 选择需要进行录像的视频 3、批量选择多个通道号 4、其他关键参数…...
SouthernBiotech抗荧光淬灭封片剂
荧光淬灭又称荧光熄灭或萃灭,是指导致特定物质的荧光强度和寿命减少的所有现象。引起荧光淬灭的物质称为荧光淬灭剂。SouthernBiotech专门开发的Fluoromount-G系列荧光封片剂是以甘油为基础,加入抗荧光淬灭剂,可明显降低荧光淬灭现象…...
[Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例
在群組中看到上述問題,研判應是一份隨月份變動的產品報價表單,空白欄可能表示該月份價格與上個月份一致。這個問題是需要取得最近一次單價和倒數第二次單價,常用且實務的excel案例值得紀錄。 最近一次單價: INDEX($B2:$G2,1,LARGE(IF(ISBLAN…...
TypeScript进阶(二)深入理解装饰器
✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言,它是JavaScript的超集,意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript,使其更适合大型项目和团队开发。 在TypeS…...
书生·浦语第三次作业
我最近在参加书生浦语大模型实战营,这是第三次作业打卡! 如果你也想两周玩转大模型微调,部署与测评全链路。报名链接:invite 书生浦语大模型实战营报名 邀请码可以填026014 一、基础作业:复现课程知识库助手搭建过程…...
GPT实战系列-LangChain + ChatGLM3构建天气查询助手
GPT实战系列-LangChain ChatGLM3构建天气查询助手 用ChatGLM的工具可以实现很多查询接口和执行命令,而LangChain是很热的大模型应用框架。如何联合它们实现大模型查询助手功能?例如调用工具实现网络天气查询助手功能。 LLM大模型相关文章: …...
LeetCode 2696.删除子串后的字符串最小长度:栈
【LetMeFly】2696.删除子串后的字符串最小长度:栈 力扣题目链接:https://leetcode.cn/problems/minimum-string-length-after-removing-substrings/ 给你一个仅由 大写 英文字符组成的字符串 s 。 你可以对此字符串执行一些操作,在每一步操…...
Xcode15 升级问题记录
这里写自定义目录标题 新版本Xcode15升级问题1:rsync error: some files could not be transferred (code 23) at ...参考 新版本Xcode15升级 下载地址:https://developer.apple.com/download/all/ 我目前使用的版本是Xcode15.2 我新创建了一个项目&…...
List、Set、Map有什么区别?
List、Set和Map是Java中的三种基本数据结构,它们在元素重复性、有序性和用途方面存在显著的区别。 元素重复性: List允许有重复的元素。任何数量的重复元素都可以在不影响现有重复元素的值及其索引的情况下插入到List集合中。 Set集合不允许元素重复。…...
centOS系统yum安装和卸载mongodb
0.1 什么是mongodb? 0.2 Mongodb是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 0.3 Mongodb是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据…...
2023年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C++编程(1~8级)全部真题・点这里 第1题:数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分…...
Python爬虫---Scrapy项目的创建及运行
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖 掘,信息处理或存储历史数据等一系列的程序中。 1. 安装scrapy: pip install scrapy 注意:需要安装在python解释器相同的位置,例如…...
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 我们为什么要使用自定义代理类? 2 自定义代理类的基本设计要求 3 自定义代理的功能 4 基于QSpinBox的自定义代理类 5 自定义代理类的使用 1 我们为什么要使用自定义代理类? 传统的模型-视图框架可以让我们实现逻辑展示相分离,我们…...
线程休眠、线程让步、线程优先级相关内容学习笔记
1、线程休眠 (1)sleep() 如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态(Timed_Waiting),则可以通过调用Thread类的静态sleep()方法来实现。 static void sleep(long millis):让当前正在执行的线…...
paddle指定运行gpu
在PaddlePaddle中指定使用GPU进行运行非常简单。首先,确保你的机器上已经安装了CUDA和cuDNN,并且正确配置了GPU环境。然后,按照以下步骤进行操作: 导入PaddlePaddle库: import paddle设置使用的设备为GPU:…...
Java异常及网络编程
异常续 throws关键字 当一个方法中使用throw抛出一个非RuntimeException的异常时,就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常,否则编译不通过。 package exception; /*** 测试异常的抛出*/ public clas…...
通过 Elastic Stack 充分利用电信领域生成式 AI 的力量
作者:Elastic Piotr Kobziakowski, Jrgen Obermann 在瞬息万变的电信领域,Elastic Stack 与生成式 AI 的集成正在开创运营效率和创新的新时代。 这些技术不仅增强了网络运营,而且还彻底改变了各个部门的内部流程。 下面,我们将深入…...
Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)
👨🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:Redis:原理速成项目实战——Redis实战7(优惠券秒杀细节解决超卖、一人一单问题) Ὅ…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
