【Redis知识】Redis进阶-redis还有哪些高级特性?

文章目录

    • 概览
      • 1. 持久化
      • 2. 复制与高可用
      • 3. 事务和脚本
      • 4. 发布/订阅
    • Redis事务
      • 示例
      • 事务中的错误处理
      • 使用 `WATCH` 进行乐观锁
      • 总结
    • Redis管道
      • 一、管道的原理
      • 二、管道的特点
      • 三、管道的使用场景
      • 四、管道的实现示例
      • 五、管道的注意事项
    • 发布订阅模式
      • 一、Redis发布订阅模式介绍
      • 二、Redis发布订阅模式使用样例
    • 相关文献

概览

Redis是一个开源的、基于内存的键值存储数据库,它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,并提供了丰富的高级特性以满足不同的应用场景需求。以下是对Redis高级特性的介绍及具体例子说明:

1. 持久化

  • RDB(Redis Database)持久化:RDB是Redis默认的持久化方式,它可以在指定的时间间隔内将内存中的数据以快照的形式保存到磁盘上。RDB持久化的优点是可以节省磁盘空间,适合用于备份和恢复数据。

    • 例子:在Redis的配置文件redis.conf中,可以通过设置save参数来配置RDB持久化。例如,save 900 1表示900秒内至少有1个键被修改时,执行持久化操作。
  • AOF(Append Only File)持久化:AOF持久化是将Redis的操作日志以追加的方式写入到磁盘文件中,可以保证数据的完整性和持久性。AOF持久化的优点是可以保证数据不丢失,适合用于数据恢复。

    • 例子:在Redis的配置文件redis.conf中,可以通过设置appendonly参数来开启AOF持久化。例如,appendonly yes表示开启AOF持久化,appendfilename "appendonly.aof"表示AOF持久化文件的名称。

2. 复制与高可用

  • 主从复制:Redis支持主从复制,允许数据在多个Redis实例之间同步,从而实现高可用性和负载均衡。

    • 例子:可以配置一个Redis主节点和两个从节点,当主节点上的数据发生变化时,从节点会自动同步这些变化。
  • Redis Sentinel:Redis Sentinel是Redis的高可用性解决方案,它提供了监控、通知、自动故障转移和配置管理功能。当主节点出现故障时,Sentinel会自动选择一个从节点提升为新的主节点,并通知其他从节点和客户端更新配置。

    • 例子:在C#项目中,可以使用StackExchange.Redis客户端库来连接到配置了Sentinel的Redis集群,并订阅Sentinel发布的主从切换事件。当主从切换发生时,可以更新客户端配置以确保应用程序能够继续正常工作。

3. 事务和脚本

  • 事务:Redis支持事务,通过MULTIEXECWATCH等命令来处理多个操作的原子性。事务中的命令要么都执行,要么都不执行。

    • 例子:使用MULTI命令开始一个事务,然后发送多个命令(如SADD),最后使用EXEC命令执行这些命令。如果事务中的某个命令执行失败,则整个事务都会失败,不会执行任何命令。
  • Lua脚本:Redis支持Lua脚本,允许在服务器端执行复杂的操作以提高效率。Lua脚本在Redis中是原子执行的,这意味着在脚本执行期间,其他客户端的命令不会被插入到脚本执行的过程中。

    • 例子:可以使用Lua脚本来实现一个计数器功能。在脚本中,使用redis.call('incr', KEYS[1])命令来增加计数器的值,并返回当前的值。

4. 发布/订阅

  • 发布/订阅机制:Redis提供了发布/订阅机制,使得客户端可以订阅特定频道,并接收发布到这些频道的消息。这对于实时消息传递非常有用。

    • 例子:一个Redis客户端可以订阅名为channel1的消息频道。当另一个客户端向channel1发送消息时,订阅了该频道的客户端会接收到该消息。

以下是具体的操作示例:

  • 订阅频道
127.0.0.1:6379> subscribe channel1
Reading messages...(press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
  • 发布消息
127.0.0.1:6379> publish channel1 hello
(integer) 1
  • 接收消息:在订阅了channel1频道的客户端中,会接收到发布的消息:
1) "message"
2) "channel1"
3) "hello"

