Redis 集群 Redis 事务 Redis 流水线 Redis 发布订阅 Redis Lua脚本操作

news2024/11/25 16:41:41

Redis 集群 & Redis 事务 & Redis 流水线 & Redis 发布订阅

    • Redis 集群
      • linux安装redis
        • 主从配置
          • 查看当前实例主从信息
      • Redis Sentinel
        • sentinel
      • Redis Cluster
    • Redis 事务
    • Redis 流水线
    • Redis 发布订阅
    • Redis Lua脚本操作

Redis 集群

linux安装redis

  • 下载安装包,解压
tar -zxvf redis-xx.tar.gz
  • 编译安装
yum install gcc-c++
make
make install
# 打开后台运行 daemonize yes
redis-server redis.conf
redis-cli
主从配置
查看当前实例主从信息
info replication
  • 可以直接在配置文件中指定(永久)
replicaof 主节点ip 主节点端口
masterauth 主节点密码
  • 直接在运行中的实例上通过命令行指定(临时)
slaveof host port
  • 主节点宕机,从节点晋升(手动选择主节点)
slaveof no one

Redis Sentinel

在原有redis主从的基础上,额外部署一套sentinel服务,用于对现有集群的监控,官方文档,实现高可用
故障转移后,恢复节点作为从节点存在。

sentinel
port 26379
dir /tmp
sentinel monitor myreplicas 127.0.0.1 6379 2
sentinel down-after-milliseconds myreplicas 30000
sentinel parallel-syncs myreplicas 1
sentinel failover-timeout myreplicas 180000
sentinel deny-scripts-reconfig yes
daemonize yes
  • 可用两种方式启动
  1. redis-sentinel /path/to/sentinel.conf
  2. redis-server /path/to/sentinel.conf --sentinel

1.port 26379
sentinel监听端口,默认是26379,可以修改。

2.sentinel monitor
sentinel monitor mymaster ip port 2

3.sentinel auth-pass
Redis节点的认证密码(如果有设置密码的话,主节点需一致)
sentinel auth-pass mymaster 123456

4.sentinel down-after-milliseconds
Sentinel主观下线Redis节点超时时间 默认30s
sentinel down-after-milliseconds mymaster 30000

5.sentinel parallel-syncs
并发同步新主节点个数,同步时该节点不可用,
sentinel parallel-syncs mymaster 1

  1. sentinel failover-timeout

failover-timeout 可以用在以下这些方面:

  1. 同一个sentinel对同一个master两次failover之间的间隔时间。

  2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。

  3.当想要取消一个正在进行的failover所需要的时间。  

  4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。

配置示例:

sentinel failover-timeout mymaster1 20000

7.sentinel的notification-script和reconfig-script是用来配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。对于脚本的运行结果有以下规则:

    若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10

    若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。

    如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。

    一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。

1).sentinel notification-script

通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。

配置示例:

sentinel notification-script mymaster /var/redis/notify.sh

2).sentinel client-reconfig-script

当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。以下参数将会在调用脚本时传给脚本:

   <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>

目前总是“failover”, 是“leader”或者“observer”中的一个。 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的。这个脚本应该是通用的,能被多次调用,不是针对性的。

配置示例:

sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

Redis Cluster

Redis Cluster 是一个分布式的概念,数据按一定规则分散在 16379 个槽点内
而 Redis Sentinel 则是依据 Sentinel 实现的高可用,本质上还是集中式的存储,只是提供了故障主从故障转移

  • 每个节点单独启动
    在这里插入图片描述
  • 在任意节点执行 replicas 意味着每个主节点有几个从节点 这里为 3主3从
    即每个主一个从
    在这里插入图片描述
    redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001
    127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    –cluster-replicas 1

