流水线

流水线特性允许客户端把任意多条redis命令请求打包在一起,等待服务器将请求完全处理后,一次性将执行结果返回客户端(即批处理思想)

注意事项:

  • redis服务器为每个客户段设置的输入缓冲区设置默认值为1GB上限(待验证),超过这个值,服务器将会强行关闭该客户端

事务

redis事务特性:

  • 将多个redis命令打包成一个事务,当事务成功执行,意味这其中所有的命令执行成功
  • 如果事务没有执行成功,那么它包含的所有命令都不会被执行
  • 事务的安全性
    • redis事务总是具有 ACID 中的 ACI 性质
      • 原子性A:事务中的所有命令要么都执行,要么都不执行
      • 一致性C:确保逻辑一致
      • 隔离性I:每个Redis事务独立执行,不同事务之间不会互相干扰
    • 当redis运行在特定的持久化模式下,redis事务也具有持久性D,当事务执行完毕时,它的结果将被存储在硬盘中
  • 实践:避免在事务中执行过多命令或执行大量计算,以免造成服务器阻塞

使用multiexec开启一次事务

1
2
3
4
multi
set test1 "1"
set test2 2 
exec 

按顺序返回事务中所有命令的返回值

exec替换成discard,将丢次此次事务

流水线与事务

很多redis客户端都会使用流水线去包裹事务命令,等到用户输入 exec 命令后,再将所有事务命令通过流水线一并发送至服务器

watch:对键进行监听

客户端要求服务器对一个或多个键进行监听,如果在客户端尝试执行事务之前,这些键值发生变化,那么服务器将拒绝执行客户端发送的事务,并返回一个空值:

1
watch key [key ...]

watch + multi 实现事务

使用watch + multi, 确保事务只会在被监视键没有发生任何变化的情况下执行,从而保证事务对被监听键的所有修改都是安全的、正确的、有效的

unwatch:取消对键的监听