【技术栈】Redis 中的事务及持久化方式

SueWakeup

                                                      个人主页: SueWakeup

                                                      系列专栏:学习技术栈

                                                      个性签名:保留赤子之心也许是种幸运吧

本文封面由 凯楠📸 友情提供

目录

 相关传送门

1. Redis 中的事务 

 2. Redis 持久化

2.1 RDB 方式

2.1.1 RDB手动

2.1.2 RDB自动

2.2 AOF方式

2.2.1 AOF执行过程

2.2.2 AOF写数据的策略

2.2.3 AOF相关配置

2.2.4 AOF写数据遇到的问题

2.2.5 AOF重写

2.2.6 AOF重写规则

2.2.7 AOF重写方式

2.2.8 RDB 和 AOF 的区别

 注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转   


 本栏传送门

1.【技术栈】Redis 的理解与数据存储格式

2.【技术栈】Redis 中的事务及持久化方式

3.【技术栈】Redis 删除策略

4.【技术栈】Redis 企业级解决方案

5.【数据结构】布隆过滤器

6.【开发】SpringBoot 整合 Redis

7.【技术栈】Spring Cache 简化 Redis 缓存使用


1. Redis 中的事务 

概念:Redis事务中的所有命令都会序列化、按顺序的执行。

事务在执行的过程中不会被其他客户端发送来的命令请求所打断。

主要作用:串联多个命令防止别的命令插队

特点:

  1. Redis事务没有隔离级别的概念
  2. 所有的命令在事务中,没有被直接执行,只有发起执行命令的时候才会执行
  3. Redis单条命令保存原子性,但是事务不保证原子性

常用命令:

  1. multi:标记一个事务的开始
  2. exec:执行所有事务块内的命令
  3. discard:取消事务,放弃执行事务块内的所有命令
  4. watch key:监视一个或多个key,如果在事务执行之前这些key被其他命令所改动,那么事务将被打断。
  5. unwatch:取消watch命令对所有key的监视

为什么添加事务?

  • 悲观锁:每次在拿取数据的时候都会上锁,其他请求想获取这个数据就会block直到它拿到锁。传统的关系型数据库里就用到了很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁
  • 乐观锁: 每次在拿取数据的时候不会上锁,但是在更新的时候会判断一下在此期间别人有没有更新数据;适用于多读的应用类型,可以提高吞吐量。Redis 就是利用这种 check-and-set 机制实现事务的。

 2. Redis 持久化

Redis是内存数据库,一旦服务器进程退出,服务器中的数据库状态也会消失,所以需要Redis持久化

持久化过程:

  • RDB:将当前数据状态进行保存,快照形式存储数据结果,存储格式简单,关注点在数据
  • AOF:将数据的操作过程进行保存,日志形式存储操作过程,关注点在数据库的操作过程

2.1 RDB 方式

2.1.1 RDB手动

命令:save

作用:手动执行一次保存操作

配置:

  • dbfilename dump.rdb

说明:设置本地数据库文件名,默认值为dump.rdb

经验:通常设置为 dump-端口号.rdb

  • dir

说明:设置存储.rdb文件的路径

经验:通常设置成存储空间较大的没目录中,目录名称为data

  • rdbcompression yes

说明:设置存储至本地数据库时是否压缩数据,默认为yes,采用LZF算法压缩

经验:通常默认为开启状态,如果设置为no,可以节省cpu运行时间,但会使存储的空间变大

  • rdbchecksum yes

说明:设置是否进行CRC64算法RDB文件格式校验,该校验过程在写文件和读文件过程均进行

经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存在一定的数据损害风险

save指令工作原理(单线程任务执行序列)

客户端1 127.0.0.1:6379>set key1 value1

客户端2 127.0.0.1:6379>set key2 value2

客户端3 127.0.0.1:6379>save

客户端4 127.0.0.1:6379>get key

对redis数据库执行4此指令顺序===> set set save get

注意:save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻 塞,线上环境不建议使用

  • bgsave指令

命令 :bgsave

作用 :手动启动后台保存操作,但不是立即执行

注意: bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方 式,save命令可以放弃使用

  • fork

Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程

2.1.2 RDB自动

配置 :save second changes

作用 : 满足限定时间范围内key的变化数量达到指定数量即进行持久化

参数 :

second:监控时间范围

changes:监控key的变化量

位置 : 在conf文件中进行配置

注意:

  • save配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的
  • save配置中对于second与changes设置通常具有互补对应关系,尽量不要设置成包含性关系
  • save配置启动后执行的是bgsave操作

