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

本文涉及的产品
云数据库 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。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1天前
|
NoSQL 安全 Unix
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(中)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
15 0
|
1天前
|
存储 NoSQL 关系型数据库
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
【Redis】Redis的特性和应用场景 · 数据类型 · 持久化 · 数据淘汰 · 事务 · 多机部署
10 0
|
1天前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
21 2
|
1天前
|
存储 NoSQL 调度
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(下)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
8 0
|
1天前
|
存储 NoSQL API
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅(上)
Redis源码、面试指南(4)单机数据库、持久化、通知与订阅
15 1
|
1天前
|
Java
在高并发环境下,再次认识java 锁
在高并发环境下,再次认识java 锁
41 0
|
1天前
|
消息中间件 NoSQL Java
Java高级开发:高并发+分布式+高性能+Spring全家桶+性能优化
Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师之路
|
1天前
|
存储 NoSQL Java
探索Java分布式锁:在高并发环境下的同步访问实现与优化
【4月更文挑战第17天】Java分布式锁是解决高并发下数据一致性问题的关键技术,通过Redis、ZooKeeper、数据库等方式实现。它确保多节点共享资源时的同步访问,防止数据不一致。优化策略包括锁超时重试、续期、公平性和性能优化。合理设计分布式锁对支撑大规模分布式系统至关重要。
|
1天前
|
缓存 负载均衡 Java
Java高并发性能指标
Java高并发是指在Java编程环境中,系统能够同时处理大量并发请求或操作的能力。这里的“高”强调的是并发处理的数量级较大,需要系统能够有效地管理多个并发的执行单元,如线程或进程,以确保它们能够高效且正确地执行。
14 0
|
1天前
|
JavaScript Java 测试技术
基于Java的高并发慕课网的设计与实现(源码+lw+部署文档+讲解等)
基于Java的高并发慕课网的设计与实现(源码+lw+部署文档+讲解等)
27 2

热门文章

最新文章