Redis持久化_Redis事务_Redis删除策略

Redis持久化

Redis包含3中持久化方案: RDB, AOF, RDB与AOF混合使用

RDB

RDB: 将内存中数据生成快照形式, 将其保存到.rdb文件中, 关注点是数据

  • 使用命令执行RDB过程
    在保存.rdb文件之前还需要修改redis.conf配置文件, 修改项如下:
dbfilename dump.rdb //配置.rdb文件名, 通常设置为dump.端口号.rdb
dir /www/server/redis/data //设置rdb文件的存储位置
rdbcompression yes //设置存储到本地时, 是否压缩(默认压缩), 使用LZF压缩
rdbchecksum yes //设置是否在读写.rdb文件时, 进行格式校验, 默认开启, 关闭可节约10%时间, 但存在风险
  • 保存指令
save //手动执行保存操作
bgsave //在后台执行保存操作

二者执行过程如下:

  • save执行过程
    在这里插入图片描述
    注: redis是单线程, 执行save操作的时候会造成阻塞问题, 会严重影响其性能, 通常不使用.
    解决删除上述问题, 使用bgsave指令.
  • bgsave指令工作原理如下:
    在这里插入图片描述
    bgsave与save的区别:
redis主线程操作save指令; redis生成子进程操作bgsave指令
  • 自动执行RDB
    在redis.conf配置文件中编写如下配置:
save second changes //在second时间内, 若key发生changes次变化, 那么就进行持久化操作.

配置redis.conf进行rdb操作, 内部使用的还是bgsave指令, 执行流程如下
在这里插入图片描述
注: save需要根据实际业务情况进行配置, save执行频率过高或者过低都会造成性能问题. save配置中的second与changes通常设置为互补的关系, 使用debug reload, shutdown指令会自动执行bgsave(如果没有开启AOF持久化功能)

  • RDB优缺点
优: 存储效率高, 数据恢复速度快
缺: 服务器宕机时会出现部分数据丢失, 使用save或者bgsave都将会导致性能损失, redis的rdb文件版本不统一.

AOF

AOF: 使用日志的方式记录redis执行的命令, 当出现宕机时, 能尽量避免数据丢失的情况, 很好解决了RDB的问题, 但是AOF存在数据恢复较慢的问题.

  • AOF执行步骤
    在这里插入图片描述
  • AOF写数据的3中策略(AOF写数据也是使用fork处理, 与bgsave一样)
always: 每次的写操作命令都同步到AOF文件中, 数据误差零, 但性能低下.
everysec: 每秒将命令缓存区中内容同步到.aof文件中, 会丢失1s的数据, 准确性较高, 性能较好, 默认配置.
no: 使用系统控制, 整体过程不可控.
  • AOF相关配置
appendonly yes|no //yes代表aof功能开启, 默认不开启
appendfsync always|everysec|no //设置AOF写数据策略
appendfilename fileName //设置.aof文件名
dir path //.aof文件保存位置
  • AOF重写
    AOF重写: 对同一个数据操作的指令压缩为一条指令, 解决.aof文件体积过大, 增加磁盘利用率, 提高IO性能.
    例: set name A; set name B; set name C; ===> set name C;
  • AOF重写方式
//输入命令进行手动重写
bgrewriteaof//配置redis.conf进行自动重写
auto-aof-rewrite-min-size size //当前缓存区中指令数大于最小值, 就重写
auto-aof-rewrite-percentage percent //当尺寸的比例, 大于指令值就重写

注: AOF手动重写过程调用fork函数, 生成子进程, 子进程进行.aof重写, 流程与bgsave一样.

  • AOF工作流程:
    在这里插入图片描述
  • AOF重写流程:
    在这里插入图片描述
    注:
AOF缓冲区同步策略由appendfsync控制.
系统调用write和fsync说明:
write操作会触发延迟写机制, Linux在内核提供页缓冲区用来提高IO性能, write操作在写入系统缓冲区后直接返回, 当出现宕机的情况会导致缓冲区内容丢失.
fsync对单个文件操作, 使用强制磁盘同步.保证数据持久化

RDB与AOF区别

持久化方式RDBAOF
占用存储空间小(数据压缩)大(数据重写)
存储速度
恢复速度
数据安全性存在数据丢失依赖于写策略
资源消耗高/重量级低/轻量级
启动优先级

RDB与AOF的选择

