Redis学习笔记(七)进阶之事务

来源:互联网 发布:java多线程线程池实现 编辑:程序博客网 时间:2024/06/08 10:05

1、事务

Redis中的事务(transaction)是一组命令的集合。事务和命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。

事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令。

如:

redis>MULTI

ok

redis>SADD "user:1:following" 2

QUEUED

redis>SADD "user:2:followers" 1

QUEUED

redis>EXEC

  1. (integer) 1
  2. (integer) 1

 

错误处理:

1)语法错误

redis> MULTI

OK

redis>SET key value

QUEUED

redis>SET key

(error)ERR wrong number of arguments for 'set' command

redis>ERRORCOMMAND key

(error)ERR unkown command 'ERRORCOMMAND'

redis>EXEC

(error)EXECABORT Transaction discarded because of previous errors.

 

2)运行错误

redis>MULTI

OK

redis> SET key 1

QUEUED

redis> SADD key 2

QUEUED

redis> SET key 3

QUEUED

redis> EXEC

  1. OK
  2. (error) ERR Operation against a key holding the wrong kind of value
  3. OK

redis> GET key

"3"

 

Redis的事务没有回滚(rollback)功能。为此开发者必须在事务执行出错后自己收拾剩下的摊子。

 

WATCH命令

WATCH命令可以监控一个或多个键,一旦其中又一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令。

redis> SET key 1

OK

redis>WATCH key

OK

redis>SET key 2

OK

redis>MULTI

OK

redis>SET key 3

QUEUED

redis>EXEC

(nil)

redis> GET key

"2"

 

自己实现incr函数:

defincr($key)

WATCH $key

$value = GET $key

if not $value

$value = 0

$value = $value + 1

MULTI

SET $key $value

result = EXEC

return result[0]

EXEC命令返回值是多行字符串类型

执行EXEC命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用UNWATCH命令来取消监控。

defhsetxx($key, $field, $value)

WATCH $key

$isFieldExists = HEXISTS $key,$filed

if $isFieldExists is 1

MULTI

HSET $key, $field, $value

EXEC

else

UNWATCH

return $isFieldExists

使用UNWATCH命令来保证下一个事务的执行不会受到影响。




0 0