news 2026/9/25 5:07:20

Redis(事务、持久化)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis(事务、持久化)
1、redis简介

redis是NoSQL(Not Only SQL):非关系型数据库

常见的非关系型数据库有:MongoDB、Redis、Memcache。

Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存、持久化的日志型、Key-Value数据库,并提供多种语言的API。

支持的数据类型:String(字符串)、hash(哈希)、list(列表)、set(集合)和zset(sorted set :有序集合)。这些都支持push/pop、add/remove以及交集并集和差集等操作。

redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(半持久化模式);也可以把每一次数据变化都写入到一个append only file(aof)里面(全持久化模式)。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是DRB持久化(原理是将redis在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Redis的操作日志以追加的方式写入文件)。

2、Redis常用的命令
ping :测试redis数据库是否连接成功 set a 12 :表示a为键存储一个值为12; keys * :查看当前所有库的key; exists key :判断某个key是否存在; type key : 查看key是什么类型 del key :删除指定的key数据 unlike key :根据value删除非阻塞删除。 expire key 10 :指定key的有效期为10秒; ttl key :查看指定的key还有多少秒过期,-1表示永不过期 select dbindex :切换数据库 默认为0; flushdb :清空当前数据库; flushall :清空全部数据库
1、String字符串类型:

set <key> <value>:设置键值对的

get <key> :获取键得到对应的值

append <key> newValue:往key中追加值。

strlen <key>:查看键的长度。

incr/decr:原子递增/递减1

incrby/descrby:递增或递减指定的数字

mset <key> <value> <key> <value> :可以同时设置多个键值对

mget <key> <key> :可以同时得到键的值

getrange:获取值的范围 getrange key start end;

setrange key <起始位置> <value> :覆盖指定位置的值

getset:<key> <value> :以新换旧,设置新值的同时返回旧值。

2、List列表

redis列表是简单的字符串列表,按照插入排序,可以添加一个元素到列表的头部(左边)或者尾部(右边),他的底层是使用的双向链表实现的,对两端的操作性能很高。通过索引下标操作组件节点性能会比较差。

lpush/rpush:从左边或者右边插入一个或多个值。

lrange <key> <start> <stop> :从列表左边获取指定范围内的值

lpop/rpop <key> <count> :从左边或者右边弹出多个元素

count:可以省略 默认值为1。

lpop/rpop 操作之后,弹出的值会从列表中删除,如果列表内的值全部弹出,则键将被删除。

llen <key>:获取列表长度

linsert:在某个值的前面或后面插入一个值

linsert <key> before|after <value> <newvalue>

3、发布和订阅

redis的发布和订阅(pub/sub)是一种消息通信模式:发布者发布消息,订阅者接受消息,redis客户端可以订阅任意数量的频道。

subscrible:订阅一个或者多个频道

subscrible channel [channel1.....]

publish:发布消息到指定的频道

publish channel message

psubscribe:可以支持通配符来订阅多个符合给定模式的频道

psubscrible pattern [pattern.....] 可能会遇到*通配符
4、事务和锁

redis的事务是一个单独的隔离操作,事务中的所有命令都会序列化,按顺序的执行,事务在执行的过程中,不会被其他客户端发来的命令请求所打断。redis事务的主要作用就是串联多个命令防止别的命令插队。

Multi、Exec 、Discard

从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,redis会将之前的命令依次执行。组队的过程中可以通过discard来放弃组队。

redis事务分为2个阶段:组队阶段和执行阶段

组队阶段:只是将所有命令加入命令队列;

执行阶段:依次执行队列中的命令,在执行这些命令的过程中,不会被其他客户端发送的请求命令插队或打断。

multi:标记一个事务块的开始,事务块内的多条命令会按照先后顺序放进一个队列中,最后有exec命令原子性(atomic)地执行。

乐观锁(Optimistic Lock)顾名思义,就是很乐观,每次去拿数据的时候都会认为别人不会修改,所以不会上锁,但是在修改的时候会判断一下再次期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。redis就是使用这种check-and-set机制实现事务的。redis默认支持乐观锁机制。

unwatch:取消监视

取消WATCH命令对所有key的监视,如果在执行WATCH命令之后,EXEC命令或DISCARD命令先被执行了的话,那么就不需要再执行UNWATCH了,因为exec命令会执行事务,因此watch命令的效果已经产生了,而discard命令在取消事务的同时也会取消所有对key的监视,因此这两个命令执行之后,就没有必要执行unwatch了。

redis事务的三大特征:

1、单独的隔离操作。事务中的所有命令都会序列化,按顺序的执行,事务在执行过程中,不会被其他客户端发送来的命令请求所打断。

2、没有隔离级别的概念:队列中的命令没有提交exec之前,都不会实际被执行,因为事务提交前任何指令都不会被实际执行。

3、不能保证原子性:事务中如果有一条命令执行失败,后续的命令任然会被执行,没有回滚,如果在组队阶段,有1个失败了,后面年都不会成功;如果在组队阶段成功了,在执行阶段有那个命令失败就这条失败,其他的命令则正常执行,不保证都成功或都失败。

5、持久化

1、触发PDB备份

save用来配置备份的规则save的格式:

save 秒钟 写操作次数

默认是1分钟内修改1万次,或5分钟内需要修改10次,或30分钟修改1次。

手动执行命令备份(save,bgsave、flushall)有三个命令可以触发备份。

save:save时只管保存,其他不管,全部阻塞,手动保存 不建议使用;

bgsave:redis会在后台异步进行快照操作,快照同时还可以相应客户端情况。可以通过lastsave命令获取最后一次成功生成快照的时间。

flushall:执行flushall命令,也会产生dump.db文件,但里面是空的,无意义。

优势:

适合大规模数据恢复、对数据完整性和一致性要求不高更适合使用、节省磁盘空间、恢复速度快。

2、AOP

以日志的形式来记录每个写操作(增量保存),将redis执行过的所有写指令记录下来(读操作不记录),只允许追加文件但不可改写文件,redis启动之初会读取该文件重新构造数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次,以完成数据的恢复工作。

AOF持久化流程:

1、客户端的请求写命令会被append追加到AOF缓冲区内;

2、AOF缓冲区会根据AOF持久挂策略【always,everysec,no】将操作sync同步到磁盘的AOF文件中;

3、AOF文件大小超过重写策略或手写重写时,会对AOF文件进行重写(rewrite),压缩AOF文件容量;

4、redis服务器重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的。

AOF默认不开启 可以在redis.conf文件中进行配置。

appendonly on # yes是开启,no是关闭,默认为no。 appendfilename "appendonly.aof" # aof文件名称,默认为appendonly.aof dir ./ # aof文件所在目录

当AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载。

AOF同步频率设置:

1、appendfsync always:每次写入立即同步,始终同步,每次redis的写入都会like记入日志;性能较差但数据完整性比较好。

2、appendfsync everysec:每秒同步,每秒记录日志一次,如果宕机,本地数据可能丢失;更新的命令会放在内存中AOF缓冲区,每秒将缓冲区的命令追加到AOF文件;

3、appendfsync no:不主动同步,redis不主动进行同步,把同步交给操作系统。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/25 5:05:39

基于MatlabSimulin的微电网模型及光伏电池建模仿真分析

目录 第一章 微电网 1 1.1概念 1 1.2技术应用 1 1.3 研究意义 1 第二章 微电网组成元件 2 2.1 开关器件 2 2.1.1 断路器 2 2.1.2 静态开关 2 2.2 分布式电源 3 2.3 储能单元 3 2.4 电力电子接口电路 4 第三章 微电网控制及逆变器原理 4 3.1 微电网的基本结构 4 3.2 微电网的系统…

作者头像 李华
网站建设 2026/9/25 5:05:28

【Dify】智能生成英文友好Slug网址

自动生成 SEO 友好的英文网址,是网站内容提升搜索引擎表现的关键步骤。通过智能化流程,将原始标题或内容直接转化为规范化的英文 slug,可以极大地提升页面可见度与管理效率。 本文介绍了一套适合自学编程人群的 slug 生成解决方案。内容包括工作流的核心节点、自动化处理机…

作者头像 李华
网站建设 2026/9/25 5:04:54

Atlas 300V 24G 是运算加速卡吗?YOLO 部署实战与避坑指南

1. 从“atlas”这个关键词说起&#xff1a;它到底指什么第一次看到“atlas”这个词&#xff0c;很多人脑子里蹦出来的可能是地图册&#xff0c;或者希腊神话里扛着地球的泰坦神。但在技术圈子里&#xff0c;尤其是最近这段时间&#xff0c;atlas 更多指向的是华为昇腾&#xff…

作者头像 李华
网站建设 2026/9/25 5:03:39

Windows下Eclipse CDT + MinGW-w64搭建C++开发环境全指南

简介&#xff1a;面向Windows 64位平台的Eclipse C/C IDE集成开发环境完整安装包&#xff0c;对应2022年3月发布的稳定版本&#xff0c;适合需要在Windows系统上进行C/C项目编写、构建、调试与维护的初学者和进阶开发者&#xff0c;也适用于希望对比不同IDE工作流的技术人员。压…

作者头像 李华
网站建设 2026/9/25 5:03:02

PUBG战绩去哪查?2026支持查战绩的开黑语音平台盘点

打完一把 PUBG&#xff0c;你最想干的事是什么&#xff1f;大概率是查战绩。这把杀了几个、吃鸡没吃鸡、伤害多少、KD 涨没涨——PUBG 玩家的战绩焦虑&#xff0c;不比查高考分数轻。但战绩入口藏得深&#xff1a;游戏内要看半天、网页查询又不方便&#xff0c;如果能边开黑边顺…

作者头像 李华
网站建设 2026/9/25 5:02:53

FLIR热像仪石化检测应用方案与菲力尔热像仪经销商实力参考

2026年石化行业热像检测刚需&#xff0c;先搞懂核心原理再落地热像仪在石化行业的应用&#xff0c;本质是通过捕捉设备表面的红外热辐射差&#xff0c;实现非接触式的温度异常预警与状态评估。不同于传统的离线点检、事后维修模式&#xff0c;红外热像检测能在设备运行状态下实…

作者头像 李华