数据敏感: 使用AOF(.aof文件较大, 数据恢复速度慢)
数据呈阶段性有效: 使用RDB(对数据丢失不敏感, 数据恢复速度快)
综合比对:

  • RDB与AOF的选择实际上是在做一种权衡,每种都有利有弊
  • 如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用AOF
  • 如能承受数分钟以内的数据丢失,且追求大数据集的恢复速度,选用RDB
  • 灾难恢复选用RDB
  • 双保险策略,同时开启 RDB 和 AOF,重启后,Redis优先使用 AOF 来恢复数据,降低丢失数据的量

持久化应用场景

Tips 1:redis 应用于抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
Tips 2:redis 应用于具有操作先后顺序的数据控制
Tips 3:redis 应用于最新消息展示
Tips 4:redis 应用于基于黑名单与白名单设定的服务控制
Tips 5:redis 应用于计数器组合排序功能对应的排名
Tips 6:redis 应用于即时任务/消息队列执行管理

Redis事务

多个redis-cli操作一个redis-server就会存在事务问题.

  • 事务基本操作
multi //开启事务
exec //执行事务
discard //取消事务, 终止当前事务, 在multi与exec中间发生

注: multi必须与exec成对出现, 当开启事务时, 加入事务的命令都进入任务队列中, 当执行exec指令时, 才将任务队列中的指令取出进行执行.
在这里插入图片描述
注: 若命令队列中的命令书写错误, 则队列中所有的指令都不会执行, 若队列中的命令书写正确但是运行错误(例如: set name A; name不存在), 正确的命令都会执行, 错误的命令不会执行, 已经执行完的命令不会自动回滚, 需要在代码中手动实现.

  • 手动回滚事务
记录操作之前数据状态, 设置修改的值可以进行恢复.

  • 在执行事务时为共享资源加锁, 防止其他redis-cli对共享资源修改.
watch key1 [key2...] //对key加锁, 在一个事务内, 其他redis-cli对key做修改, 则当前事务无效
unwatch //取消对所有key的监视

事务执行成功:
在这里插入图片描述
事务执行失败, 在该事务下, 使用另外一个redis-cli修改list中的值, 当该事务exec, 出现失败.
在这里插入图片描述

  • 监控具体的数据是否被修改(watch只能监控key对应value的变化, 不能监控具体的数据)
setnx lock lockValue//设置lock(可以将这里的lock理解为就是string), 如果lock已经存在, 则返回0
del lock //删除lock

在这里插入图片描述在这里插入图片描述
当1号客户端设置lock时, 2号客户端对尝试修改lock, 但是修改失败, 说明该lock已经存在, 此时2号客户端停止操作.
注: 利用setnx的返回值, 对于返回设置成功的, 拥有控制权, 进行下一步具体业务操作, 对于返回失败的, 不具有控制权, 进行排队或等待.当拥有控制的客户端执行完所有操作后, 使用del删除lock, 此时另外的客户端就拥有了资源的控制权.

  • 使用expire为lock添加时间期限, 防止setnx后, 服务器宕机, lock一直存在, 其他客户端无法获取lock进行操作
expire lock seconds //为setnx的锁添加seconds时间限定, 超出该时间后, 自动放弃锁
pexpire lock milliseconds //同上, 添加milliseconds时间

注: 通常操作都是毫秒级别, 不应将锁定时间设置过大, 锁定时间设置=>最大耗时120%+平均网络延迟110%

Redis删除策略

  • redis 所有数据放置在内存中, 可使用TTL命令获取数据状态
XX: 具有有效性的数据
-1: 永久有效数据
-2: 已经过期, 删除, 未定义的数据
  • redis expires数据分布结构:
    在这里插入图片描述
  • 数据删除策略如下:
定时删除:数据到达过期时间时, 定时器启动删除.优: 节省内存; 缺: CPU压力较大, 影响吞吐量拿性能换空间惰性删除:数据到达过期时间, 不进行处理, 等再次访问该数据时再删除优: 节约CPU; 缺: 内存压力大拿空间换性能.定期删除(定时删除与惰性删除的折中方案)周期轮询redis库中时效性数据, 采用随机抽取, 利用过期数据占比控制删除频率.优: 修改配置文件数据, 可做到性能与内存的最优.周期性抽查内存空间
  • 定期删除
    在这里插入图片描述
  • activeExpireCycle()函数对每个db的expires空间进行检查, 每次执行250ms/server.hz
  • 检查一个expires时, 随机挑选w个key(w = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性)
    • 若key过期, 则删除key
    • 若一轮中删除的key数量>=w*25%, 则循环该过程
    • 若一轮中删除的key数量<=w*25%, 则进入下一个expires空间
  • 使用current_db记录当前activeExpireCycle()进入哪一个expires空间
  • 当activeExpireCycle()执行时间到了, 下一次的activeExpireCycle执行就从current_db开始执行

