主从架构&lua脚本-Redis(四)

2023-11-04

上篇文章介绍了rdb、aof持久化。

持久化RDB/AOF-Redis(三)icon-default.png?t=N4P3https://blog.csdn.net/ke1ying/article/details/131148269

  • redis数据备份策略
  1. 写job每小时copy一份到其他目录。
  2. 目录里可以保留最近一个月数据。
  3. 把目录日志保存到其他服务器,防止机器损坏。

  • 主从复制

第一步:复制一份redis.conf

第二步:将相关配置修改如下

Port 6380

# 把pid进程号写入pidfile配置文件

Pidfile /var/run/redis_6380.pid

Logfile “6380.log”

Dir  /usr/local/redis-5.0.3/data/6380

第三步:配置主从(重要)

# 从本机6379额redis复制数据

Replicaof 192.168.81.128 6379

# 只读不写

Replica-read-only yes

第四步:启动从节点

src/redis-server redis_6380.conf

第五步:连接从redis

Src/redis-cli -p 6380

 

从我搭建的结果可以看到:

6379redis写入数据,在6380里是可以看到的,并且因为配置了只读,所以我在6380redis里操作set命令不能成功。

全量复制:

1、当你为master配置了slave,不管是否是第一次连接,都会发送PSYNC命令给master请求复制数据。

2、master收到后会在后台bgsave生成最新rdb快照文件,缓存中继续接受新数据。Slave收到文件则加载到内存,再接受缓存中的master数据。(此处rdb和配置的rdb持久化没关系)

如果master收到并发连接,只会持久化一次,把这一份数据发给所有slave。

增量复制:

如果slave挂了几分钟,这时候不需要同步全量数据,只需要复制新增的master数据。

第一步:slave发送psync(offset)

第二步:master在repl backlog buffer中有offset则只同步新增数据,否则全量复制。

如果从节点太多怎么办呢,也就是主从复制风暴怎么解决?

当出现这种情况是从节点太多导致主节点同步压力过大,可以采取从节点给节点复制的方案来解决。

三、Redis LUA脚本

  1. 减少网络开销。(多个命令一起发送,所以开销少)
  2. 原子性。
  3. 事务特性。

127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

1) "key1"

2) "key2"

3) "first"

4) "second"

这段lua脚本意思是返回两个key和value,其中key1前面的2代表key的个数

 

那我们用lua脚本模拟如何实现事务的回滚以及原子性呢?

如图所示,我们先set product_stock_10016为15

Script里有一个KEYS[1]和ARGV[1],这两个值分别对应着下面代码eval的两个参数,所以a的值获取为15,b的值获取为10.

第四行很好理解,如果a>=b则走再次复制 a-b

也就是15-10

因为return 1,最后obj=1,而product_stock_10016 为5。

如果我们把语法错误 bb==0注释解开。

则会回滚。

Lua脚本不会执行,则product_stock_10016为15

因为redis是单线程,前面也说了不能有大key,获取key不能用keys命令。

这里则不能再lua脚本出现死循环和耗时运算,因为他是单线程,如果因为lua脚本耗时太长甚至死循环,则整个redis会阻塞。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

主从架构&lua脚本-Redis(四) 的相关文章

  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 如何在Conky中实现一个基本的Lua功能?

    我正在尝试向我的 Conky 添加一个函数 该函数打印字符串的长度以用于调试目的 代码位于名为的文件内test lua 非常简单 function test word return string len word end 我这样加载它 在我
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • Lua中如何在另一个表的表成员中搜索

    我正在编写一个 lua 程序 它有一个表 该表是另一个表的成员 当我向该成员表添加新日期时 一切正常 但是 当我想在该表中搜索时 无论我给出什么键 我总是会将最后一行添加到表中 如何在该成员表中正确搜索 Stream name functi
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • 比较 Lua 中的日期

    我有一个带有日期表的变量 如下所示 table day number 15 year number 2015 month number 2 如何获取当前日期与上述日期之间的天数 非常感谢 您可以使用os time 将表转换为秒并获取当前时间
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • redis 2.8.7 Linux Sentinel环境配置问题,如何使其自启动,应该订阅什么?

    现在我们尝试使用 redis 2 8 7 作为缓存存储 来自使用 booksleeve 客户端的 NET Web 应用程序 目前看来这是一个非常有趣和令人兴奋的任务 redis 文档非常好 但由于缺乏真正的实践经验 我确实有几个关于如何正确
  • LuaJ 导入 Lua 方法

    我正在使用 LuaJ 并且我有一个 lua文件充满了一堆函数 如何通过 LuaJ 导入这些函数以在 Java 中使用 一种选择是将文件编译为 Java 代码并导入它 另一种方法是使用可嵌入解释器直接从 Java 代码中调用 Lua 文件 E
  • 如何让我的 add 命令找到第一个变量和第二个变量的值,然后将它们加在一起?

    vars values function open file lex file end function lex file local data io open file r for char in data lines do Print
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • Redis 队列工作程序在 utcparse 中崩溃

    我正在尝试按照以下教程获得基本的 rq 工作 https blog miguelgrinberg com post the flask mega tutorial part xxii background jobs https blog m

