一、事务概述
Redis事务是一组命令的集合。事务同命令一样是Redis的最小执行单位,要么执行,要么不执行。
事务的原理是先将属于一个事务的命令发送给Redis,然后在让Redis依次执行这些命令。

Redis在事务中没有立即执行sadd操作,而是返回QUEUED表示这两条命令已经进入等待执行的事务队列中了。<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+yrnTw0VYRUPD/MHuuObL31JlZGlzvau1yLT91rTQ0LXEysLO8bbTwdDW0LXEy/nT0MP8we6wtNXVt6LLzcuz0PLSwLTO1rTQ0KGjPC9wPgo8cD5FWEVDt7W72CYjMjA1NDA7vs3Kx9Xi0KnD/MHutcS3tbvYJiMyMDU0MDvX6bPJtcTB0LHto6y3tbvYJiMyMDU0MDvLs9Dyus3D/MHutcTLs9Dyz+DNrKGjPC9wPgoKPHA+UmVkaXOxo9ak0ru49srCzvHW0LXEy/nT0MP8we7SqsO0trzWtNDQo6zSqsO0tryyu9a00NCho8jnufvU2reiy81FWEVDw/zB7sewv827p7bLts/P38HLo6zU8lJlZGlzu+HH5b/VysLO8bbTwdCjrMrCzvHW0LXEy/nT0MP8we62vLK7u+HWtNDQoaO2+NK7tam/zbuntsu3osvNwctFWEVDw/zB7qOsy/nT0LXEw/zB7r7Ntry74da00NCjrLy0yrm0y7rzv827p7bLts/P39Kyw7vT0LnYz7WjrNLyzqpSZWRpc9bQ0tG+rbzHwrzBy8v509DSqta00NC1xMP8we6hozwvcD4KCjxwPlJlZGlztcTKws7xu7nE3LGj1qTSu7j2ysLO8cTatcTD/MHu0sC0zta00NC2+LK7sbvG5Mv7w/zB7rLlyOuhozwvcD4KPHA+PHN0cm9uZz48YnI+Cjwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz62/qGitO3O87SmwO08L3N0cm9uZz48L3A+CjxwPsrCzvHW0LXExLO49sP8we7WtNDQs/a07aOs1PXDtLDso788L3A+CjxwPqOoMaOp0++3qLTtzvOjrNa4w/zB7rK7tObU2rvy1d/D/MHuss7K/bXEuPbK/bK7ttShozwvcD4KPHA+PGltZyBzcmM9"https://www.cppentry.com/upload_files/article/57/1_dt8ap__.png" alt="\">
3个命令,一个正确,两个错误,而只要有一个命令有语法错误,执行EXEC命令后Redis就会直接返回错误,连语法正确的命令也不会执行。
(2)运行错误,指命令执行时出现的错误,比如使用散列类型的命令操作集合类型的键。在执行以前Redis无法发现,所以在事务中这样的命令会被接受并执行,
一条命令出现了运行错误,事务里其他的命令依然会继续执行。

虽然sadd key 2出现了错误,但是set key 3依然执行了。
Redis事务没有回滚功能。
Redis不支持回滚功能,也使得Redis在事务上可以保持简洁和快速。两种错误,语法错误和运行错误完全可以在开发时找出并解决。
三、watch命令
事务中每个命令的执行结果都是最后一期返回的,无法将前一条命令的结果作为下一条命令的参数。
比如说get值,+1,再set
为了解决这个问题,在get获得键值后保证该键值不被其他客户端修改,直到函数执行完成后才允许其他客户端修改该键值。可以防止竞态条件。

执行watch命令后,事务执行前修改了key的值,set key 2,所以最后事务中的命令set key 3没有执行,EXEC命令返回空结果。
由于watch命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行,而不能保证其他客户端不修改这一键值,所以我们需要在EXEC执行失败后重新执行整个函数。
执行EXEC后会取消所有键的监控,也可以用unwatch命令来取消监控。
四、生存时间
使用expire命令设置一个键的生存时间,到时候后redis会自动删除它。
如果想让session:29e3d键在15分钟后被删除

返回1表示成功,0表示键不存在或者设置失败。

一个键还有多久时间被删除,可以用ttl命令,返回值是键的剩余时间(单位s)

当键不存在时ttl返回-1.同样会返回-1是没有为键设置生存时间(永久存在)。
想取消生存时间设置,即恢复永久,用persist命令。成功1,失败0

除次之外,还可以set或getset命令为键赋值也会同时清除键的生存时间。

使用expire会重新设置键的生存时间。

其他只对键值进行操作的命令(incr、lpush、hset、zrem)都不会影响键的生存时间。
expire命令时间参数必须是整数,s。更精确,使用pexpire,单位是毫秒。对应可以用pttl返回剩余时间。
如果watch命令监测了一个拥有生存时间的键,该键时间到期后自动删除并不会被watch命令认为该键被改变。
另外两个命令
expireat和pexpireat,与前面差别使用unix时间作为时间参数。expireat单位是秒,pexpireat单位是毫秒。