逐出算法

逐出算法: redis执行每一个命令之前, 都调用freeMemoryIfNeeded()进行内存检测, 判断是否充足, 内存不足时, 将临时删除一些数据, 然后保存新生成的数据.
逐出算法不能100%成功, 不成功则反复执行, 对所有数据进行尝试后, 若不能达到清除的要求, 则输出OOM错误.

  • 逐出算法相关配置
maxmemory //最大可使用内存, 默认为0, 不限制, 通常设置该值为50%以上
maxmemory-samples //选取待删除数据的个数, 使用随机抽取, 而不是全库扫描, 提高性能
maxmemory-policy //达到最大内存后, 对挑选出来的数据进行删除检测易失数据:volatile-lru: 挑选最近最少使用的数据淘汰volatile-lfu: 挑选最近使用次数最少的数据淘汰volatile-ttl: 挑选将要过期的数据淘汰检测全库数据:allkeys-lru: 挑选最近最少使用的数据淘汰allkeys-lfu: 挑选最近使用次数最少的数据淘汰all-random: 任意数据淘汰放弃数据驱逐no-enviction: 放弃删除, 会导致OOM

使用info命令, 查看控制信息, 然后配置逐出策略

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

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

相关文章

第一次线下活动总结

公众号建立有了一段时间了&#xff0c;今天是我们筹划的第一次线下聚会活动&#xff0c;活动发起人是公众号的一个读者&#xff0c;是我们的前辈&#xff0c;也是这次活动的赞助商&#xff0c;非常感谢&#xff0c;支付了聚餐了费用&#xff0c;这次第一届活动&#xff0c;当然…

初学者选黑卡还是微单_零基础,一篇读懂单反和微单

许多小白在选购相机时&#xff0c;常常会纠结选微单还是选单反。那么这次就来一篇通俗讲解&#xff1a;单反和微单有什么区别&#xff1f;谁更好&#xff1f;应该怎么选择&#xff1f;一、单反和微单有什么区别&#xff1f;在了解单反和微单的区别之前&#xff0c;我们先要了解…

Redis核心配置_Redis高级数据类型使用

Redis核心配置 服务端配置 daemonize yes|no //服务器是否已守护进程方式运行 bind 127.0.0.1 //绑定主机 port 6379 //设置端口 databases 16 //设置数据库数量 loglevel debug|verbose|notice|warning //设置日志级别 logfile 端口号.log //设置日志文件名 maxclients 1 //…

xcode8注释快捷键失效问题

1. 首先按上图的指示&#xff0c;查看Add Documentation后面的快捷键是不是optioncommand/。 2. 如果发现不是默认的快捷键&#xff0c;可按快捷键command&#xff0c;打开Xcode偏好设置窗口&#xff0c;选中Key Bindings&#xff0c;搜索Add Documentation&#xff0c;便可修…

vant组件搜索并选择_Vant Weapp - 有赞出品的免费开源微信小程序组件库

轻量可靠的小程序UI组件库&#xff0c;主流移动组件库 Vant 的微信小程序版本。Vant Weapp 和 Vant 的区别之前推荐过的移动端web组件库 Vant 是 Vue.js 版本的&#xff0c;其对内承载了有赞所有核心业务&#xff0c;对外有十多万开发者在使用&#xff0c;一直是业界主流的移动…

走了,又回来了

今天换了个大的办公室&#xff0c;从100平增加到了300平&#xff0c;从宝安到南山&#xff0c;从旧环境到新环境&#xff0c;不是新的开始&#xff0c;是新的环境和心情。突然有点感慨&#xff0c;那时候从科技园出发&#xff0c;跟HP从深圳坐高铁去广州&#xff0c;在广州小蛮…

Flink-Java版单词计数(批处理流处理)

创建工程 pom.xml文件依赖如下: <dependencies><dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.10.1</version></dependency><!--依赖的一些组件需要 Scala 环境…

怎么做批注_BIM平台是什么?有何用?怎么用?

原标题&#xff1a;BIM平台是什么&#xff1f;有何用&#xff1f;怎么用&#xff1f;随着BIM技术的深入应用&#xff0c;我们也不再拘泥于单单BIM软件的使用&#xff0c;在BIM技术的广泛应用之下&#xff0c;BIM平台也逐渐成为了BIM技术的最佳体现&#xff0c;也成为了众多工程…

Flink并行度优先级_集群操作常用指令_运行组件_任务提交流程_数据流图变化过程

Flink并行度优先级(从高到低) sum(1).setParallelism(1) env.setParallelism(1) ApacheFlinkDashboard任务添加并行度配置 flink-conf.yaml并行度配置 注: 处理输入输出时, 并行度默认为 1Flink集群常用指令 提交任务 run: 代表执行; c: 指定入口类; p: 并行度; host, post:…

