【中间件】Redis

一、什么是Redis

  • Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理
  • 它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型
  • 内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

二、Redis优势

  1. 高性能:Redis以内存作为数据存储介质,因此读写速度非常快。它使用单线程模型,避免了多线程带来的上下文切换开销,进一步提高了性能。

  2. 数据结构丰富:Redis支持多种数据结构,如字符串、列表、哈希、集合、有序集合等,这使得开发人员可以更方便地存储和操作数据。

  3. 持久化支持:Redis可以将数据持久化到磁盘,以便在重启后恢复数据。它提供了两种持久化方式:RDB(Redis Database)和AOF(Append Only File),开发人员可以根据需求选择适合的方式。

  4. 高可用性:Redis支持主从复制、哨兵和集群等机制,以实现高可用性和数据的容错性。主从复制可以实现数据的读写分离,提高系统的并发处理能力;哨兵可以监控主节点的状态,并在主节点宕机时自动切换为新的主节点;集群则可以将数据分布在多个节点上,提供更高的吞吐量和可扩展性。

  5. 支持事务和Lua脚本:Redis支持事务,可以将多个命令打包成一个事务进行原子性的执行。此外,它还支持通过Lua脚本执行复杂的操作,进一步提高了开发的灵活性。

  6. 缓存功能:作为一种常见的缓存方案,Redis可以将热门数据存储在内存中,加快读写速度,并减轻后端数据库的压力。

  7. 分布式锁支持:Redis可以使用其原子性操作的特性实现分布式锁,解决并发场景下的资源竞争问题。

  8. 丰富特性:支持 publish/subscribe, 通知, key 过期等等特性。

三、Redis的5种基本数据类型

  1. String(字符串):最基本的数据类型,可以存储任意类型的数据,例如整数、浮点数、JSON字符串等。
    • 缓存数据:将经常访问的数据存储在Redis的String类型中,加速读取速度。
    • 计数器:使用INCR命令可以实现自增或自减操作,可以用于记录网站的访问量或用户的积分。

# 设置键为"key1"的值为"hello"
SET key1 "hello"
# 获取键为"key1"的值
GET key1
  1. Hash(哈希):类似于字典或关联数组,用于存储键值对的集合。可以对某个键的单个字段进行操作,也可以对整个哈希对象进行操作。
    • 用户信息存储:将用户的基本信息存储在一个Hash类型的键中,每个字段存储一个属性,方便查询和修改。
    • 商品信息存储:将商品的各个属性(名称、价格、库存等)存储在一个Hash类型的键中,方便获取商品详情。
# 设置键为"user"的哈希对象的字段和值
HSET user name "John"
HSET user age 25
# 获取键为"user"的哈希对象的字段值
HGET user name
HGET user age

  1. List(列表):有序的字符串列表,可以在列表的两端进行插入和删除操作。常用于实现队列、栈等数据结构。
    • 消息队列:将需要处理的任务或消息作为列表中的元素,通过LPUSH和RPOP等操作进行任务的发布和消费。
    • 历史记录:将用户的操作记录存储在列表中,可以通过向列表头部或尾部插入元素来记录最新的操作。
# 在列表的头部插入值
LPUSH fruits "apple"
LPUSH fruits "banana"

# 获取列表中的所有值
LRANGE fruits 0 -1
 
  1. Set(集合):无序的字符串集合,不允许重复的元素。可以进行交集、并集、差集等集合操作。
    • 好友列表:将用户的好友关系存储在一个集合中,通过SADD和SREM等操作来添加或删除好友。
    • 唯一值存储:可以用集合存储唯一的标签、用户标识等,通过SADD命令来保证元素的唯一性。
# 添加元素到集合
SADD colors "red"
SADD colors "blue"

# 获取集合中的所有元素
SMEMBERS colors
 
  1. 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)。

  1. RDB持久化:
    • RDB持久化通过将Redis内存中的数据快照(Snapshot)写入磁盘来进行持久化。RDB文件是一个二进制文件,包含了当前数据库的数据状态。
    • RDB持久化可以手动或自动触发,手动触发可以使用SAVE或BGSAVE命令,自动触发可以通过配置设置定期保存快照的时间。
    • RDB持久化的优点是快速、紧凑和经济,适合用于备份数据、离线分析等。
    • RDB持久化的缺点是在发生故障时会丢失最后一次快照之后的数据。
  2. AOF持久化:
    • AOF持久化通过将Redis的写命令追加到AOF文件的末尾来进行持久化。AOF文件是一个文本文件,记录了对Redis服务器进行写操作的命令。
    • AOF持久化可以以三种方式进行:关闭(关闭持久化),每秒同步(每秒同步一次AOF文件),文件追加(每条写命令追加到AOF文件)。
    • AOF持久化的优点是在故障恢复时有更好的数据完整性,可以通过AOF文件重放恢复所有写操作。
    • AOF持久化的缺点是相对于RDB持久化,AOF文件会更大,恢复时间更长。

