Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • MySQL

  • Redis

    • 入门redis看这一篇就够了
    • redis入门到精通系列(二):redis操作的两个实践案例
    • key的通用操作和redis内部db的通用操作
    • Jedis--使用java操作redis详解
    • redis的持久化看这一篇就够了
    • redis的事务详解
      • (一)事务的概念
      • (二)redis事务的操作
      • (三)锁
        • 3.1 监视锁:
        • 3.2 分布式锁:
        • 3.3 死锁的解决方案
    • redis高级数据类型详解
    • redis的高可用--主从复制详解
    • redis哨兵模式详解
    • springboot快速集成redis
    • redis的缓存穿透、缓存击穿以及缓存雪崩
    • 看完这一篇文章别再说不懂布隆过滤器
  • MongoDB

  • 数据库系列
  • Redis
CodeEase
2023-10-09
目录

redis的事务详解

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:Java鱼仔

# (一)事务的概念

谈到数据库的高级应用,不可避免会谈到事务。熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行。今天我们就来了解redis中的事务是如何执行和使用的。

# (二)redis事务的操作

在mysql中,事务的执行通过以下三步:

begin  开启事务
commit 提交事务
rollback 回滚操作
1
2
3

而在redis中,事务的执行也主要有三步

multi  开启事务 设定事务的开启位置,后续的所有指令均加入到该事务中
exec   执行事务 设定事务的结束位置,同时开始执行事务
discard 取消事务 取消该事务,放在multi和exec之间
1
2
3

6-1.jpg

可以看到,当exec执行之后,事务中的所有指令才开始执行。 但是redis的事务并不保证原子性,我们在multi中开启事务,如果在执行事务之前的代码中有一条语句是报错的,那么这条错误指令不会执行,其他指令依旧正常执行。

# (三)锁

加锁是实现数据库并发控制的一个非常重要的技术,redis中同样存在锁机制。

# 3.1 监视锁:

//加锁
watch key1 key2...
//解锁
unwatch
1
2
3
4

对key添加监视锁,在执行exec之前如果key发生了变化,就会终止事务执行: 在一个客户端中增加监视锁:

6-2.jpg

此时在另一个客户端中修改name的值

6-3.jpg

再执行事务会发现事务已经被终止了

6-4.jpg

# 3.2 分布式锁:

使用setnx设置一个公共锁

设置锁
setnx lock-key value
解锁
del lock-key
1
2
3
4

对一个key设置公共锁之后,除了设置锁的人之外,其他人只能在外面等待,只有当解锁之后,其他人才能同样再去加锁。

# 3.3 死锁的解决方案

当加锁之后由于宕机的问题没法解锁时,其他人就只能一直等待了。为了解决这个方案,我们可以为锁设置时间限定,如果时间到了还没释放锁,就由系统删除这把锁:

expire lock-key second
pexpire lock-key milliseconds
1
2

由于操作通常是毫秒或者微秒级别的,所以锁时间不能设置太长。在实际的开发过程中,我们会在设置分布式锁的同时给他添加生命周期。

上次更新: 2025/04/29, 17:22:06
redis的持久化看这一篇就够了
redis高级数据类型详解

← redis的持久化看这一篇就够了 redis高级数据类型详解→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式