Redis学习笔记:事务

马谦马谦马谦
马谦马谦马谦
马谦马谦马谦
615
文章
12
评论
2017年11月30日21:27:34 评论

一、事务的描述

MySQL一样,Redis中也有事务这一个概念,redis中的事务也是可以用来执行一组命令的集合,同时也可以把事务当作一个命令。因为它的特性和命令无差,要么正确全部运行,要么错误都不运行。但是和MySQL的事务不同的是,redis中的事务不支持回滚操作。也就是说,一旦事务出错,它没有办法再回到程序出错前,只能由程序员自己想办法来处理剩下的烂摊子。

二、使用事务

redis中使用事务需要用到MULTIEXEC命令:在一个事务开始前输入MULTI,然后执行我们的命令,最后使用EXEC提交,只有执行EXEC后,事务才会被提交,命令才会生效,例如:

当我们使用MULTI命令后,接下来的所有命令都会被redis放到一个事务队列当中去,直到输入EXEC后redis才会把这些命令依次都提交,并根据顺序依次返回结果。

三、错误处理

事务对错误的处理分为以下两种情况:

3.1 语法错误

如果命令出现语法错误,例如命令输入错误或者参数个数错误,这种情况下redis会直接返回错误,并且事务中所有的语句都不会被执行:

3.2 运行错误

运行错误是指在redis运行时才能发现的错误,例如用散列的命令操作字符串等等,这种情况下redis会执行正确的命令并返回错误的命令:

由于redis时没有提供类似Rollback的功能,所以出现这种错误的时候我们只能自己想办法来弥补这个错误。同时这也就要求程序员在进行redis操作时严谨一些,尽量避免此类错误。

四、WATCH

和关系型数据库不同的是,MySQLOracle在执行事务的时候会对事务操作的数据加锁,其他的的客户端在事务执行完毕之前都无法对数据进行更改。而redis执行事务时却不同,它并不能阻止其他客户端修改事务中要处理的数据,这个时候就需要用到WATCH命令。WATCH命令可以用来监控一个键,一旦它监控的键发生了更改,它之后的事务就不会被执行:

这里由于在MUTLI之前运行更改了key的值为2,所以事务中的语句set key 3不会被执行。

在执行WATCH后如果想取消监控可以使用UNWATCH命令,或者等到下次执行EXEC命令自动取消监控。

马谦马谦马谦
  • 本文由 发表于 2017年11月30日21:27:34
  • 转载请务必保留本文链接:https://www.dyxmq.cn/databases/redis/redis-transaction-watch-multi.html
redis源码分析:链表实现 Redis

redis源码分析:链表实现

一、链表定义 链表在redis中的使用十分广泛,例如列表的底层实现之一就是链表,包括发布、订阅等等功能都是有用到链表的。redis中链表在adlist.h和adlist.c中实现,只用了300+行代码...
redis中的发布和订阅 Redis

redis中的发布和订阅

一、发布和订阅 除了任务队列以外,redis还有一种基于“发布/订阅”模式的消息传递,使得客户端可以订阅某个频道,当频道有消息产生时,会把消息传递到所有的订阅者。和列表不一样的是,发布和订阅可以是一对...
Redis小案例(二):redis实现消息队列 Redis

Redis小案例(二):redis实现消息队列

一、任务队列概述 消息队列,顾名思义就是一个用来传递任务的队列。消息队列在开发中十分常见,经常用在页面后台处理需要很长时间的操作时,例如发送邮件、短信以及进行复杂数据运算操作等,这些操作通常会阻塞页面...
Redis小案例(一):实现网站访问频率限制 Redis

Redis小案例(一):实现网站访问频率限制

网站中经常需要用到网站限流,例如限制用户恶意爬虫获取网页信息以及在网站访问流量大时限制访问频率等等,这里使用redis做一个简单的网站登录限制案例。 一、使用EXPIRE进行访问频率限制 逻辑:用户登...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: