事务
1.定义:
一组命令的集合。一个事务中的命令要么都执行,要么都不执行。
2.事务的实现
- 事务开始
- 命令入队
- 事务执行
例:
Multi //通知redis进入事务
sadd “user:1:following”2
sadd “user:2:followers”1
exec //结束事务
3.错误处理
(1) 语法错误(入队错误):命令不存在或者命令参数的个数不对(不会执行语法正确的指令)
(2) 运行错误(执行错误):命令执行时出现的错误(其它命令依然会继续执行)
注:exec命令会取消对所有键的监控,还可以用unwatch命令来取消监控,而取消事务的命令为 Discard
4.乐观锁复杂事务控制(类似于版本控制器)
(1)乐观锁:大多数是基于数据版本的记录机制实现的,即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个version字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1,此时,将提交数据的版本号与数据库表对应记录的当前版本号进行对比,如果提交的数据版本号大于数据库当前的版本号,则予以更新,否则认为是过期数据。
(2)watch命令可以监控一个或者多个键,一旦有一个键被修改或删除,之后的事务就不会执行。其中exec / discard / unwatch命令会清除连接中的所有监视。
- 通过watched_keys字典,可以知道哪些数据库键在被监视
- 若被监视的键被修改,则REDIS_DIRTY_CAS标识被打开。
例:age在被监视后,不会被修改。
5.事务的ACID性质
(1)原子性(atomicity)
数据库将事务中的多个操作当作一个整体来执行,服务器要么就执行事务中的所有操作,要么就一个操作也不执行。
注:Redis的事务不支持回滚机制
(2)一致性(consistency)
一致:指没有包含非法或者无效的错误数据
数据库在执行事务之前是一致的,在执行事务之后,无论事务是否执行成功,数据库也应该是一致的。
Redis通过谨慎的错误检测和简单的设计来保证事务的一致性。分别是入队错误、执行错误、服务器宕机。
(3)隔离性(isolation)
当数据库有多个事务并发的执行,各个事务之间也不会互相影响,在并发的状态下执行事务和串行执行的事务产生的结果完全相同
(4)持久性(durability)
当一个事务执行完毕时,执行这个事务所得的结果已经被保存到永久性存储介质(例如硬盘)中,即使服务器在执行事务完毕之后宕机,执行事务的结果也不会丢失。
Redis的持久性由持久化模式来决定,只有AOF下的appendfsync选项为always时,才是支持持久性的
6.队列
- 使用任务队列的好处
①松耦合
生产者和消费者无需知道彼此的实现细节,只需要约定好任务的描述格式,这使得生产者和消费者可以由不同的团队使用不同的编程语言编写
②易于扩展
消费者可以有多个,而且可以分布在不同的服务器中借此可以轻易的降低单台服务器的负载
事件
事件分为文件事件和时间事件
1.文件事件
(1)定义
Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。
文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器
当被监听的套接字准备好执行连接应答、读取、写入、关闭等操作时,与操作相对应的事件就会产生,这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。
(2)文件处理器的构成
文件事件处理器由套接字、I/O多路复用程序、文件事件分派器(dispatcher)、事件处理器
(3)CS通信示例
2.时间事件
(1)分类
定时事件:让一段程序在指定的时间之后执行一次。
周期性事件:让一段程序每隔指定时间就执行一次。
(3)属性
- id:服务器为时间事件创建的全局唯一ID
- when:毫秒精度的Unix时间戳,记录了时间事件到达时间
- timeProc:一个时间事件处理器函数,当时间事件到达时调用。
(4)serverCron函数
时间事件应用的实例:serverCron函数,定期对自身的资源和状态进行检查
本人才疏学浅,若有错,请指出,谢谢!
参考书籍:《Redis设计与实现(第二版)》—黄健宏