综上所述,Redis的高级特性为其在缓存、消息传递、实时分析等领域的应用提供了强大的支持。通过合理配置和使用这些特性,可以构建出高性能、高可用性的Redis应用。

Redis事务

Redis 事务提供了一种将多个命令打包在一起,并在一个原子操作中执行的方式。这确保了事务中的所有命令要么全部成功执行,要么全部失败(在事务期间遇到错误时会回滚)。Redis 事务主要通过 MULTIEXECDISCARDWATCH 命令来实现。

以下是 Redis 事务的基本实现步骤:

  1. 开始事务:使用 MULTI 命令。
  2. 添加命令到队列:在 MULTI 命令之后,客户端发送的所有命令都会被 Redis 服务器放入一个队列中,但不会立即执行。
  3. 执行事务:使用 EXEC 命令来执行队列中的所有命令。此时,所有命令会按照它们被添加到队列的顺序被原子性地执行。
  4. 取消事务:使用 DISCARD 命令来取消事务,并清空队列中的所有命令。

示例

以下是一个简单的 Redis 事务示例,展示了如何使用 MULTIEXECDISCARD 命令:

# 开始事务
redis> MULTI
OK

# 添加命令到队列
redis> SET foo bar
QUEUED

redis> GET foo
QUEUED

# 执行事务
redis> EXEC
1) OK
2) "bar"

在这个示例中,SET foo barGET foo 命令被打包到一个事务中,并原子性地执行。

事务中的错误处理

如果事务中的某个命令失败(例如,数据类型不匹配),Redis 会继续执行事务中的其余命令,但会返回错误。例如:

# 开始事务
redis> MULTI
OK

# 添加命令到队列
redis> INCR foo  # foo 是一个字符串,不是整数,所以 INCR 会失败
QUEUED

redis> GET foo
QUEUED

# 执行事务
redis> EXEC
1) (error) ERR value is not an integer or out of range
2) "bar"

在这个示例中,INCR foo 命令会失败,但 GET foo 命令仍然会被执行。

使用 WATCH 进行乐观锁

WATCH 命令提供了一种乐观锁机制,用于监视一个或多个键。如果这些键在事务执行之前被修改,则事务会被中止。

# 监视一个键
redis> WATCH foo
OK

# 开始事务
redis> MULTI
OK

# 添加命令到队列
redis> SET foo newvalue
QUEUED

# 另一个客户端修改了 foo
redis> SET foo anothervalue
OK

# 尝试执行事务(会失败,因为 foo 被修改了)
redis> EXEC
(nil)

在这个示例中,因为 foo 在事务执行之前被另一个客户端修改了,所以事务被中止,EXEC 命令返回 nil

总结

  • MULTI:开始事务。
  • EXEC:执行事务中的所有命令。
  • DISCARD:取消事务。
  • WATCH:监视一个或多个键,用于实现乐观锁。

通过这些命令,Redis 提供了一种简单但功能强大的事务机制,可以在多个命令之间保持数据的一致性。

Redis管道

Redis管道(Pipeline)是一种在客户端向服务端发送多个请求而不等待响应的技术,它允许客户端将多个命令一次性发送到服务器,并在一次网络通信中接收多个命令的响应,从而减少了网络通信的开销,提高了命令执行的效率。以下是关于Redis管道的详细说明:

一、管道的原理

Redis管道通过将多个命令打包成一个请求发送到服务器,服务器依次执行这些命令,并将所有结果一次性返回给客户端。这种方式减少了网络往返次数(RTT,Round Trip Time),降低了通信开销,并提高了性能和吞吐量。

二、管道的特点

  1. 批量执行:管道允许客户端一次性发送多个命令到服务器,从而实现批量执行命令。
  2. 异步通信:管道使用异步通信方式,客户端发送多个命令到服务器后,可以继续执行其他操作,而不必等待命令执行完成。但需要注意,虽然客户端可以异步发送命令,但结果通常还是需要同步获取的,以确保操作的顺序和一致性。
  3. 原子性(相对性):管道中的命令在服务器端是顺序执行的,但管道本身并不保证原子性。也就是说,如果管道中的某个命令失败了,后续的命令仍然会被执行。这与Redis事务中的原子性是不同的。在Redis事务中,如果某个命令失败了,整个事务都会被回滚。

