深度剖析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(优惠券秒杀细节解决超卖、一人一单问题) Ὅ…...

江山易改本性难移之ZYNQ SDK QSPI固化bug及其解决方法
之前在Vivado2018.3通过QSPI方式固化程序时出现问题,显示flash擦除成功,但最后总是不能写入到flash中。 查资料发现从VIVADO 2017.3版本开始,Xilinx官方为了使Zynq-7000和Zynq UltraScale 实现流程相同,在QSPI FLASH使用上做了变化…...

系列三十六、注解版Spring、SpringMVC配置文件
一、注解版Spring、SpringMVC配置文件 1.1、pom <dependencies><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.5.RELEASE</version><…...

爬虫你需要知道的:什么是http请求
1. 什么是http请求 我们将通过发送http请求来获取网页内容。http是HyperText Transfer Protocol的缩写,意思是超文本传输协议,它是一种客户端和服务器之间的请求响应协议。 浏览器就可以看作是一个客户端,当我们在浏览器地址栏输入想访问的…...

MCU FT61F14x入门
目录 前言一、CMIDE的使用二、系统时钟与睡眠2.1 上电复位 (POR)与系统复位2.2 振荡器和系统时钟2.3 SLEEP睡眠模式 (POWER-DOWN)2.4 低电压检测/比较器 (LVD) 三、I/O端口与中断四、串口USART五、定时器六、ADC七、EEPROM 前言 FT61F14x是辉芒微电子的微控制器,是一…...

星火大模型——多模态API调用(图像+文本)
参考文档 图片理解 API 文档 环境配置 pip3 install websocket-client核心代码 import _thread as thread import base64 import datetime import hashlib import hmac import json from urllib.parse import urlparse import ssl from datetime import datetime from time…...

计算机基础面试题 |22.精选计算机基础面试题
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...

kafka连接失败时springboot项目启动停机问题
问题:springboot整合kafka,作为消费端,对端的kafka系统是在生产环境,在本地开发测试时配置了对端的生产环境的kafka地址。因为开发环境和对端生产环境是不通的,所以连接肯定是失败的,kafka的连接失败导致sp…...

【算法题】46. 全排列
题目 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2: 输入࿱…...

可视可交互!在全志H618上用OpenCV读取图像显示到PyQt5窗口上
OpenCV能够处理图像、视频、深度图像等各种类型的视觉数据,在某些情况下,尽管OpenCV可以显示窗口,但PyQt5可能更适合用于创建复杂的交互式应用程序,而自带GPU的H618就成为了这些图像显示的最佳载体。 这里分享一个代码࿰…...

现代密码学 补充1:两种窃听不可区分实验的区别
两种窃听不可区分实验 写在最前面两种窃听不可区分实验1. 完美保密中的窃听不可区分实验2. 窃听不可区分实验(对称加密算法)主要区别 写在最前面 两种窃听不可区分实验 两种窃听不可区分实验(Eavesdropping Indistinguishability Experimen…...