【中间件】Redis
一、什么是Redis
- Redis是一个开源(BSD许可),
内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。 - 它支持
字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。 - 内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
二、Redis优势
-
高性能:Redis以
内存作为数据存储介质,因此读写速度非常快。它使用单线程模型,避免了多线程带来的上下文切换开销,进一步提高了性能。 -
数据结构丰富:Redis支持多种数据结构,如
字符串、列表、哈希、集合、有序集合等,这使得开发人员可以更方便地存储和操作数据。 -
持久化支持:Redis可以将数据持久化到磁盘,以便在重启后恢复数据。它提供了两种持久化方式:
RDB(Redis Database)和AOF(Append Only File),开发人员可以根据需求选择适合的方式。 -
高可用性:Redis支持主从复制、哨兵和集群等机制,以实现
高可用性和数据的容错性。主从复制可以实现数据的读写分离,提高系统的并发处理能力;哨兵可以监控主节点的状态,并在主节点宕机时自动切换为新的主节点;集群则可以将数据分布在多个节点上,提供更高的吞吐量和可扩展性。 -
支持事务和Lua脚本:Redis支持事务,可以将多个命令打包成一个事务进行
原子性的执行。此外,它还支持通过Lua脚本执行复杂的操作,进一步提高了开发的灵活性。 -
缓存功能:作为一种常见的
缓存方案,Redis可以将热门数据存储在内存中,加快读写速度,并减轻后端数据库的压力。 -
分布式锁支持:Redis可以使用其原子性操作的特性实现
分布式锁,解决并发场景下的资源竞争问题。 -
丰富特性:支持 publish/subscribe, 通知, key 过期等等特性。
三、Redis的5种基本数据类型
- String(字符串):最基本的数据类型,可以存储任意类型的数据,例如整数、浮点数、JSON字符串等。
- 缓存数据:将经常访问的数据存储在Redis的String类型中,加速读取速度。
- 计数器:使用INCR命令可以实现自增或自减操作,可以用于记录网站的访问量或用户的积分。
# 设置键为"key1"的值为"hello"
SET key1 "hello"
# 获取键为"key1"的值
GET key1
- Hash(哈希):类似于字典或关联数组,用于存储键值对的集合。可以对某个键的单个字段进行操作,也可以对整个哈希对象进行操作。
- 用户信息存储:将用户的基本信息存储在一个Hash类型的键中,每个字段存储一个属性,方便查询和修改。
- 商品信息存储:将商品的各个属性(名称、价格、库存等)存储在一个Hash类型的键中,方便获取商品详情。
# 设置键为"user"的哈希对象的字段和值
HSET user name "John"
HSET user age 25
# 获取键为"user"的哈希对象的字段值
HGET user name
HGET user age
- List(列表):有序的字符串列表,可以在列表的两端进行插入和删除操作。常用于实现队列、栈等数据结构。
- 消息队列:将需要处理的任务或消息作为列表中的元素,通过LPUSH和RPOP等操作进行任务的发布和消费。
- 历史记录:将用户的操作记录存储在列表中,可以通过向列表头部或尾部插入元素来记录最新的操作。
# 在列表的头部插入值
LPUSH fruits "apple"
LPUSH fruits "banana"# 获取列表中的所有值
LRANGE fruits 0 -1
- Set(集合):无序的字符串集合,不允许重复的元素。可以进行交集、并集、差集等集合操作。
- 好友列表:将用户的好友关系存储在一个集合中,通过SADD和SREM等操作来添加或删除好友。
- 唯一值存储:可以用集合存储唯一的标签、用户标识等,通过SADD命令来保证元素的唯一性。
# 添加元素到集合
SADD colors "red"
SADD colors "blue"# 获取集合中的所有元素
SMEMBERS colors
- Sorted Set(有序集合):类似于Set,但每个成员都关联着一个分数,用于进行排序。可以根据分数进行范围查询和按分数排序。
- 排行榜:将用户的分数作为有序集合的分数,用户的ID作为成员,通过ZADD和ZREVRANGE命令来实现排名查询。
- 任务调度:将需要按照优先级执行的任务存储在有序集合中,通过ZADD和ZRANGE命令来按优先级获取任务。
# 添加带有分数的元素到有序集合
ZADD scores 90 "Alice"
ZADD scores 85 "Bob"# 获取有序集合中分数最高的元素
ZREVRANGE scores 0 0
这些数据类型除了支持基本的操作(如读取、写入、删除),还提供了一系列丰富的操作方法,例如对字符串进行自增、对列表进行范围查询、对集合进行交集运算等。
除了这些基本数据类型,Redis还提供了其他高级数据结构,如位图(Bitmap)、布隆过滤器(Bloom Filter)、HyperLogLog等,用于解决特定的问题和优化性能。
四、Redis的持久化机制
数据在重启或异常情况下的可恢复性:RDB(Redis Database)和AOF(Append Only File)。
- RDB持久化:
- RDB持久化通过将Redis内存中的数据快照(Snapshot)写入磁盘来进行持久化。RDB文件是一个二进制文件,包含了当前数据库的数据状态。
- RDB持久化可以手动或自动触发,手动触发可以使用SAVE或BGSAVE命令,自动触发可以通过配置设置定期保存快照的时间。
- RDB持久化的优点是快速、紧凑和经济,适合用于备份数据、离线分析等。
- RDB持久化的缺点是在发生故障时会丢失最后一次快照之后的数据。
- AOF持久化:
- AOF持久化通过将Redis的写命令追加到AOF文件的末尾来进行持久化。AOF文件是一个文本文件,记录了对Redis服务器进行写操作的命令。
- AOF持久化可以以三种方式进行:关闭(关闭持久化),每秒同步(每秒同步一次AOF文件),文件追加(每条写命令追加到AOF文件)。
- AOF持久化的优点是在故障恢复时有更好的数据完整性,可以通过AOF文件重放恢复所有写操作。
- AOF持久化的缺点是相对于RDB持久化,AOF文件会更大,恢复时间更长。
可以根据业务需求选择合适的持久化机制,也可以同时使用两种机制来提供更好的数据保护。
AOF和RDB一起使用的好处:
- AOF:每个写操作都以追加方式记录,可以实现
较高的写性能,保证较高的数据安全性。 - RDB:保存数据的快照,
恢复速度更快,适用于定期备份和灾难恢复
注:两种方式全部开启的话,Redis重启时会默认使用AOF的方式重新构建数据
AOF和RDB的优势对比:
*表示相对有优势的点
| 优势 | AOF | RDB |
|---|---|---|
| 数据安全性 | *增量持久化,每个写操作以追加方式记录,保证数据安全性 | 快照备份,保存整个数据集,确保数据的完整性 |
| 写入性能 | 相对较慢,因为需要将每个操作追加到AOF文件中 | *相对较快,因为只需要在特定间隔生成一次RDB文件 |
| 恢复速度 | 相对较慢,需要执行AOF日志文件中的所有写操作恢复数据 | *相对较快,只需要加载RDB文件即可恢复数据 |
| 文件大小 | AOF文件通常会比RDB文件更大,因为记录每个写操作 | *RDB文件通常比AOF文件更小,因为只保存数据的快照 |
| 适用场景 | *适用于数据安全性要求较高的场景,如金融、电商等 | *适用于对性能和存储空间要求较高的场景,如游戏、社交媒体等 |
| 容灾备份 | *提供增量备份,记录数据修改操作,确保数据的完整性 | *提供快照备份,方便定期备份和灾难恢复 |
| 恢复点选择 | *可以选择恢复到任意的AOF文件位置,灵活度更高 | 只能恢复到最近生成的RDB文件,不如AOF灵活 |
| 内存效率 | 略低,因为需要记录每个写操作到AOF文件中 | *较高,因为RDB文件保存了数据的快照,不需要记录每个操作 |
| 使用复杂度 | 相对较高,需要更多的配置和监控,如AOF重写,文件合并等 | *相对较低,只需定期生成RDB文件 |
五、Redis具体业务场景的使用示例
-
缓存:Redis最常见的使用场景是作为缓存层,将频繁读取的数据存储在Redis中,以减轻数据库的压力。
例如,将热门商品、用户登录信息、验证码等缓存到Redis中,可以大幅提高访问速度和系统的扩展性。 -
会话管理:Redis可用于存储用户会话数据
例如用户登录状态、购物车信息等。通过将会话数据存储在Redis中,可以实现分布式系统下多台服务器之间实时共享用户的登录状态和购物车数据。 -
分布式锁:Redis提供了原子性操作和高性能的特点,非常适合实现分布式锁。
在分布式系统中,可以使用Redis的 SETNX 命令来实现分布式锁,以保证在多个进程或服务器之间互斥地访问共享资源。 -
计数器、排行榜:Redis的原子性操作和高性能特点使其成为实现计数器和排行榜的理想选择。
例如,可以使用Redis的 INCRBY 命令来实现实时计数器,记录网站的访问量或用户的点赞数;使用有序集合来存储用户的积分信息,并根据积分进行排行。 -
消息队列:Redis的发布/订阅功能可以用于实现简单的消息队列。
消息发布者将消息发布到指定的频道,而订阅者可以订阅感兴趣的频道并接收消息,从而实现简单的消息通信和任务分发。 -
实时更新:Redis的高性能和持久化功能使其非常适合处理实时更新的场景
例如实时聊天、实时数据分析等。通过将实时数据存储在Redis中,并使用Redis的发布/订阅功能或数据持久化功能,可以实现实时更新和处理实时数据。
分布式锁,分布式缓存,lau脚本,数据类型详解等待后续补充
相关文章:
【中间件】Redis
一、什么是Redis Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置…...
RTSP播放器EasyPlayer.js播放器分辨率高的视频在设置container的宽高较小时,会出现锯齿状的画面效果
流媒体播放器的核心技术及发展趋势展现了其在未来数字生活中的无限潜力。随着技术的不断进步和市场的持续发展,流媒体播放器将在内容创新、用户体验优化以及跨平台互通等方面取得新的突破。对于从业者而言,把握这些趋势并积极应对挑战将是实现成功的关键…...
Java爬虫:获取商品详情的实践之旅
在当今这个信息爆炸的时代,数据的价值日益凸显。对于电商行业来说,商品详情的获取尤为重要,它不仅关系到产品的销售,还直接影响到用户体验。传统的人工获取方式耗时耗力,而自动化的爬虫技术则提供了一种高效解决方案。…...
行业分析---2024年小鹏汽车AI Day及三季度财报
1 背景 在之前的博客中,笔者撰写了多篇行业类分析的文章(科技新能源): 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…...
写时复制,读时加载
实现写时复制,读时加载,原理为,申请内存时,只给一段线性地址空间,并不分配物理内存,当cpu读、写该内存时,发生缺页中,或者写错误,中断处理程序根据前面设置的内容&#x…...
Python和R基因组及蛋白质组学和代谢组学
🌵Python片段 1. 数据处理与清理 基因组病理学的数据通常非常庞大,且可能包括 DNA 或 RNA 测序结果、基因表达数据等。Python 提供了高效的数据处理工具。 工具和库 Pandas: 用于加载、清理和操作数据。Numpy: 用于高效的数值计算。Dask: 用于大规模数…...
selenium环境搭建详细过程
一、准备工作 在开始搭建 Selenium 环境之前,确保具备以下条件: 1.稳定的网络连接: 以便能够下载所需的软件和驱动程序。 2.操作系统基础: 对您的操作系统(如 Windows、Mac 或 Linux)有基本的了解和操…...
Linux知识 - VIM
VI于VIM linux系统里边内置了一个编辑器就叫做vi(visual editor),但vi的功能非常有限,所以一般Linux的使用人员会选择一个比vi更强大的编辑器vim Vim的三种工作模式 输入模式 在正常模式中按下别字母键,会进入插入模式…...
【数据结构】链表重难点突破
目录 一、链表的概念 二、链表的实现 2.1 链表的构建 2.2 从链表头部添加元素 2.3 从链表尾部添加元素 2.4 链表任意位置添加元素 2.5 常规方法实现 2.6 获取指定位置的元素 2.7 获取指定元素的位置 2.8 修改链表中某一节点 2.9 删除链表的头结点 2.10 删除链表的尾…...
大宗商品行业区块链应用
应用场景 区块链技术具有透明性、去中心化、不可篡改等特点,因此可以在大宗商品定价方面得到应用。通过区块链技术,相关交易的各方可以在无需依赖中心化第三方的情况下,实时、准确地获取定价信息。这种技术的应用能够提高效率、降低成本、提…...
Varjo:垂直起降机混合现实培训解决方案
混合电动垂直起降机(VTOL)作为一种新型的航空运输机具有超越传统汽车的安全性、与飞机相当的速度以及无与伦比的灵活起降功能。电动垂直起降机能够在建筑顶部、直升机场或是没有跑道的地区起飞或降落,且排放要远远低于由航空汽油驱动的传统飞…...
sqlite-vec一个SQLite3高效向量搜索扩展--JDBC环境使用
最近要用SQLite3,之前放出来了SQLiteUtile工具,方便操作。今天发现AIGC方面,RAG知识库需要使用向量数据库,来存储知识信息。一般呢都是用mysql,但无奈的是mysql就是不让用。突然又发现SQLite3有向量库扩展组件…...
10 基于深度学习的目标检测
首次完成时间:2024 年 11月 20 日 1. 使用OpenCV的dnn模块实现图像分类。 1)程序代码: import numpy as np import cv2# 解析标签文件 row open("model1/synset_words.txt").read().strip().split("\n") class_label …...
leetcode top100中的30道递归和贪心
21到30题,递归和贪心...
非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 2
七、创建前端项目 你下载了nodejs吗?从cn官网下载:http://nodejs.cn/download/,或者从一个国外org网站下载,选择自己想要的版本https://nodejs.org/download/release/,双击下载好的安装文件,选择安装路径安…...
shell脚本(完)—脚本互调重定向的学习
免责声明 学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 脚本互调 在Shell脚本中&a…...
ant-design-vue中table某一列进行合并
ant-design-vue中table某一列进行合并 1、在colums中配置自定义渲染 {title: 区域,dataIndex: cityName,key: cityName,align: center,width: 120,customCell: (record, rowIndex, column) > {return {rowSpan: record.rowSpan}} },2、处理请求来的数据 tableData.dataSo…...
基于Springboot+Vue社区养老服务管理系统(源码+lw+讲解部署+PPT)
前言 详细视频演示 论文参考 系统介绍 系统概述 核心功能 用户角色与功能 具体实现截图 1. 服务信息查看功能 主要代码实现 截图: 2. 服务申请功能 主要代码实现 截图: 3. 公告信息查看功能 主要代码实现 截图: 4. 服务信息…...
大数据调度组件之Apache DolphinScheduler
Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 主要特性 易于部署,提供四种部署方式,包括Standalone、Cluster、Docker和…...
介绍一下strlwr(arr);(c基础)
hi , I am 36 适合对象c语言初学者 strlwr(arr);函数是把arr数组变为小写字母 格式 #include<string.h> strlwr(arr); 返回值为arr 链接分享一下arr的意义(c基础)(必看)(牢记)-CSDN博客 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl…...
开发者在进行多轮对话应用测试时如何利用Taotoken快速切换模型对比
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 开发者在进行多轮对话应用测试时如何利用Taotoken快速切换模型对比 在开发基于大语言模型的多轮对话应用时,评估不同模…...
DeepSeek企业版访问控制配置白皮书(内部泄露版·含审计日志埋点规范与SOC2合规映射表)
更多请点击: https://codechina.net 第一章:DeepSeek企业版访问控制配置概述 DeepSeek企业版提供细粒度、可审计、可扩展的访问控制能力,支持基于角色(RBAC)、属性(ABAC)及策略即代码ÿ…...
DeepSeek推理内存暴涨400%的元凶找到了:详解PagedAttention在DeepSeek-VL中的适配陷阱与绕过方案
更多请点击: https://codechina.net 第一章:DeepSeek推理内存暴涨400%的现象复现与根因定位 在部署 DeepSeek-R1-7B 模型进行批量文本生成时,我们观测到 GPU 显存占用从预期的约 8.2 GB 飙升至 41.3 GB,增幅达 400%,显…...
告别VNC客户端!用noVNC在浏览器里远程操控CentOS桌面,附Xshell/Xftp联动技巧
浏览器原生远程桌面方案:noVNC与终端工具链的高效整合指南每次连接远程服务器都要切换多个客户端的日子该结束了。想象一下这样的场景:清晨的咖啡馆里,你只需打开浏览器就能直接访问CentOS的图形界面,同时在一个标签页里用Xshell执…...
5步实现Realtek RTL8125网卡在VMware ESXi 6.7上的完整驱动适配解决方案
5步实现Realtek RTL8125网卡在VMware ESXi 6.7上的完整驱动适配解决方案 【免费下载链接】r8125-esxi Realtek RTL8125 driver for ESXi 6.7 项目地址: https://gitcode.com/gh_mirrors/r8/r8125-esxi 在虚拟化环境中,Realtek RTL8125 2.5G网卡驱动适配是许多…...
magic - trace:高分辨率追踪利器,解决应用难题,还能深入洞悉程序运行!
magic - trace 概述magic - trace 能够收集并展示进程活动的高分辨率追踪信息,可用于解决生产环境中应用程序处理请求速度慢、了解代码实际运行情况、获取应用崩溃前活动历史等问题。它性能开销在 2% - 10% 之间,使用时无需修改应用程序,能以…...
四款免费抓包工具实战选型指南:HTTPS解密与跨平台调试
1. 抓包这件事,为什么90%的人从一开始就搞错了方向 “免费抓包工具有哪些?”——这是我在技术群、论坛和私信里被问得最多的问题之一。但每次看到这个问题,我都会先反问一句:“你到底想抓什么包?” 不是所有抓包场景…...
交叉验证方差分析:从数学原理到工程实践
1. 交叉验证:从直觉到数学的模型评估基石在机器学习的日常工作中,我们训练模型、调整参数,最终目标都是希望模型在真实世界中、在从未见过的数据上,依然能稳定可靠地工作。但一个棘手的问题始终存在:我们如何知道一个模…...
如何彻底解决QQ音乐加密格式的播放限制?
如何彻底解决QQ音乐加密格式的播放限制? 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为下载的QQ音乐文件无法在其他设备上播放而烦恼吗?你是…...
FuSa RTX RTOS多核支持与AMP架构解析
1. FuSa RTX RTOS多核支持解析 在嵌入式安全关键系统开发领域,多核处理器架构已成为提升性能的主流选择。作为Arm FuSa RTS(功能安全运行时系统)的核心组件,FuSa RTX RTOS的多核支持能力自然成为开发者关注的焦点。本文将深入剖析…...
