Redis 简介与应用场景

1. 简介

Redis是一个开源的内存数据结构存储系统。官网地址:redis官网
内存数据结构存储系统:是一种将数据存储在计算机内存中,并且以特定的数据结构组织化管理的软件系统

得益于其数据存储在内存上的特点,避免了数据读写时访问硬盘的io开销,能够以极快的速度进行读写操作,十分适用于需要高并发、低延迟访问数据的引用场景


2. Redis特点

2.1 高性能

  • 内存存储 高效读写
  • 单线程模式 采用单线程处理请求,请求不会应为I/O而阻塞,可以同时处理多个客户端的链接和请求
  • 高效的数据结构 支持多种数据结构,例如:字符串、哈希等。能够高效地进行存储和操作数据

2.2 丰富的数据类型

  • 字符串 (String) - 用于存储任何类型的数据串数据
  • 哈希 (Hash) - 适用于存储对象类型的数据,建一个对象的多个属性存储为键值对
  • 列表在(List) - 可以用作队列、栈或列表,支持在列表两端进行快读的插入和删除操作
  • 集合 (Set) - 用于存储不重复的元素,可以进行集合的交、并、差集等操作
  • 有序列表 (Sorted Set) - 对元素进行排序,可以实现例如排行榜等的功能

2.3 数据持久化

由于redis是存储在内存上的数据存储系统,存在一定的数据易失性,因此Redis提供了两种数据持久化的方式。

  • RDB(Redis Database)- EDB是一种快照方式,将内存中的数据定期保存到硬盘上的一个二进制文件中,在数据恢复时,可以快速地进行加载RDB文件,恢复到指定的事件节点状态
  • AOF(Append Only File)- AOF是一种日志方式,将所有的写命令追加到一个日志文件中,在恢复数据时,会逐条执行AOF文件中的写命令进行数据恢复。AOF可以提供更好的数据持久性,但会占用更大的文件体积

可以从数据安全性、恢复效率和性能三个维度对比二者。

  • 安全性 - AOF模型相较于RDB拥有更高的数据安全性,AOF模式能够实现实时的数据持久化,而RDB是一种快照方式的持久化,只能在特定时间实现数据备份,在两次快照间插入的数据有丢失风险,但这种快照方式更适用于数据备份
  • 恢复效率 - RDB模式拥有更高的数据恢复效率,这得益于其数据备份 文件是一个二级制文件,只需将RDB文件加载到内存中就可以对数据进行恢复。而AOF模式需要对指令进行逐条执行恢复,会消耗大量时间

3.高级特征

3.4 Redis事务

Redis事务是一种将多个命令组合在一起执行的机制,其具有:原子性、隔离性、一致性和持久性的特征。使用Redis事务可以实现批量操作同时也可以维护数据的完整性。

特征

  • 原子性 - Redis事务在一定程度上保证了原子性,在事务执行的过程中如果没有发生错误,那么事务中所有命令都活被执行。如果有一个命令执行失败,Redis不会回滚其他命令的执行结果。
  • 隔离性 - Redis事务具有一定的隔离性,在事务执行期间,其他客户提交的命令不会插入到正在执行的事务中,事务中的命令是按照顺序执行的,与其他客户端的操作是隔离的。
  • 一致性 - 如果事务执行前数据库是一致的,并且事务中的命令没有违反任何Redis的规则,那么在事务执行后数据库依然是一致的。虽然Redis事务不提供回滚机制,但通过正确的命令顺序和对错误的合理处理,可以保证数据的一致性。
  • 持久性 - 事务的持久性与Redis的持久化机制相关。如果Redis开启了合适的持久化方式(如AOF或RDB),那么事务执行后的结果会根据持久化策略被保存到硬盘上,从而保证数据的持久性。

应用场景

  • 批量操作 需要对个键执行以系列操作室,可以使用事务来保证这些操作的顺序性和原子性。
  • 维护数据完整性 - 比如,在一个电商系统中,当处理订单时,需要同时更新库存、订单状态和用户积分等多个相关数据,事务可以确保这些相关数据的更新操作协调一致,避免出现数据不一致的情况。

3.5 发布/订阅

Redis 的发布 / 订阅(pub/sub)功能是一种消息通信模式,允许不同的客户端之间进行消息的传递。

基本概念:

  • 频道(channel)- 频道是消息传递的载体。发布者将消息发布到特定的频道,订阅者则订阅感兴趣的频道以接受消息。频道可以看做是一个消息队列,不同的是在发布/订阅模式中,消息会被推送给所有订阅该频道的客户端,而不是像传统消息队列那样按顺序被单个消费者获取。
  • 发布者(publisher)- 发布者是向频道发送消息的客户端。发布者只需要知道要发布消息的频道名称,不需要知道有哪些客户端订阅了该频道。
  • 订阅者(subscriber)- 订阅者是对特定频道感兴趣并接收该频道消息的客户端。订阅者可以订阅一个或多个频道,一旦订阅的频道有新消息发布,订阅者就会收到该消息。

3.6Lua脚本