优点:

  1. 紧凑压缩的二进制文件,存储效率高,节省磁盘空间,恢复数据速度比AOF快
  2. 内部存储redis在某个时间点的数据快照,适合用于数据备份

缺点:

  1. Redis在fork时使用了写时拷贝技术,内存中的数据被克隆了一份,数据庞大会消耗性能
  2. 无法做到实时持久化,较大的可能丢失数据
  3. 版本不统一,不同版本之间存在兼容问题

2.2 AOF方式

概念: 以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的;

主要作用:解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

2.2.1 AOF执行过程

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

AOF缓冲区根据AOF持久化策略将操作同步到磁盘的AOF文件

AOF文件大小超过重写策略或手动重写时,会对AOF文件重写,压缩AOF文件容量

Redis服务重启时,会重新加载AOF文件中的写操作达到数据恢复的目的;

2.2.2 AOF写数据的策略

  • always每次:每次写入操作均同步到AOF文件中,数据零误差,性能较低

  • everysec每秒:每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高

    在系统突然宕机的情况下丢失1秒内的数据

  • no系统控制:由操作系统控制每次同步到AOF文件的周期,过程不可控

2.2.3 AOF相关配置

配置 :appendonly yes|no

作用 :是否开启AOF持久化功能,默认为不开启状态

配置 :appendfsync always|everysec|no

作用 :AOF写数据策略

配置:appendfilename filename

作用:AOF持久化文件名,默认文件名未appendonly.aof,建议配置为appendonly-端口号.aof

配置:dir

作用 :AOF持久化文件保存路径,与RDB持久化文件保持一致即可

2.2.4 AOF写数据遇到的问题

2.2.5 AOF重写

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。AOF文件重写是将Redis进程内的数据转化为写命令同步到新AOF文件的过程。

将对同一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录

作用:

  • 降低磁盘占用量,降低持久化写时间,降低数据恢复用时
  • 提高磁盘利用率,提高持久化效率,提高IO性能,提高数据恢复效率

2.2.6 AOF重写规则

进程内已超时的数据不再写入文件

忽略无效指令,重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令

对同一数据的多条写命令合并为一条命令

为防止数据量过大造成客户端缓冲区溢出,对list、set、hash、zset等类型,每条指令最多写入64个元 素

AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)

2.2.7 AOF重写方式

手动重写 bgrewriteaof

自动重写

触发机制:何时重写 Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发;重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担 的,因此设定Redis要满足一定条件才会进行重写

auto-aof-rewrite-min-size 设置重写的基准值,最小文件64MB。达到这个值开始重写。