Redis 事务

  • Redis事务是对多条命令打包,对涉及的键进行排他(其他客户端连接)的操作。
    如果开启了
    指定键的监听
    ,只要其他客户端对该键进行了操作,则本次事务的所有操作均不会提交
  • 一个事务中,只要不是命令本身有问题,即使操作失败,也不影响其他命令的执行。
  • 另外在事务中的命令由于是将命令加入队列中,尚未执行,所有在事务中是无法获取到相关操作后的数据的。
    @Test
    public void testRedisTransaction(){
        redisTemplate.opsForValue().set("key2", "value2");
        List list = (List)redisTemplate.execute((RedisOperations redisOperations) -> {
            redisOperations.watch("key2");
            redisOperations.multi();
            redisOperations.opsForValue().set("key3", "value3");
            redisOperations.opsForValue().increment("key2", 1);
            Object key3 = redisOperations.opsForValue().get("key3");
            log.info("key3 = {}", key3);
            redisOperations.opsForValue().set("key4", "value4");
            Object key4 = redisOperations.opsForValue().get("key4");
            log.info("key4 = {}", key4);
            return redisOperations.exec();
        });

        log.info("list = {}", list);
    }

Redis 流水线

  • Redis流水线操作,适用于同时执行多条命令的场景,将所有命令一次性打包发送到服务器,减少网络耗时,提高整体性能
  • 与Redis事务类似,命令也是先入队列,所以提交之前,命令不会生效,此时获取不到执行后的数据
    @Test
    public void testPipeLine(){
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        redisTemplate.executePipelined((RedisOperations redisOperation) -> {
            for(int i = 1; i <= 100000; i++){
                redisOperation.opsForValue().set("pipeline_"+i, "value_" + i);
                Object o = redisOperation.opsForValue().get("pipeline_" + i);
                if(i == 100000){
                    log.info("第 {}个数的值 = {}", i, o);
                }
            }
           return null;
        });
        stopWatch.stop();
        log.info("耗时:{}毫秒", stopWatch.getTotalTimeMillis());
    }

Redis 发布订阅

Redis发布订阅
注意发送message 采用的是value 序列化器,可能乱码,需调整value序列化器,可直接使用 stringRedisTemplate 省事

  • 发布消息

    @Test
    public void testRedisPublishSubscribe(){
//        log.info("testRedisPublishSubscribe...");
//        stringRedisTemplate.convertAndSend("你的topic", "Hello Redis 你的 Message");
        redisTemplate.convertAndSend("你的topic", "Hello Redis 你的 Message");
    }
  • 订阅消息
@Component
@Slf4j
public class RedisMessageListener implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String body = new String(message.getBody());
//        String body = new String(message.getBody(), Charset.forName("UTF-8"));
        String channel = new String(pattern, Charset.forName("UTF-8"));
        log.info("监听渠道: {}, 消息: {}", channel, body);
    }
}

Redis Lua脚本操作

Redis 支持 以 lua 脚本操作

/**
     * IDEA 最好安装 EmmyLua 插件,编写lua脚本更轻松
     * Redis Lua 脚本支持
     * 注意 lua脚本参数下标从1开始
     * 键:KEYS[1]
     * 参数值: ARGV[1]
     * 两个序列化器:第一个是指定方法入参的序列化器包括键和参数值;第二个是Redis执行结果返回时的序列化器
     *
     * lua基本语法
     *  拼接 ..
     *  如果是两个数字,就是传的 "3","5"这样的, 使用 + 依然会做加法而不是拼接
     *
     *  基本脚本如下,其他逻辑自行实现
     *
     * local key1 = KEYS[1]
     * local key2 = KEYS[2]
     * local value1 = ARGV[1]
     * local value2 = ARGV[2]
     *
     * redis.call('set', key1, value1)
     * redis.call('set', key2, value2)
     *
     * local dbValue1 = redis.call('get', key1)
     * local dbValue2 = redis.call('get', key2)
     *
     * return dbValue1 + dbValue2
      */
    @Test
    public void testRedisLua(){
        RedisScript<Long> script = RedisScript.of(applicationContext.getResource("classpath:lua/redis.lua"), Long.class);
        RedisSerializer stringSerializer = redisTemplate.getStringSerializer();
        List<String> keys = new ArrayList<>();
        keys.add("key1");
        keys.add("key2");
        String[] values = new String[]{"3", "5"};
        Object result = redisTemplate.execute(script, stringSerializer, stringSerializer, keys, values);
        System.out.println(result);
    }

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

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

