高并发核心技术Redis系列(五)--------持久化和事务(下)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 始终同步,每次Redis的写入都会立刻记入日志,性能较差但数据完整性比较好

2.5 AOF同步频率设置

2345_image_file_copy_161.jpg

1. appendfsync always

始终同步,每次Redis的写入都会立刻记入日志,性能较差但数据完整性比较好。

2. appendfsync everysec

每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。

3. appendfsync no

redis不主动进行同步,把同步时机交给操作系统。

2.6 Rewrite

1. AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。

例:设置k1为0,然后incr 进行了4次,k1对应的值会是4,其实就相当于set k1 4

2. 重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会进行重写。

2345_image_file_copy_163.jpg

四、Redis事务

1 Redis事务简介

  1. Redis事务是一组命令的集合,一个事务中的所有命令都将被序列化,按照一次性、顺序性、排他性的执行一系列的命令。

2345_image_file_copy_164.jpg

2. Redis单条命令保证原子性,但是事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。

3. Redis事务没有隔离级别的概念。批量操作在执行前被放入缓存队列,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。

4. Redis事务的三个阶段:

  • 开始事务
  • 命令入队
  • 执行事务

2 Redis事务基本操作

2.1 Multi、Exec、discard

事务从输入Multi命令开始,输入的命令都会依次压入命令缓冲队列中,并不会执行,直到输入Exec后,Redis会将之前的命令缓冲队列中的命令依次执行。组队过程中,可以通过discard来放弃组队。

2345_image_file_copy_165.jpg

例1:

multi  开始事务
set k1 v1 进行组队,并不执行
set k2 v2 进行组队,并不执行
exec   执行队列命令,依次设置k1 k2

2345_image_file_copy_166.jpg

例2:

multi  开始事务
set k3 v3 进行组队,并不执行
set k4 v4 进行组队,并不执行
discard 取消组队,都不执行

2345_image_file_copy_167.jpg

2.2 事务的错误处理

1. 组队阶段某个命令出现了错误,整个队列中的命令都不执行。

2345_image_file_copy_168.jpg

例:整个命令缓存队列都不会执行。

2345_image_file_copy_169.jpg

2. 执行阶段某个命令出现了错误,只有报错的命令不会执行,其他正常执行。

2345_image_file_copy_170.jpg

例:只有报错的命令没有执行。

2345_image_file_copy_171.jpg

3 悲观锁与乐观锁

3.1 事务应用场景

  • 一个请求想给余额减8000
  • 一个请求想给余额减5000
  • 一个请求想给余额减1000

2345_image_file_copy_172.jpg

3.2 悲观锁(Pessimistic Lock)

每次去拿数据的时候都认为别人会修改,所以在每次拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞,直到它拿到锁。传统关系型数据库就用到很多悲观锁,比如行锁、表锁等。

2345_image_file_copy_173.jpg

3.3 乐观锁(Optimistic Lock)

每次去拿数据的时候都认为别人不会修改,所以不会上锁,但在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制。乐观锁适用于多读的应用类型,可以提高吞吐量。Redis就是乐观锁机制实现事务的。

2345_image_file_copy_174.jpg

4 Redis中的乐观锁

4.1 watch key [key……]

在执行multi之前,先执行watch监视一个或多个key,如果在事务执行之前这个(或这些)key被其它命令所改动,那么事务将被打断。

例:开启两个客户端

1号客户端
set money 10000 设置一个money的key
watch money 监视money
multi 开启事务
set money 100 修改money,暂时不执行事务
2号客户端
watch money 监视money
multi 开启事务
set money 110 修改money,暂时不执行事务
1号客户端
exec 执行事务,返回成功
2号客户端
exec 执行事务,更新失败

1号客户端

2345_image_file_copy_175.jpg

2号客户端

2345_image_file_copy_176.jpg

4.2 unwatch

取消watch命令对所有key的监视

如果在执行watch命令之后,exec命令或discard命令先执行的话,那么就不需要再执行unwatch。


目录
相关文章
|
23天前
|
NoSQL 安全 关系型数据库
Redis:持久化的两种方式
Redis持久化机制主要包括RDB和AOF两种方式。RDB通过生成数据快照进行持久化,支持手动或自动触发,具有加载速度快、文件紧凑等特点,但无法实时保存数据。AOF则记录每个操作命令,保障数据更安全,支持多种写入策略,并可通过重写机制优化文件大小。两者各有优劣,常结合使用以兼顾性能与数据安全。
|
15天前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
4月前
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
122 9
|
4月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
1085 7
|
5月前
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
376 3
|
8月前
|
存储 NoSQL 安全
Redis的两种持久化方式---RDB、AOF
通过本文的介绍,我们详细讲解了Redis的两种主要持久化方式:RDB和AOF。每种方式都有其独特的优缺点和适用场景。在实际应用中,可以根据具体需求选择合适的持久化方式,或者同时启用RDB和AOF,以达到最佳效果。希望本文能帮助您更好地理解和应用Redis的持久化机制,构建高效、可靠的数据存储解决方案。
626 79
|
7月前
|
NoSQL Redis
Redis的数据持久化策略有哪些 ?
Redis 提供了两种方式,实现数据的持久化到硬盘。 1. RDB 持久化(全量),是指在指定的时间间隔内将内存中的数据集快照写入磁盘。 2. AOF持久化(增量),以日志的形式记录服务器所处理的每一个写、删除操作 RDB和AOF一起使用, 在Redis4.0版本支持混合持久化方式 ( 设置 aof-use-rdb-preamble yes )
|
23天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
|
缓存 NoSQL Java
Java高并发实战:利用线程池和Redis实现高效数据入库
Java高并发实战:利用线程池和Redis实现高效数据入库
884 0
|
监控 算法 Java
企业应用面临高并发等挑战,优化Java后台系统性能至关重要
随着互联网技术的发展,企业应用面临高并发等挑战,优化Java后台系统性能至关重要。本文提供三大技巧:1)优化JVM,如选用合适版本(如OpenJDK 11)、调整参数(如使用G1垃圾收集器)及监控性能;2)优化代码与算法,减少对象创建、合理使用集合及采用高效算法(如快速排序);3)数据库优化,包括索引、查询及分页策略改进,全面提升系统效能。
173 0