Redis教程
Redis学习笔记——Redis事务__锁机制
本文主要是介绍Redis学习笔记——Redis事务__锁机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
七、Redis事务__锁机制
1、Redis事务的定义
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
2、
Multi、Exec、discard
从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。
组队的过程中可以通过discard来放弃组队。
案例
组队成功,提交成功
组队阶段报错,提交失败
组队成功,提交有成功有失败情况
3、事务的错误处理
组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。
如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。
4、事务冲突的问题
例子
一个请求想给金额减8000
一个请求想给金额减5000
一个请求想给金额减1000
悲观锁
悲观锁(Pessimistic Lock)
, 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。
传统的关系型数据库里边就用到了很多这种锁机制
,比如
行锁
,
表锁
等,
读锁
,
写锁
等,都是在做操作之前先上锁。
乐观锁
乐观锁(Optimistic Lock),
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
乐观锁适用于多读的应用类型,这样可以提高吞吐量
。Redis就是利用这种check-and-set机制实现事务的。
WATCH key [key …]
在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务
执行之前这个(或这些) key被其他命令所改动,那么事务将被打断。
unwatch
取消 WATCH 命令对所有 key 的监视。
如果在执行 WATCH 命令之后,EXEC 命令或DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了。
5、事务的三大特性
单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
6、
Redis分布式锁
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
如果在setnx之后执行expire之前进程意外crash或者要重启维护了
设置过期时间和占位必须是原子的。redis支持使用setnx ex 命令
如果由于业务时间很长,锁自己过期了,我们 直接删除,有可能把别人正在持有的锁删除了。
占锁的时候,值指定为uuid,每个人匹配是自己 的锁才删除。
如果正好判断是当前值,正要删除锁的时候,锁已经过期, 别人已经设置到了新的值。那么我们删除的是别人的锁
删除锁必须保证原子性。使用redis+Lua脚本完成
如果业务时间比锁的时间长
edisson 锁的自动续期,如果宕机没有自动续期30s就解锁,也可指定时间解锁但不会自动续期,所以自动解锁时间一定要大于业务时间,差别在于底层的tryAcquire,
如果指定了超时时间,就会发送lua脚本给redis执行,进行占锁过期时间是我们指定的时候。
如果为指定超时时间,就使用看门狗的默认时间30s,只要占锁成功就会启动一个定时任务(重新给锁设置过期时间,新的过期时间是看门狗的默认时间),每隔看门狗的1/3时间就会重新设置
这篇关于Redis学习笔记——Redis事务__锁机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
您可能喜欢
阿里云Redis项目实战入门教程
11-08
阿里云Redis资料:新手入门与初级使用指南
11-08
阿里云Redis教程:新手入门及实用指南
11-08
阿里云Redis学习入门:新手必读指南
11-07
阿里云Redis学习入门:从零开始的操作指南
11-07
阿里云Redis学习:初学者指南
11-07
阿里云Redis入门教程:轻松搭建与使用指南
11-06
Redis项目实战:新手入门教程
11-02
Redis入门教程:轻松掌握数据存储与操作
10-22
Redis缓存入门教程:快速掌握Redis缓存基础知识
10-22
Redis入门指南:轻松掌握Redis基础操作
10-22
Redis Quicklist 竟让内存占用狂降50%?
10-22
Redis学习:从入门到初级应用教程
10-17
Redis入门:新手必读教程
10-12
阿里云Redis项目实战:新手入门教程
09-26
栏目导航
前端开发
HTML5教程
CSS教程
Javascript
jQuery教程
AJAX教程
Node.js教程
XML教程
正则表达式
后端开发
Go教程
C/C++教程
消息队列MQ
Net Core教程
Asp.net教程
Java教程
PHP教程
移动端开发
微信公众号开发
小程序开发
Swift教程
IOS教程
Kotlin教程
Android开发
数据库
Redis教程
MongoDB教程
PostgreSQL教程
Oracle教程
MariaDB教程
SqLite教程
MySql教程
SqlServer教程
服务器运维
Kubernetes
Docker容器
linux shell
Nginx教程
网站安全
PowerShell教程
Linux教程
人工智能
TensorFlow教程
Python教程
机器学习
人工智能学习
区块链
区块链技术
游戏开发
游戏编程
Unity3D教程
网站运营
网站策划
网站优化
建站知识
大数据/云计算
云计算
Hadoop教程
软件工程
软件/开发工具使用
Git教程
资讯