可以根据业务需求选择合适的持久化机制,也可以同时使用两种机制来提供更好的数据保护。

AOF和RDB一起使用的好处:

  • AOF:每个写操作都以追加方式记录,可以实现较高的写性能 ,保证较高的数据安全性
  • RDB:保存数据的快照,恢复速度更快,适用于定期备份和灾难恢复

注:两种方式全部开启的话,Redis重启时会默认使用AOF的方式重新构建数据

AOF和RDB的优势对比:

*表示相对有优势的点

优势AOFRDB
数据安全性*增量持久化,每个写操作以追加方式记录,保证数据安全性快照备份,保存整个数据集,确保数据的完整性
写入性能相对较慢,因为需要将每个操作追加到AOF文件中*相对较快,因为只需要在特定间隔生成一次RDB文件
恢复速度相对较慢,需要执行AOF日志文件中的所有写操作恢复数据*相对较快,只需要加载RDB文件即可恢复数据
文件大小AOF文件通常会比RDB文件更大,因为记录每个写操作*RDB文件通常比AOF文件更小,因为只保存数据的快照
适用场景*适用于数据安全性要求较高的场景,如金融、电商等*适用于对性能和存储空间要求较高的场景,如游戏、社交媒体等
容灾备份*提供增量备份,记录数据修改操作,确保数据的完整性*提供快照备份,方便定期备份和灾难恢复
恢复点选择*可以选择恢复到任意的AOF文件位置,灵活度更高只能恢复到最近生成的RDB文件,不如AOF灵活
内存效率略低,因为需要记录每个写操作到AOF文件中*较高,因为RDB文件保存了数据的快照,不需要记录每个操作
使用复杂度相对较高,需要更多的配置和监控,如AOF重写,文件合并等*相对较低,只需定期生成RDB文件

五、Redis具体业务场景的使用示例

  1. 缓存:Redis最常见的使用场景是作为缓存层,将频繁读取的数据存储在Redis中,以减轻数据库的压力。
    例如,将热门商品、用户登录信息、验证码等缓存到Redis中,可以大幅提高访问速度和系统的扩展性。

  2. 会话管理:Redis可用于存储用户会话数据
    例如用户登录状态、购物车信息等。通过将会话数据存储在Redis中,可以实现分布式系统下多台服务器之间实时共享用户的登录状态和购物车数据。

  3. 分布式锁:Redis提供了原子性操作和高性能的特点,非常适合实现分布式锁。
    在分布式系统中,可以使用Redis的 SETNX 命令来实现分布式锁,以保证在多个进程或服务器之间互斥地访问共享资源。

  4. 计数器、排行榜:Redis的原子性操作和高性能特点使其成为实现计数器和排行榜的理想选择。
    例如,可以使用Redis的 INCRBY 命令来实现实时计数器,记录网站的访问量或用户的点赞数;使用有序集合来存储用户的积分信息,并根据积分进行排行。

  5. 消息队列:Redis的发布/订阅功能可以用于实现简单的消息队列。
    消息发布者将消息发布到指定的频道,而订阅者可以订阅感兴趣的频道并接收消息,从而实现简单的消息通信和任务分发。

  6. 实时更新:Redis的高性能和持久化功能使其非常适合处理实时更新的场景
    例如实时聊天、实时数据分析等。通过将实时数据存储在Redis中,并使用Redis的发布/订阅功能或数据持久化功能,可以实现实时更新和处理实时数据。

分布式锁,分布式缓存,lau脚本,数据类型详解等待后续补充

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新型大语言模型的预训练与后训练范式,苹果的AFM基础语言模型

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

网络知识1-TCP/IP模型

从用户端到服务端,tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责: 只关注与为用户提供应用功能,如HTTP、FTP、telnet、DNS、SMTP等 ,应用层的职责就像我们寄快递时将快递给快递员…

【计算机视觉】图像基本操作

1. 数字图像表示 一幅尺寸为MN的图像可以用矩阵表示,每个矩阵元素代表一个像素,元素的值代表这个位置图像的亮度;其中,彩色图像使用3维矩阵MN3表示;对于图像显示来说,一般使用无符号8位整数来表示图像亮度&…

爬虫与反爬-旋转验证码突破方案(知名短视频、TK海外版 及 某东等等)