相关文章

半监督学习介绍(为什么半监督学习是机器学习的未来)

文章目录 半监督学习的好处半监督学习原理半监督范式总结 半监督学习是一种利用标记和未标记数据的机器学习方法。半监督学习的目标是结合监督学习和无监督学习的优点&#xff1b;利用标记数据的准确性以及未标记数据的丰富性和较低成本。半监督学习可以被认为是 监督学习&…

[ubuntu]OpenFOAM国内源码满速下载地址

下列地址可直接使用git clone&#xff0c;例如&#xff0c;打开终端&#xff0c;在终端直接将下面的复制进去&#xff1a; git clone https://e.coding.net/dyfluid/ThirdParty-6/ThirdParty-6.git即可在本地创建ThirdParty-6文件夹。如果提示你没有git&#xff0c;那么输入下面…

OpenCV实现人脸关键点检测

目录 实现过程 1&#xff0c;代码解读 1.1 导入工具包 1.2导入所需图像&#xff0c;以及训练好的人脸预测模型 1.3 将 dlib 的关键点对象转换为 NumPy 数组&#xff0c;以便后续处理 1.4图像上可视化面部关键点 1.5# 读取输入数据&#xff0c;预处理 1.6进行人脸检测 1…

Django框架集成Celery异步-【2】:django集成celery,拿来即用,可用操作django的orm等功能

一、项目结构和依赖 study_celery | --user |-- models.py |--views.py |--urls.py |--celery_task |--__init__.py |--async_task.py |-- celery.py | --check_task.py | --config.py | --scheduler_task.py | --study_celery | --settings.py | --manage.py 依赖&#xff1a…

竞赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

HTTP Basic 认证

HTTP Basic 认证 难度等级&#xff1a;【初级】 由RFC7617定义的HTTP Basic认证是一种非常基础而简单的认证模式&#xff0c;因此叫他Basic认证。他本质上就是浏览器提供的一个接口&#xff0c;能够根据HTTP返回值&#xff0c;自动弹出一个登录框&#xff0c;让用户输入ID和密码…

利达卓越:以数字金融,追梦新未来

秉持初心、勇敢前行,便能如火炬照彻黑暗,在平凡的生活中不断创新、保持优势,一步步走向梦想的远方。在金融投资领域,利达卓越广招贤才,坚持创新的原则,以数字技术为金融赋能,与多方市场参与建立长期合作关系,为推动全球经济和社会发展贡献力量,以团队金融优势续写时代华美篇章,…

用Golang手写一个Container

本文作者系360奇舞团前端开发工程师 前言 Docker 作为一种流行的容器化技术&#xff0c;对于每一个程序开发者而言都具有重要性和必要性。因为容器化相关技术的普及大大简化了开发环境配置、更好的隔离性和更高的安全性&#xff0c;对于部署项目和团队协作而言也更加方便。本文…

【git的使用方法】——上传文件到gitlab仓库

先进入到你克隆下来的仓库的目录里面 比如&#xff1a;我的仓库名字为zhuox 然后将需要上传推送的文件拷贝到你的克隆仓库下 这里的话我需要拷贝的项目是t3 输入命令ls&#xff0c;就可以查看该文件目录下的所有文件信息 然后输入git add 文件名 我这边输入的是 &#x…

LLMs的终局是通用人工智能AGI总结 生成式AI和大语言模型 Generative AI LLMs

终于学完了 生成式AI和大语言模型 Generative AI & LLMs. LLMs 解决了如下问题&#xff1a; 对NLP的不能够理解长句子&#xff0c;解决方案 自注意力机制Transformers architecture Attention is all you need大模型算力不够&#xff0c;解决方案 LLMs 缩放法则和计算最…