Lua 脚本是一种轻量级、高效的脚本语言,在 Redis 中有重要的应用。

  • 在 Redis 中,虽然单个命令是原子操作,但有时需要将多个命令组合起来作为一个原子操作执行。Lua 脚本可以实现这一点。
  • 当需要对Redis 执行多个相关操作时,如果不使用 Lua 脚本,每个操作都需要通过网络发送到 Redis 服务器。而使用 Lua
    脚本,只需将整个脚本发送到服务器一次,服务器就可以在内部执行脚本中的多个操作,大大减少了网络传输的开销
    Lua 脚本可以在 Redis 服务器端对数据进行处理和转换。例如,对存储在 Redis 中的数据进行格式转换、数据过滤等操作。

4. Redis 应用场景

4.1 缓存

4.4.1 原理

由于 Redis 将数据存储在内存中,读写速度极快。在 Web 应用中,可将频繁访问的数据(如数据库查询结果、页面片段等)缓存到 Redis 中。当客户端再次请求相同数据时,直接从 Redis 获取,避免了重复查询数据库等耗时操作,大大提高了系统的响应速度。

例如,在电商网站中,商品详情页的信息(如商品名称、价格、描述等)被大量用户频繁访问。将这些信息缓存到 Redis 后,用户请求该页面时,可快速从 Redis 获取数据,减少数据库的负载压力。

4.1.2 缓存更新策略

过期时间策略:为缓存数据设置合理的过期时间,如热门商品信息缓存 10 分钟。过期后,下次请求会重新从数据库查询并更新缓存。
主动更新策略:当数据库中的数据发生变更时(如商品价格修改),主动更新 Redis 中的缓存数据。可以通过消息队列等机制通知缓存更新。

4.2 计数器

4.2.1 用途

适用于统计各种数量,如网站的页面访问量、视频的播放次数、用户的点赞数等。Redis 的原子操作特性保证了在高并发环境下数据的准确性。

例如,在社交媒体平台上,统计一篇文章的点赞数。每次用户点赞时,通过 Redis 的 INCR(自增)命令对相应的点赞数计数器进行操作。

4.2.2 数据持久化需求

对于一些重要的计数器数据,可结合 Redis 的 RDB 或 AOF 持久化方式,确保数据在服务器重启或故障后不会丢失。

4.3 排行榜

4.3.1 基于有序集合实现

Redis 的有序集合(Sorted Set)非常适合构建排行榜。每个元素都有一个分数,可以根据分数对元素进行排序。例如,在游戏中构建玩家分数排行榜,玩家的分数作为有序集合中的元素分数,玩家 ID 作为元素值。

通过 ZRANGE 或 ZREVRANGE 命令可以轻松获取排行榜的前几名或后几名玩家信息。

4.3.1实时更新

当玩家的分数发生变化时,可以使用 ZADD 命令快速更新有序集合中的元素分数,排行榜会立即重新排序,实现实时更新的效果。

4.4 分布式锁

4.4.1 确保互斥访问

在分布式系统中,多个进程或服务可能同时访问共享资源(如数据库中的同一行数据)。Redis 可用于实现分布式锁,确保在同一时刻只有一个进程能够访问共享资源。

例如,在一个分布式电商系统中,多个服务可能同时处理订单操作,为了避免库存超卖等问题,在处理订单减库存操作时,可使用 Redis 分布式锁来保证同一时刻只有一个服务在操作库存。
实现方式

一般使用 SETNX(SET if Not eXists)命令。当一个进程试图获取锁时,通过 SETNX 命令尝试在 Redis 中设置一个特定的键,如果设置成功(表示获取到锁),则可以执行后续操作;如果设置失败(表示锁已被其他进程获取),则需要等待或重试。同时,为了避免死锁,还需要设置锁的过期时间。

4.5 消息队列

4.5.1 发布 / 订阅模式

Redis 的发布 / 订阅(pub/sub)功能可用于构建简单的消息队列。发布者将消息发布到特定频道,订阅者订阅该频道以接收消息。这种模式适用于广播消息的场景,如系统中的实时通知(新订单通知、用户注册通知等)。

不过,Redis 的 pub/sub 模式相对简单,不支持消息的持久化(如果发布消息时没有订阅者,消息会丢失)和高级的消息队列功能(如消息的确认、重试等)。对于更复杂的消息队列需求,可能需要与其他消息中间件(如 RabbitMQ、Kafka 等)配合使用。

4.5.2基于列表的消息队列

也可以利用 Redis 的列表(List)数据结构构建消息队列。生产者使用 LPUSH 或 RPUSH 命令将消息添加到列表的头部或尾部,消费者使用 LPOP 或 RPOP 命令从列表中取出消息。这种方式可以实现简单的消息排队和顺序消费。

4.6 会话管理

4.6.1 存储会话数据

在 Web 应用中,可将会话数据(如用户登录状态、购物车信息等)存储在 Redis 中。相比传统的将会话数据存储在服务器本地文件或数据库中,使用 Redis 存储会话数据具有更高的读写速度,能够提高用户体验。

例如,在一个多服务器的 Web 应用架构中,使用 Redis 存储会话数据可以方便地实现会话共享,用户在不同服务器之间切换时不会丢失会话信息。

4.6.2 会话过期与清理

同样可以为会话数据设置过期时间,当会话过期后,Redis 会自动删除相应的会话数据,减少存储资源的占用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值