深度剖析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。

朋友,不要忘了开心!

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

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

相关文章

常见类型的yaml文件如何编写?--kind: Job|CronJob

本次介绍两个关联度很高的类型&#xff0c;Job和CronJob。 Job基本说明 在 Kubernetes 中&#xff0c;Job 是一种用于运行一次性任务的资源对象。它用于确保在集群内部执行某个任务&#xff0c;即使任务运行失败或其中一个 Pod 发生故障时&#xff0c;也会进行重试。Job 可以…

CRM系统进行市场营销,这些功能可以派上用场。

现如今的企业想要做好营销&#xff0c;不仅仅依赖于一句玄之又玄的slogan亦或是电子邮件的狂轰乱炸。要想做好市场活动营销需要一个前提——那就是CRM管理系统发挥作用的地方。但CRM系统关于营销的功能太多了——对于不太了解的人来说很容易不知所措。那么&#xff0c;CRM系统做…

如何上传苹果ipa安装包?

目录 引言 摘要 第二步&#xff1a;打开appuploader工具 第二步&#xff1a;打开appuploader工具&#xff0c;第二步&#xff1a;打开appuploader工具 第五步&#xff1a;交付应用程序&#xff0c;在iTunes Connect中查看应用程序 总结 引言 在将应用程序上架到苹果应用…

PTA——换硬币

将一笔零钱换成5分、2分和1分的硬币&#xff0c;要求每种硬币至少有一枚&#xff0c;有几种不同的换法&#xff1f; 输入格式: 输入在一行中给出待换的零钱数额x∈(8,100)。 输出格式: 要求按5分、2分和1分硬币的数量依次从大到小的顺序&#xff0c;输出各种换法。每行输出…

四道面试题

一.网络的七层模型 网络的七层模型&#xff0c;也被称为OSI七层协议模型&#xff0c;是一种用于理解和描述网络通信过程的概念模型。这个模型将网络通信过程划分为七个层次&#xff0c;从低到高分别是&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层和应用层…

DUET: Cross-Modal Semantic Grounding for Contrastive Zero-Shot Learning论文阅读

文章目录 摘要1.问题的提出引出当前研究的不足与问题属性不平衡问题属性共现问题 解决方案 2.数据集和模型构建数据集传统的零样本学习范式v.s. DUET学习范式DUET 模型总览属性级别对比学习正负样本解释&#xff1a; 3.结果分析VIT-based vision transformer encoder.消融研究消…

【XR806开发板试用】+ FreeRtos开发环境搭建

获取SDK SDK可以通过官网直接下载。 下载完成之后&#xff0c;通过gzip命令解压文件 gzip -d xr806_sdk.tar.gz 获取编译链工具 还是按照官网操作指南&#xff0c;下载 gcc-arm-none-eabi-8-2019-q3-update 下载之后进行解压&#xff0c;同理。 注意修改GCC路径&#xff0c…

既然所有ERP系统都很烂,那创业公司有没有机会?

既然所有ERP系统都烂,那创业公司有没机会? 得一点点把这问题捋顺了再回答—— 先说说“都很烂”这个判断是否准确谈谈国产ERP和国际ERP厂商&#xff0c;新创公司是否有优势&#xff1f;最后聊一下创业本身&#xff0c;如何创业、风险如何…… 一些人可能对传统的ERP系统感到…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

MySQL进阶篇(三) 索引

一、插入数据 1. insert &#xff08;1&#xff09;优化方案一&#xff0c;批量插入数据 Insert into tb_test values(1,Tom),(2,Cat),(3,Jerry);&#xff08;2&#xff09;优化方案二&#xff0c;手动控制事务 start transaction; insert into tb_test values(1,Tom),(2,Cat…

JS栈和堆:数据是如何存储的

JS栈和堆&#xff1a;数据是如何存储的 背景JavaScript 是什么类型的语言JavaScript 的数据类型内存空间栈空间和堆空间再谈闭包 背景 JS有多种数据类型&#xff1a;数字型&#xff0c;字符串型&#xff0c;数组型等&#xff0c;虽然 JavaScript 并不需要直接去管理内存&#…

Apache ActiveMQ RCE CNVD-2023-69477 CVE-2023-46604

漏洞简介 Apache ActiveMQ官方发布新版本&#xff0c;修复了一个远程代码执行漏洞&#xff0c;攻击者可构造恶意请求通过Apache ActiveMQ的61616端口发送恶意数据导致远程代码执行&#xff0c;从而完全控制Apache ActiveMQ服务器。 影响版本 Apache ActiveMQ 5.18.0 before …

《系统架构设计师教程(第2版)》第4章-信息安全技术基础知识-01-信息安全基础知识

文章目录 1. 信息安全的概念1.1 信息安全的5个基本要是1.2 信息安全的范围1)设备安全2)数据安全3)内容安全4)行为安全1.3 信息安全的意义2. 信息存储安全2.1 信息使用的安全1)用户的标识与验证2)用户存取权限限制2.2 系统安全监控2.3 计算机病毒防治3. 网络安全3.1 网络安…

linux kernel:devres模块架构分析

参考文档&#xff1a; https://www.kernel.org/doc/html/latest/driver-api/driver-model/devres.html https://www.cnblogs.com/sammei/p/3498052.html devres in linux driver devres: Managed Device Resource device resource managementdevres_alloc()动态申请内存分配…

好包不等待:用 pnpm 加速你的项目依赖

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 好包不等待&#xff1a;用 pnpm 加速你的项目依赖 前言什么是pnpm背景和诞生原因&#xff1a;与传统 npm 安装方式的区别&#xff1a; 基础用法安装依赖&#xff1a;卸载依赖&#xff1a;安装全局依赖…

2024百元蓝牙耳机测评推荐,百元超强的开放式蓝牙耳机合集

现在的蓝牙耳机市场真的是太卷了&#xff0c;各种品牌、各种型号让人挑得眼花缭乱&#xff0c;但你知道吗&#xff1f;其实在百元价位里也有很多好货。今天&#xff0c;我就来给大家好好测评几款2024年的百元级蓝牙耳机&#xff0c;看看哪些是真正的性价比之王&#xff0c;开放…

基于JAVA的康复中心管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

小微企业适用什么样的CRM系统?CRM选型有哪些技巧?

小型企业主的日子着实不好过&#xff0c;从营销和销售到客户支持和保留&#xff0c;这些基本都要亲力亲为&#xff0c;才能确保将客户放在首位。如果您要是一个小企业主&#xff0c;那么相信您能懂这个感觉&#xff0c;恨不得自己长出八只手&#xff0c;才能让一切井井有条——…

Wordpress网站开发问题解决——除了主页之外的所有页面都是“找不到页面内容”(修复记录)

一条纯经验操作 引言慌火上浇油后台查看 解决之路结尾 引言 最近 阿里云老是提醒我边缘计算机控制升级 我自己建立了一个网站&#xff0c;用的就是阿里云的万网服务器 所以 我去看看 结果跟我没什么关系 本以为就这么愉快地结束了 没想到 我建立的网站就只能打开主页 其他页…

羊奶加红枣,女性必备的加法!

羊奶加红枣&#xff0c;女性必备的加法&#xff01; 在当今社会&#xff0c;女性健康备受关注。而羊奶和红枣作为常见的食材&#xff0c;以其独特的营养价值备受追捧。不少人认为&#xff0c;羊奶里面加红枣对女生有很大的帮助。那么&#xff0c;到底羊奶加红枣对女性健康有哪…