【中间件】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脚本,数据类型详解等待后续补充

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

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

相关文章

Python爬取豆瓣电影全部分类数据并存入数据库

在当今数字化的时代,网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天,我就来和大家分享一段有趣的代码,它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示(文末附完整代码): 目…

YOLOv11(Ultralytics)视频选定区域目标统计计数及跟踪

在计算机视觉的众多应用场景中,对特定区域的目标进行检测、跟踪与计数是一个常见且重要的需求。无论是在智慧交通中统计通过特定路口的车辆数量,还是在零售分析中追踪进入特定区域的顾客行为,这一功能都发挥着不可或缺的作用。 随着深度学习…

数据结构与算法——1120——时间空间效率问题求边界值

目录 1、效率问题 1、时间复杂度 1、O(1) 2、O(n) 3、O(n) 或O(n*log2n)——n倍的log以2为底n的对数 例题 4、O(n) 2、空间复杂度 3、数组和链表 2、面试题之求边界值 题目 解答 (1)-i (2)~i (3&#x…

第三十九篇 ShuffleNet V1、V2模型解析

摘要 ShuffleNet V1 ShuffleNet V1是由旷视科技(Megvii,又称Face)在2017年底提出的一种轻量级卷积神经网络架构。该网络专为移动设备和边缘计算环境设计,旨在以较低的计算资源实现高效的图像分类和其他计算机视觉任务。 特点与…

本地推流,服务器拉流全流程

本地推流,服务器拉流全流程 环境准备:准备一台服务器,其中openssl最好为1.1.1版本(可以直接使用ubuntu20.04操作系统) 服务器拉流 1、 安装环境依赖 sudo apt-get update sudo apt-get install unzip sudo apt-get…

基于Java Springboot海洋馆预约系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

产业用机器人中的旋转花键若损伤有何影响?

旋转花键在产业用机器人中是关键的组件之一,如果机器人中的旋转花键损坏,会对机器人的运行和性能产生一定影响。以下是可能的影响: 1、功能受限:旋转花键用于连接两个旋转部件(例如电机轴和传动轴)&#xf…

CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读

abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同,(Radford et al., 2021) 引入了一种新范式,该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中,通…

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻,今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”,百度文心智能体平台入选。 这个智能体平台我最近也有所关注,接下来我就来讲讲它。 百度在下一盘大棋…

RabbitMQ4:work模型

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

基于SpringBoot的数据结构系统设计与实现(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

100.【C语言】数据结构之二叉树的堆实现(顺序结构) 1

目录 1.顺序结构 2.示意图 ​编辑 从物理结构还原为逻辑结构的方法 3.父子节点编号的规律 4.顺序存储的前提条件 5.堆的简介 堆的定义 堆的两个重要性质 小根堆和大根堆 6.堆的插入 7.堆的实现及操作堆的函数 堆的结构体定义 堆初始化函数HeapInit 堆插入元素函…

支持多种快充协议和支持多种功能的诱骗取电协议芯片

汇铭达XSP15是一款应用于手持电动工具、智能家居、显示器、音箱等充电方案的大功率快充协议芯片,支持最大功率100W给设备快速充电,大大缩短了充电时间。芯片支持通过UART串口发送电压/电流消息供其它芯片读取。支持自动识别连接的是电脑或是充电器。支持…

Three.js 相机控制器Controls

在 3D 场景中,摄像机的控制尤为重要,因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器,最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

CMake笔记:install(TARGETS target,...)无法安装的Debug/lib下

1. 问题描述 按如下CMake代码,无法将lib文件安装到Debug/lib或Release/lib目录下,始终安装在CMAKE_INSTALL_PREFIX/lib下。 install(TARGETS targetCONFIGURATIONS DebugLIBRARY DESTINATION Debug/lib) install(TARGETS targetCONFIGURATIONS Release…

docker安装使用Elasticsearch,解决启动后无法访问9200问题

1.docker安装、启动es docker pull elasticsearch:8.13.0docker images启动容器 docker run -d -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS"-Xms256m -Xmx256m" --name es01 8ebd258614f1-d 后台运行-p 9200:9200 -p 9300:9300 开放与主机映射端口-e ES_JAVA_OPTS…

java-排序算法汇总

排序算法: 冒泡排序(Bubble Sort) 选择排序(Selection Sort) 插入排序(Insertion Sort) 快速排序(Quick Sort) 归并排序(Merge Sort) 堆排序&…

【笔记】自动驾驶预测与决策规划_Part7_数据驱动的预测方法

文章目录 0. 前言1. 多模态传感器的编码方式1.1 栅格化表示1.2 向量化表示 Vectornet1.3 基于点云或者多模态输入的预测1.4 基于Transformer的方法 2. 网络输出的表达形式2.1 多模态轨迹回归2.2 轨迹分类2.3 轨迹回归轨迹分类2.4 目标点预测 3.场景级别的预测和决策3.1 论文&am…

Tortoise ORM

官方文档:Tortoise ORM - Tortoise ORM v0.22.0 Documentation 简介 Tortoise ORM:异步,API和Django ORM 大多类似集成Pydantic;多用于asgi starlette / sanic / FastAPI...Sqlalchemy:支持异步,Flask / …

【大数据学习 | Spark-Core】关于distinct算子

只有shuffle类的算子能够修改分区数量,这些算子不仅仅存在自己的功能,比如分组算子groupBy,它的功能是分组但是却可以修改分区。 而这里我们要讲的distinct算子也是一个shuffle类的算子。即可以修改分区。 scala> val arr Array(1,1,2,…