JChehe / blog

🌈 原创&翻译 🌈
717 stars 111 forks source link

Redis 知识积累 #48

Open JChehe opened 3 years ago

JChehe commented 3 years ago

读书笔记

书本以外的知识点(不断积累):

  1. Redis 的单线程特性是指执行命令的线程,从任意个客户端接收到的命令都会被一个接一个执行。而事务(MULTI 和 EXEC)则会在 Redis 接收到 EXEC 命令时,将存储在事务队列的命令依次执行,执行期间不会被其他客户端的命令插入打断,即 Redis 事务是原子性的。
  2. MULTI 和 EXEC 组成的事务在执行时不会被其他客户端打断,决解了“竞争条件”的问题。而 WATCH 命令则保证了:在任意个客户端连接的情况下,WATCH 到 EXEC 的整个代码逻辑(事务只是其中一部分)在执行期间数据的正确性(被 watch 的键未被改动)。
  3. Redis 的原子性操作:

    a. 把多个操作在 Redis 中实现成一个操作,即单命令操作; b. 事务(Redis 更推荐 Lua,并在开发者都使用 Lua 脚本替代事务时,删除事务)。 c. 把多个操作写到一个 Lua 脚本中,以原子性方式执行单个 Lua 脚本。

参考资料:

  1. Redis 官网的《Transactions》
  2. 极客时间的《29 | 无锁的原子操作:Redis如何应对并发访问?》
  3. Stack Overflow 的《Redis WATCH MULTI EXEC by one client》