三、管道的使用场景

  1. 数据导入导出:管道可以用于批量导入导出数据,将多个数据操作命令打包成一个请求发送到服务器,减少了网络通信的开销,提高了数据导入导出的效率。
  2. 数据处理:管道可以用于批量处理数据,如批量转换、过滤等操作。将多个数据处理命令打包成一个请求发送到服务器,减少了网络通信的开销,提高了数据处理的效率。
  3. 批量操作:管道可以用于批量执行多个操作,如批量设置键的值、批量删除键等。将多个操作命令打包成一个请求发送到服务器,减少了网络通信的开销,提高了操作的执行效率。

四、管道的实现示例

以下是一个使用Jedis客户端库实现Redis管道操作的Java示例:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;
import java.util.List;

public class TestRedisPipeline {
    // Redis服务器信息
    private static final String REDIS_HOST = "192.168.200.141";
    private static final int REDIS_PORT = 6379;
    private static final String REDIS_PASSWORD = "yourpassword";

    public static void main(String[] args) {
        // 配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(128); // 设置连接池最大连接数
        poolConfig.setMaxIdle(16);   // 设置连接池中的最大空闲连接
        poolConfig.setMinIdle(4);    // 设置连接池中的最小空闲连接
        poolConfig.setTestOnBorrow(true); // 从池中取出连接时,是否进行有效性检查
        poolConfig.setTestOnReturn(true); // 在归还连接时检查有效性
        JedisPool jedisPool = new JedisPool(poolConfig, REDIS_HOST, REDIS_PORT, 10000, REDIS_PASSWORD);

        try (Jedis jedis = jedisPool.getResource()) {
            // 创建管道
            Pipeline pipeline = jedis.pipelined();

            // 批量设置键值对
            for (int i = 0; i < 1000; i++) {
                pipeline.set("key" + i, "value" + i);
            }

            // 批量获取键值对
            for (int i = 0; i < 1000; i++) {
                pipeline.get("key" + i);
            }

            // 执行管道操作并获取结果
            List<Object> results = pipeline.syncAndReturnAll();

            // 处理结果
            for (Object result : results) {
                System.out.println(result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭连接池
            jedisPool.close();
        }
    }
}

在这个示例中,我们使用Jedis连接池来管理Redis连接,并创建了一个管道来批量设置和获取键值对。最后,我们执行管道操作并获取结果,然后处理这些结果。

五、管道的注意事项

  1. 合理控制命令数量:虽然管道可以批量执行多个命令,但过度使用可能导致服务器负载过高。因此,应合理控制每个管道中的命令数量,避免一次性发送过多命令。
  2. 错误处理:管道中的命令如果失败了,后续的命令仍然会被执行。因此,在编写管道操作时需要考虑错误处理机制,以确保数据的正确性和一致性。
  3. 监控服务器负载:通过监控服务器的CPU、内存和网络使用情况,可以了解管道操作对服务器负载的影响,从而进行性能调优和故障排查。

综上所述,Redis管道是一种高效的数据操作和处理机制,通过减少网络通信开销和提高命令执行效率,可以显著提升Redis的性能和可扩展性。

发布订阅模式

Redis的发布/订阅(Pub/Sub)模式是一种消息传递模式,用于实现消息发布者与消息订阅者之间的通信。以下是对Redis发布订阅模式的介绍以及使用样例:

一、Redis发布订阅模式介绍

  1. 基本概念

    • 频道(Channel):消息的通道或主题,发布者将消息发布到特定的频道,而订阅者可以选择订阅一个或多个频道来接收相关的消息。
    • 发布者(Publisher):负责发布消息到频道的客户端,使用PUBLISH命令将消息发送到一个或多个频道。
    • 订阅者(Subscriber):负责接收消息的客户端,使用SUBSCRIBE命令订阅一个或多个频道,并使用UNSUBSCRIBE命令取消订阅。
  2. 工作原理

    • 订阅者通过SUBSCRIBE命令订阅频道,进入订阅状态。
    • 发布者通过PUBLISH命令将消息发布到指定的频道。
    • Redis服务器将消息发送给所有订阅了该频道的订阅者,消息的传递是异步的。
  3. 高级功能

    • 模式订阅:订阅者可以使用通配符来订阅多个频道,例如SUBSCRIBE news.*将订阅以“news.”开头的所有频道。
    • 取消订阅:订阅者可以使用UNSUBSCRIBE命令来取消订阅一个或多个频道,使用UNSUBSCRIBE *命令可以取消订阅所有频道。

二、Redis发布订阅模式使用样例

以下是一个简单的Redis发布订阅模式使用样例,通过两个redis-cli客户端进行演示:

  1. 开启Redis服务:确保本地Redis服务已经开启,并且可以通过redis-cli客户端进行连接。

  2. 订阅频道

    • 打开第一个redis-cli客户端,输入以下命令订阅名为“runoobChat”的频道:
    SUBSCRIBE runoobChat
    

    此时,该客户端会进入订阅状态,等待接收来自“runoobChat”频道的消息。

  3. 发布消息

    • 打开第二个redis-cli客户端,输入以下命令向“runoobChat”频道发布消息:
    PUBLISH runoobChat "Redis PUBLISH test"
    

    此时,第一个redis-cli客户端会收到来自“runoobChat”频道的消息:“Redis PUBLISH test”。

  4. 继续发布消息

    • 在第二个redis-cli客户端中,继续向“runoobChat”频道发布另一条消息:
    PUBLISH runoobChat "Learn redis by runoob.com"
    

    此时,第一个redis-cli客户端会再次收到来自“runoobChat”频道的消息:“Learn redis by runoob.com”。

  5. 取消订阅

    • 在第一个redis-cli客户端中,输入以下命令取消订阅“runoobChat”频道:
    UNSUBSCRIBE runoobChat
    

    此时,该客户端将退出订阅状态,不再接收来自“runoobChat”频道的消息。

通过以上样例,可以看出Redis发布订阅模式的基本工作流程和命令使用。在实际应用中,可以根据具体需求进行更复杂的配置和使用。

相关文献

分布式中间件-redis相关概念介绍
【分布式技术】关于Redis,你想了解的
【分布式知识】Redis6.x新特性了解

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

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

相关文章

Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)

前言 本文最开始属于此文《视频生成Sora的全面解析&#xff1a;从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等》 但考虑到DiT除了广泛应用于视频生成领域中&#xff0c;在机器人动作预测也被运用的越来越多&#xff0c;加之DiT确实是一个比较大的创新&#xff0c;影响力大&…

MAC M4安装QT使用国内镜像源在线安装

MAC M4安装QT使用国内镜像源在线安装 一、下载安装包1. 访问[https://www.qt.io/](https://www.qt.io/)下载在线安装包2. 下载结果 二、创建QT账户&#xff0c;安装的时候需要三、安装1. 终端打开安装包2. 指定安装源3. 运行安装完的QT 一、下载安装包 1. 访问https://www.qt.…

No.1十六届蓝桥杯备战|第一个C++程序|cin和cout|命名空间

第一个C程序 基础程序 使用DevC5.4.0 写一个C程序 在屏幕上打印hello world #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } 运行这个C程序 F9->编译 F10->运行 F11->编译运行 mai…

前端开发 -- 自动回复机器人【附完整源码】

一&#xff1a;效果展示 本项目实现了一个简单的网页聊天界面&#xff0c;用户可以在输入框中输入消息&#xff0c;并点击发送按钮或按下回车键来发送消息。机器人会根据用户发送的消息内容&#xff0c;通过关键字匹配来生成自动回复。 二&#xff1a;源代码分享 <!DOCTYP…

UNI-APP_i18n国际化引入

官方文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/i18n.html vue2中使用 1. 新建文件 locale/index.js import en from ./en.json import zhHans from ./zh-Hans.json import zhHant from ./zh-Hant.json const messages {en,zh-Hans: zhHans,zh-Hant: zhHant }…

【MySQL】第一弹----库的操作及数据类型

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;MySQL &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 一、SQL 语句分类 DDL:数据定…

家用电器销售系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

ChatGPT 与 AGI:人工智能的当下与未来走向全解析

在人工智能的浩瀚星空中&#xff0c;AGI&#xff08;通用人工智能&#xff09;无疑是那颗最为璀璨且备受瞩目的星辰。OpenAI 对 AGI 的定义为“在最具经济价值的任务中超越人类的高度自治系统”&#xff0c;并勾勒出其发展的五个阶段&#xff0c;当下我们大多处于以 ChatGPT 为…

28.<Spring博客系统⑤(部署的整个过程(CentOS))>

引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注&#xff1a;我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…

win11 vs2022 opencv 4.10使用vs Image Watch插件实时可视化内存mat对象

这个本来是非开源工业软件HALCON的一个功能&#xff0c;方便提升图像识别开发效率。原以为opencv没有&#xff0c;需要通过进程间共享内存的方式去实现。 结果在官网帮助文档中发现已经提供了。 opencv 4.10帮助文档https://docs.opencv.org/4.10.0/index.htmlOpenCV Tutorial…

用Python操作字节流中的Excel工作簿

Python能够轻松地从字节流中加载文件&#xff0c;在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作&#xff0c;并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性&#xff0c;还确保了数据的安全性和完整性&#xff0c;尤其是在网络…

uni-app微信小程序如何使用高德地图。通过经纬度获取所在城市,涉及到授权获取地理位置权限

高德地图官方是这样介绍的使用方法可以参考&#xff1a;入门指南-微信小程序插件 | 高德地图API 我再介绍一下我得具体应用。 1&#xff0c;首先要在申请高德地图开放平台得账号。然后在这个账号中申请一个应用。类型选择微信小程序。 我的应用 | 高德控制台 获取Key-创建工…

YOLOv5部署到web端(flask+js简单易懂)

文章目录 前言最终实现效果图后端实现 主界面检测函数检测结果显示 前端实现 主界面(index.html&#xff09;显示图片界面 总结 前言 最近&#xff0c;老板让写一个程序把yolov5检测模型部署到web端&#xff0c;在网页直接进行目标检测。经过1个星期的努力&#xff0c;终于实…

使用Locust对Redis进行负载测试

1.安装环境 安装redis brew install redis 开启redis服务 brew services start redis 停止redis服务 brew services stop redis 安装Python库 pip install locust redis 2.编写脚本 loadTest.py # codingutf-8 import json import random import time import redis …

C#-使用StbSharp库读写图片

一.StbSharp StbSharp是基于C/Stb图形处理库封装的C#接口,支持多种格式PNG/JPG等图片的处理. GitHub链接: GitHub - StbSharp/StbTrueTypeSharp: C# port of stb_truetype.hhttps://github.com/StbSharp/StbTrueTypeSharp二.使用StbSharp创建高度图 创建一张500*500的高度图PN…

单周期CPU电路设计

1.实验目的 本实验旨在让学生通过设计一个简单的单周期 CPU 电路&#xff0c;深入理解 RISC-V 指令集的子集功能实现&#xff0c;掌握数字电路设计与实现的基本流程&#xff0c;包括指令解析、部件组合、电路设计以及功能仿真等环节&#xff0c;同时培养verilog HDL编程能力和…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(五)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 五、 解释评估&#xff08;Explanation Evaluation&#xff09; 在前面的章节中&#xff0c;我们介绍了不同的解释技术和它们的用途&#…

UE5材质节点Camera Vector/Reflection Vector

Camera Vector相机向量&#xff0c;输出像素到相机的方向&#xff0c;结果归一化 会随着相机移动而改变 Reflection Vector 反射向量&#xff0c;物体表面法线反射到相机的方向&#xff0c;x和y和camera vector相反 配合hdr使用

使用Qt中的模型视图框架

本篇文章让你能够在阅读完之后&#xff0c;掌握Qt的模型视图框架的大致使用方法。 问题引入 在我们开发较小的软件的时候&#xff0c;我们可能不会注意到模型视图框架的作用。 因为我们的同一份的数据可能只会在同一个窗口中显示&#xff0c;不会存在数据在一个窗口中更新&a…

跟着逻辑先生学习FPGA-实战篇第一课 6-1 LED灯闪烁实验

硬件平台&#xff1a;征战Pro开发板 软件平台&#xff1a;Vivado2018.3 仿真软件&#xff1a;Modelsim10.6d 文本编译器&#xff1a;Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 LED&#xff0c;又名…