概述:文本对旋转验证码进行了突破及讲述了实现原理,代码使用纯算法 OpenCV,使用代价较小同时不用安装一大堆AI训练相关的模组,方便且能够快速上手 当前亲自验证了能够支持的网站:国内知名短视频平台、海外版 以及 某东…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能,基于 ARM Corte…

达梦数据库文件故障的恢复方法

目录 1、概述 1.1 概述 1.2 环境介绍 2、使用备份集的恢复方法 2.1 实验准备 2.2 误删除“用户表空间数据文件” 2.3 误删除SYSTEM.DBF 2.4 误删除ROLL.DBF 2.5 REDO日志文件 3、无备份集的恢复方法 3.1 误删除“表空间数据文件” 3.2误删除控制文件 3.3 误删除RO…

JVM:即时编译器,C2 Compiler,堆外内存排查

1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…

rocylinux9.4安装prometheus监控

一.上传软件包 具体的软件包如下,其中kubernetes-mixin是下载的监控kubernetes的一些监控规则、dashbaordd等。 二.Prometheus配置 1.promethes软件安装 #解压上传后的软件包 [rootlocalhost ] cd /opt [rootlocalhost opt]# tar xf prometheus-2.35.3.linux-amd…

FreeRTOS之链表源码分析

文章目录 前言一、结构体1、链表List_t2、链表项xLIST_ITEM3、头节点xMINI_LIST_ITEM4、链表示意图 二、函数分析1、初始化函数vListInitialise2、初始化链表项vListInitialiseItem3、链表尾部添加节点vListInsertEnd4、按序插入节点vListInsert5、删除节点uxListRemove 总结 前…

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来; 2.运行环境Matlab2023b及以上,data为数据集,单变量时间序列预测; 3.递归预测未来数据,可以控制预…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了;首先就是一些基础概念:并发,并行,同步,异步,临界区,阻塞,非阻塞还有各种锁全都砸你脸上,随之而来的就是要保证程序运行时关键数据在多线程…

最新 Blender 4.2 保姆级安装教程(附安装包)

目录 Blender介绍: Blender下载: Blender改进功能: Blender介绍: Blender是一款开源的跨平台全能三维动画制作软件,提供从建模、渲染、动画、特效、合成到音频处理、视频剪辑等一系列动画短片制作解决方案。它支持…

web安全之信息收集

在信息收集中,最主要是就是收集服务器的配置信息和网站的敏感信息,其中包括域名及子域名信息,目标网站系统,CMS指纹,目标网站真实IP,开放端口等。换句话说,只要是与目标网站相关的信息,我们都应该去尽量搜集。 1.1收集域名信息 知道目标的域名之后,获取域名的注册信…

网络原理(一)—— http

什么是 http http 是一个应用层协议,全称为“超文本传输协议”。 http 自 1991 年诞生,目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的,例如 http1.0,http1.0,http2.0 http3 是…

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…

典型组合逻辑电路设计

目录 行为级描述方式基本运算电路 一、半加器(Half Adder) 二、全加器(Full Adder) 1、逻辑门构成加法器 2、集成全加器 3、串行加法器 4、超前进位加法器 三、全减器(Full Deductor) 数值比较电路 一、一位比较器 二、…

【论文阅读】三平面相关与变体

文章目录 1. 【CVPR2023】Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction动机可视化方法Pipeline 2. 【2023/08/31】PointOcc: Cylindrical Tri-Perspective View for Point-based 3D Semantic Occupancy Prediction动机(针对雷达点云、与…

修改bag的frame_id的工具srv_tools

在使用数据集导航或者建图时,bag中的点云或者其他话题的frame_id没有和需要的对应 1.创建工作空间 2.cd xxxx/src 3.git clone https://github.com/srv/srv_tools.git cd .. catkin_make source ./devel/setup.bash rosrun bag_tools change_frame_id.py -t /要改…

hue 4.11容器化部署,已结合Hive与Hadoop

配合《Hue 部署过程中的报错处理》食用更佳 官方配置说明页面: https://docs.gethue.com/administrator/configuration/connectors/ 官方配置hue.ini页面 https://github.com/cloudera/hue/blob/master/desktop/conf.dist/hue.ini docker部署 注意: …

如何用Excel做数据可视化自动化报表?

作为一个经常需要做数据报表的人,我最常用的工具是Excel,对于我来说用Excel处理繁琐冗杂的数据并不难,但是我发现身边很多人用Excel做的数据报表非常的耗时,而且最后的成品也是难以直视,逻辑和配色等都非常的“灾难”。…