招银网络笔试java_最新!!招银网络科技Java面经,整理附答案

作者&#xff1a;榨汁机2号 链接&#xff1a;https://www.nowcoder.com/discuss/1640193月12号现场面试的&#xff0c; 感觉好像所有人有3面的样子。到目前也没有消息&#xff0c;有消息的吱一声&#xff0c;让我早点死了这个心…..一面 1 Java的八大基本类型byte、short、int、…

FlinkAPI_Environment_输入源_算子转化流程

Flink Environment getExecutionEnvironment() 根据当前平台, 获取对应的执行环境, 若未设置并行度, 使用 flink-conf.yaml 中的并行度配置, 默认 1. StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment();createLocalEnviroment() 创建本地…

第2章 Linux内核模块

宏内核和微内核继续前面第一章的知识&#xff0c;虽然有点啰嗦&#xff0c;既然啰嗦了就继续啰嗦下去吧&#xff0c;也是给第一章的内容增加解释。我们知道内核如果按种类来划分的话&#xff0c;可以分为宏内核和微内核&#xff0c;微内核是一个比较先进的内核&#xff0c;我不…

的注册表怎么才能删干净_油烟净化器怎么清洗才能清理干净呢?

油烟机的净化器的主要功能是过滤厨房里的油烟&#xff0c;因为它总是处理油烟&#xff0c;所以清洗净化器很麻烦&#xff0c;那么如何清洗呢&#xff1f;经常清洗油烟净化器是很有必要的&#xff0c;但清洗起来很麻烦&#xff0c;清洗起来也不容易。今天&#xff0c;我想告诉大…

ado 字符串变量

这次变量主要针对 Mfc 的 Cstring 类型的变量&#xff08;前面VC 链接Access 数据库 插入变量到表&#xff09; 思路; 1 把cstring 类型 转为 string 2 string 转 char 数组 3 sprintf 写入数组 string 转 char 数组函数[cpp]view plaincopyprint?char* zhuanhuan(std::strin…

周立功先生和他的AWorks团队招聘

我之前写的一篇文章&#xff0c;介绍了周立功先生&#xff0c;我记得那篇文章的阅读量非常多&#xff0c;也让我迎来一段小高潮&#xff0c;随着时间的推移&#xff0c;慢慢的增加了我对周立功先生的了解&#xff0c;我们很多人&#xff0c;像我吧&#xff0c;工作的时候&#…

mongodb python 大于_Python中使用MongoDB详解

作者&#xff1a;Zarten知乎专栏&#xff1a;Python爬虫深入详解知乎ID&#xff1a; Zarten简介&#xff1a; 互联网一线工作者&#xff0c;尊重原创并欢迎评论留言指出不足之处&#xff0c;也希望多些关注和点赞是给作者最好的鼓励 &#xff01;介绍MongoDB是一种面向文档型的…

这不是商业互吹,是学习的宝藏

学习如逆水行舟&#xff0c;不进则退&#xff1b;只有坚持不断的学习,才能保持进步。今天给大家精心挑选的这几个优质的公众号&#xff0c;在行业深耕已久&#xff0c;相信大家一定会有所收获&#xff0c;感兴趣的可以关注一下。互联网架构师 号主985计算机硕士毕业&#xff…

关于这些那些

关于篮球先说下&#xff0c;我刚才已经写完文章了&#xff0c;但是因为没有保存&#xff0c;浏览器想着周末早点回去休息就闪退了&#xff0c;把写好的文章给闪退没有了&#xff0c;这个真是拿起自己的坑砸死了自己&#xff0c;那种赶脚只有自己能够明白&#xff0c;真的是太难…

mysqldump 定时备份数据(全量)

MYSQL 数据库备份有很多种(cp、tar、lvm2、mysqldump、xtarbackup)等等&#xff0c;具体使用哪一个还要看你的数据规模。下面给出一个表 #摘自《学会用各种姿态备份Mysql数据库》 备份方法备份速度恢复速度便捷性功能一般用于cp快快一般、灵活性低很弱少量数据备份mysqldump慢慢…

第3章 Linux内核调试手段之内核打印

开始前面说的话在我写代码的生涯里&#xff0c;我看到过很多大神炫耀自己的调试手段&#xff0c;也看到很多大神写过非常厉害的代码&#xff0c;我认为&#xff0c;相比于写代码&#xff0c;调试更加重要&#xff0c;而那些能在写代码的时候就加入了自己的调试信息的&#xff0…