随机推荐

  • 23.7.14——23.7.16周末作业

    思维导图 2 有1 2 3 4个数字 能组成多少互不相同且无重复的三位 都是多少 3 终端输入一个数 输出他的二进制 二进制输出不可用格式符 4 定义一个一维整型数组 使用for循环实现数组中元素的输入输出 5 终端输入两个数 求这两个数的
  • windows下PL/SQL Developer连接Orcale

    2 使用PL SQL Developer连接Orcale 这是第三方开发的工具 用于编写PL SQL 代码 调试 查看执行计划等等功能 比较方便 但是是付费软件 Oracle 没有收购这家公司 大家只能用低版本的绿色版 性能有很大的问题 而
  • JavaScript数据结构之队列

    class Queue constructor this count 0 this list this lowestCount 0 往队列添加元素 enqueue element this list this count element t
  • 补充:tensor之间进行矩阵相乘的方法总结

    利用 进行简单的矩阵乘 符号在tensor中就表示矩阵相乘 符号的矩阵相乘性质在numpy中依然适用 首先矩阵相乘的双方必须满足可以矩阵相乘的条件 只会关注两个矩阵最里面的两个维度是否符合条件 外面的维度都只表示矩阵运算的次数 甚至两个矩阵
  • PAT (Basic Level) Practice 1018 锤子剪刀布

    大家应该都会玩 锤子剪刀布 的游戏 两人同时给出手势 胜负规则如图所示 现给出两人的交锋记录 请统计双方的胜 平 负次数 并且给出双方分别出什么手势的胜算最大 输入格式 输入第 1 行给出正整数 N 10 5 即双方交锋的次数 随后 N 行
  • 解决appium-inspector连接后在Appium中报错:No route found for /sessions

    完整报错 Appium inspector 连接点击start session后在Appium中报错 HTTP lt GET sessions 404 6 ms 211 HTTP HTTP gt GET sessions HTTP HTTP
  • 判断用户是否已关注公众号

    背景 业务场景是 判断当前登录用户是否已经关注指定的官方微信公众号 没有就指引用户关注 微信公众号官方文档 https developers weixin qq com doc offiaccount Getting Started Ove
  • CocosCreator中TiledMap在真机无法读取, 浏览器和模拟器正常

    找到CocosCreator的安装路径 我这边是CocosCreator191 resources static build templates wx libs xmldom 打开dom js文件 找到第127行 将 copy ls lis
  • Ubuntu 通过 ssh 传输文件

    因为在 ubuntu 中 微信和qq不方便安装 为了便于不同电脑之间传输文件 便通过ssh 文章目录 ssh 客户端和服务端安装 简单使用 scp文件传输 免密传输 WindTerm ssh 客户端和服务端安装 安装 ssh 服务端 sud
  • 低功耗基础概念——Level Shifter cell补充

    文章目录 为什么现在的IC中高低电压差别不大 仍然需要LS level shifter H2L Level shifer L2H Level shifer Lib文件中对level shifter的描述 信号跨越不同级别电压模块进行驱动时
  • 【论文阅读】A CNN-Transformer Hybrid Approach for CropClassification Using MultitemporalMultisensor Images

    论文题目 利用多时相多传感器图像进行作物分类的CNN Transformer混合方法 目录 摘要 I INTRODUCTION II RELATE WORK A Ground Truth of Crop Types B Preprocess
  • QtWebApp介绍、下载和搭建http轻量级服务器Demo

    一 QtWebApp介绍 QtWepApp是一个C 中的HTTP服务器库 其灵感来自Java Servlet 适用于Linux Windows Mac OS和Qt Framework支持的许多其他操作系统 QtWebApp包含以下组件 HT
  • CTFshow-菜狗杯WP

    经过了48小时的奋战 在这次比赛中成功拿下4400分 同时也发现了自己的许多不足 MISC 杂项签到 下载附件后进行解压 发现是一张图片 通过二进制查看工具 WinHex 010 Editor 打开该图片 Ctrl F搜索文本 ctfsho
  • [Leetcode]回文数(python版)

    判断一个整数是否是回文数 回文数是指正序 从左向右 和倒序 从右向左 读都是一样的整数 示例1 输入 121 输出 true 示例2 输入 121 输出 false 解释 从左向右读 为 121 从右向左读 为 121 因此它不是一个回文数
  • 远程连接mysql失败异常,未配置权限,skip-name-resolve以及防火墙

    刚安装好 mysql之后 用 navicat 连接MySQL 是连不上的 mysql 默认是只能本地连接 如果需要远程连接 需要配置连接权限 我的mysql 版本是 MySQL 5 6 40 本地连接之后 需要重置密码 set passwo
  • Docker导出导入本地镜像

    镜像导出到本地 docker save o root images myminio tar myminio v1 root images myminio tar 新建镜像名 myminio v1 需导出镜像名 镜像导入 docker loa
  • sqli-labs(31-40)

    人过留名 雁过留声 人生天地间 凡有大动静处 必有猪头 Less 31 源码分析 和 Less 29 相似 就是参数使用双引号 括号引用了 注入的时候注意闭合即可 Less 32 源码分析 check addslashes 转义的字符有 反
  • 如何在PHP中以编程方式将Excel文件转换为PDF?试试Aspose

    Excel电子表格被广泛用于以行和列的形式存储和分析数据 但是 在各种情况下 需要先将Excel文件转换为PDF 然后才能通过Internet共享它们 为了自动将Excel转换为PDF 本文介绍了 如何使用PHP通过编程将Excel文件转换
  • 你们要的终极指南! 交易API接口

    股票API接口可谓是量化交易和金融工具中最重要的组成部分 一个高质量的交易API接口对于量化交易程序员而言可谓是福星 因其可使得程序员们进行后向测试 得到可靠的测试结果 验证自己制定的交易策略是否有效 甚至构建自己的财富主页 有可能成为下一
  • 主从架构&lua脚本-Redis(四)

    上篇文章介绍了rdb aof持久化 持久化RDB AOF Redis 三 https blog csdn net ke1ying article details 131148269 redis数据备份策略 写job每小时copy一份到其他目