服务器使用u盘安装麒麟系统报错“dracut-initqueue timeout”,/dev/root does not exist

最近使用u盘安装麒麟系统&#xff0c;发现找不到u盘引导程序&#xff0c;提示dracut-initqueue timeout或者/dev/root does not exist 解决方法&#xff0c;先确定启动u盘所在盘符&#xff0c;使用 blkid 命令&#xff0c;我这边显示启动u盘所在盘符是 /dev/sdd4 blkid重启服…

基于Linux安装Hive

Hive安装包下载地址 Index of /dist/hive 上传解压 [rootmaster opt]# cd /usr/local/ [rootmaster local]# tar -zxvf /opt/apache-hive-3.1.2-bin.tar.gz重命名及更改权限 mv apache-hive-3.1.2-bin hivechown -R hadoop:hadoop hive配置环境变量 #编辑配置 vi /etc/pro…

LLMs AWS Sagemaker JumpStart

现在您已经探讨了使用LLM构建应用程序的基础知识&#xff0c;我想向您展示一项名为Amazon Sagemaker JumpStart的AWS服务&#xff0c;它可以帮助您快速进入生产并进行大规模操作。 以下是您在先前视频中探讨的应用程序堆栈。正如您所看到的&#xff0c;构建一个LLM驱动的应用程…

Macos数字音乐库:Elsten Software Bliss for Mac

Elsten Software Bliss for Mac是一款优秀的音乐管理软件&#xff0c;它可以帮助用户自动化整理和标记数字音乐库&#xff0c;同时可以自动识别音乐信息并添加标签和元数据。 此外&#xff0c;Bliss还可以修复音乐库中的问题&#xff0c;例如重复的音乐文件和缺失的专辑封面等…

深耕全面预算管理 拥抱企业数字未来

随着世界数字未来的不断发展&#xff0c;我国也正经历着一场更大范围、更深层次的科技变革。企业面对构建内部生态平衡体系的艰巨任务&#xff0c;对于其信息化部署也提出了更高的要求。增强预算编制的全面性&#xff0c;启动预算管理一体化改革成为了我国企业提高数字化水平的…

Rocket Typist pro for mac 「Macos文本快速输入工具」

Rocket Typist Pro是一款在Mac上使用的文本快速输入工具&#xff0c;它可以帮助用户更快速、更准确地输入文本。 这款软件的设计非常简单、高效&#xff0c;它通过使用短语或宏&#xff0c;可以快速插入文本&#xff0c;减少重复性工作&#xff0c;提高工作效率。 Rocket Typ…

华为校招机试题- 机器人活动区域-2023年

题目描述: 现有一个机器人,可放置于 M N的网格中任意位置,每个网格包含一个非负整数编号。当相邻网格的数字编号差值的绝对值小于等于 1 时,机器人可在网格间移动 问题:求机器人可活动的最大范围对应的网格点数目。 说明: 1)网格左上角坐标为 (0, 0),右下角坐标为 (m-…

Vue 的响应式数据 ref的使用

ref 是 vue 提供给我们用于创建响应式数据的方法。 ref 常用于创建基本数据&#xff0c;例如&#xff1a;string、number、boolean 等。 ref 还是通过 Object.defineProperty 的 get 与 set 方法&#xff0c;实现的响应式数据。 ref 创建基本数据&#xff1a; <template…

springboot 通过url下载文件并上传到OSS

DEMO流程 传入一个需要下载并上传的url地址下载文件上传文件并返回OSS的url地址 springboot pom文件依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w…

【【萌新的SOC学习之基于BRAM的PS和PL数据交互实验】】

萌新的SOC学习之基于BRAM的PS和PL数据交互实验 基于BRAM的PS和PL的数据交互实验 先介绍 AXI BRAM IP核控制器的简介 AXI BRAM ip核 是xilinx提供的一个软核 这个ip核被设计成 AXI的一个从机接口 用于AXI互联的集成 系统的主设备和本地的RAM进行通信 &#xff08;我们可以通过这…