auto-aof-rewrite-percentage 设置重写的基准值,文件达到100%时开始重写(文件是原 来 重写后文件的2倍时触发

2.2.8 RDB 和 AOF 的区别

持久化方式RDBAOF

占用存储空间

小(数据级:压缩)

大(指令级:重写)

存储速度

快 

恢复速度

数据安全性

会丢失数据依据策略决定

资源消耗

重量级轻量级

启动优先级

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、什么是 Redis? 2、Redis 相比 memcached 有哪些优势? 3、Redis 支持哪几种数据类型? 4、Redis 主要消耗什么物理资源? 5、Redis 的全称是什么? 6、Redis 有哪几种数据淘汰策略? 7、Redis 官方为什么不提供 Windows 版本? 8、一个字符串类型的值能存储最大容量是多少? 9、为什么 Redis 需要把所有数据放到内存? 10、Redis 集群方案应该怎么做?都有哪些方案? 11、Redis 集群方案什么情况下会导致整个集群不可用? 12、MySQL 里有 2000w 数据,Redis 只存 20w 的数据, 如何保证 Redis 的数据都是热点数据? 13、Redis 有哪些适合的场景? 14、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 15、RedisRedisson 有什么关系? 16、Jedis 与 Redisson 对比有什么优缺点? 17、Redis 如何设置密码及验证密码? 18、说说 Redis 哈希槽的概念? 19、Redis 集群的主从复制模型是怎样的? 20、Redis 集群会有写操作丢失吗?为什么? 21、Redis 集群之间是如何复制的? 22、Redis 集群最大节点个数是多少? 23、Redis 集群如何选择数据库? 24、怎么测试 Redis 的连通性? 25、Redis 的管道有什么用? 26、怎么理解 Redis 事务? 27、Redis 事务相关的命令有哪几个? 28、Redis key 的过期时间和永久有效分别怎么设置? 29、Redis 如何做内存优化? 30、Redis 回收进程如何工作的? 31、Redis 回收使用的是什么算法? 32、Redis 如何做大量数据插入? 33、为什么要做 Redis 分区? 34、你知道有哪些 Redis 分区实现方案? 35、Redis 分区有什么缺点? 36、Redis 持久化数据和缓存怎么做扩容? 37、分布式 Redis 是前期做还是后期规模上来了再做好?为 什么? 38、Twemproxy 是什么? 39、支持一致性哈希的客户端有哪些? 40、Redis 与其他 key-value 存储有什么不同? 41、Redis 的内存占用情况怎么样? 42、都有哪些办法可以降低 Redis 的内存使用情况呢? 43、查看 Redis 使用情况及状态信息用什么命令? 44、Redis 的内存用完了会发生什么? 45、Redis 是单线程的,如何提高多核 CPU 的利用率? 46、一个 Redis 实例最多能存放多少的 keys?List、Set、 Sorted Set 他们最多能存放多少元素? 47、Redis 常见性能问题和解决方案? 48、Redis 提供了哪几种持久化方式? 49、如何选择合适的持久化方式? 50、修改配置不重启 Redis 会实时生效吗?
1.redis支持的数据结构 string list hash set zset(基本回答) 加分项:另外redis还对这几种数据结构做了扩展,如GEO对位置计算,hyperLogLog做统计,bitmaps:redis底层存储value值都是存储的二进制数据,redis提供bitmaps(位图)可以直接访问或修改底层存储的二进制数据 2.redis线程模型 redis是单线程实现。 3.redis 提供的持久机制 redis 支持rdbaof两种持久机制,redis4.0后支持混合持久化rdb是定时的持久机制,宕机有可能会丢失最后一次持久化之后存在数据丢失。aof是基于操作日志追加的持久机制。(基本回答) 加分项: 1.rdb持久化原理 原理是redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化, 这个子线程的所有数据(变量。环境变量,程序程序计数器等)都和原进程一模一样,会先将数据写入到一个临时文件, 待持久化结束了,再用这个临时文件替换上次持久化好的文件 2.他什么时候fork子进程,或者什么时候触发rdb持久化机制 shutdown时,如果没有开启aof,会触发 配置文件默认的快照配置 执行命令save或者bgsave save是只管保存,其他不管,全部阻塞 bgsave: redis会在后台异步进行快照操作,同时可以响应客户端的请求,但是在调用fork函数时是阻塞的,很快,可以忽略不计 执行flushall命令 但是里面是空的,无意义 3.aof原理? 原理是将Reids的操作日志以追加的方式写入文件,读操作是不记录的 2.触发机制(根据配置文件配置项) no:表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证) always:同步持久化,每次发生数据变更时,立即记录到磁盘(慢,安全) everysec:表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据) 以下问题都是基本回答: 4.redis支持事务redis可以说是半支持事务(假事务),提供了一些在一定程度上支持线程安全和事务的命令。例如:multi/exec watch inc等。但是redis事务并不支持回滚,即可以两个命令可以同时提交执行,但是如果有失败,成功的也不会回滚 5.你们公司使用的是什么集群模式 看你写的项目经验,如果你们公司数据量特别大,公司用缓存牛逼,就说Rediscluster,小公司可以说哨兵集群 1.哨兵模式 基本回答:哨兵主要就是启动哨兵(redis特殊)节点,对主节点进行监控,如果半数以上发现ping主节点不通了,认为主节点挂了,则进行故障转移,就是选出一个从节点代替主节点 2.Rediscluster集群模式 基本回答:Rediscluster是一个高可用集群,它基于分片(对key进行crc16,然后对16384取余)的原理,可以把他理解为是由多组哨兵集群组成,但是它不依赖哨兵 6.缓存穿透 缓存穿透指的是使用不存在的key进行大量的高并发查询,这导致缓存无法命,每次请求都要穿透到后端数据库系统进行查询,数据库压力过大。 常用解决方案:将空值缓存起来。 其他解决方案:使用布隆过滤器(guava 19开始已支持布隆过滤器) 备注:如果你可以理解太白老师讲的基于redis位图自己实现的布隆过滤器,可以说说,更加分 7.缓存击穿 缓存击穿是指缓存没有但数据库有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力 解决方案:1.互斥锁 如果项目不会多部署则可以使用jvm锁,如果会多部署则使用分布式锁 8.缓存雪崩 缓存雪崩指缓存服务器重启或者大量缓存集在某一个时间段内失效 常用解决办法: 1.主要就是要搭建高可用集群,保证机器的高可用。 2.对不同的数据使用不同的失效时间,甚至对相同的数据、不同的请求使用不同的失效时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值