redis事务简介
是我看了刘建宏的《redis设计与实现》自己的见解,不会很详细,只是总结。
什么是redis事务?是一种将多个命令收集入队并按顺序执行的机制。也就是说redis服务器在启动事务模式后(redis>>MULTI )会将后续输入的多个命令如set a '123' 他会返回QUEUED,是指该命令已经在队列中,执行EXEC命令后,服务器按先进先出的原则执行命令队列。
讲讲“ACID",redis事务的四个性质。
redis事务的原子性,即:redis事务队列要么一起执行,要么一个也不执行。在执行MULTI命令前,可以执行一个WATCH命令,WATCH命令用来监视某个数据库键,(WATCH一个数据库键可以认为是某客户端监视了这个数据库键的情况,也可以WATCH多个键)当该客户端发送的事务在服务器受处理的过程中,如果有其他命令更改了这个客户端监视的键的内容,那么服务器将不处理该客户端的事务,并返回空回复(nil)。举个例子:服务器执行A客户端的事务,而A客户端监视了键“country",那么在数据库watched_keys字典中记录下键与A客户端,表示被监视与监视的关系(redis监视机制),当A向服务器开始了事务(还没有执行事务 EXEC),此时B客户端也向服务器提交命令(注意不是事务,是命令)修改”country“的内容,在执行例如SET、LPUSH、SADD、DEL、FLUSHDB等命令时,redis服务器会通过touch_watch_key函数检索watched_keys字典中是否有该键,如果有,那么将监视他的所有客户端的REDIS_DIRTY_CAS标识打开,那么服务器在检测到客户端的脏标识后,会拒绝执行该客户端的事务。
redis事务的一致性,这个比较简单,就是不管在事务执行前还是执行后,数据库都保持一致,和谁保持一致?不是和谁,而是指数据库中的数据保持一致,即数据符合数据库本身的规定和要求,没有错误和非法数据。可能出现的错误有:1.开始事务后的非法命令,即redis没有的命令。2.redis有的命令但程序员本身使用错误,比如用string来保存一个hash键值对。3.服务器停机,无论是在RDB是AOF持久化机制下,都不影响一致性,两种数据恢复机制,此处内容过多不详细讲。
redis事务的隔离性,即服务器只单线程,处理一个事务时阻塞其他事务,等到处理好这个事务后再处理下一个(串行的处理事务)。
redis事务的耐久性,即当服务器停机,内容是否保存到了硬盘中,只有AOF持久化和appendfsync配置中为always,那么才是真正实现了耐久性。
这就是redis事务的总结。