吃透了这些Redis知识点,面试官一定觉得你很NB
redis的事务可以分为两步,定义事务和执行事务。使用multi命令开启一个事务,然后把要执行的所有命令都依次排上去。这就定义好了一个事务。此时使用exec命令来执行这个事务,或使用discard命令来放弃这个事务。 你可能希望在你的事务开始前,你关心的key不想被别人操作,那么可以使用watch命令来监视这些key,如果开始执行前这些key被其它命令操作了则会取消事务的。也可以使用unwatch命令来取消对这些key的监视。 redis事务具有以下特点: 1、如果开始执行事务前出错,则所有命令都不执行 2、一旦开始,则保证所有命令一次性按顺序执行完而不被打断 3、如果执行过程中遇到错误,会继续执行下去,不会停止的 4、对于执行过程中遇到错误,是不会进行回滚的 看完这些,真想问一句话,你这能叫事务吗?很显然,这并不是我们通常认为的事务,因为它连原子性都保证不了。保证不了原子性是因为redis不支持回滚,不过它也给出了不支持的理由。 不支持回滚的理由: 1、redis认为,失败都是由命令使用不当造成 2、redis这样做,是为了保持内部实现简单快速 3、redis还认为,回滚并不能解决所有问题 哈哈,这就是霸王条款,因此,好像使用redis事务的不太多 管道 客户端和集群的交互过程是串行化阻塞式的,即客户端发送了一个命令后必须等到响应回来后才能发第二个命令,这一来一回就是一个往返时间。如果你有很多的命令,都这样一个一个的来进行,会变得很慢。 redis提供了一种管道技术,可以让客户端一次发送多个命令,期间不需要等待服务器端的响应,等所有的命令都发完了,再依次接收这些命令的全部响应。这就极大地节省了许多时间,提升了效率。 聪明的你是不是意识到了另外一个问题,多个命令就是多个key啊,这不就是上面提到的多key操作嘛,那么问题来了,你如何保证这多个key都是同一个节点上的啊,哈哈,redis集群又放弃了对管道的支持。 不过可以在客户端模拟实现,就是使用多个连接往多个节点同时发送命令,然后等待所有的节点都返回了响应,再把它们按照发送命令的顺序整理好,返回给用户代码。哎呀,好麻烦呀。 协议 简单了解下redis的协议,知道redis的数据传输格式。 发送请求的协议: *参数个数CRLF$参数1的字节数CRLF参数1的数据CRLF...$参数N的字节数CRLF参数N的数据CRLF 例如,SET name lixinjie,实际发送的数据是: *3rn$3rnSETrn$4rnnamern$8rnlixinjiern 接受响应的协议: 单行回复,第一个字节是+ 错误消息,第一个字节是- 整型数字,第一个字节是: 批量回复,第一个字节是$ 多个批量回复,第一个字节是* 例如, +OKrn -ERR Operation againstrn :1000rn $6rnfoobarrn *2rn$3rnfoorn$3rnbarrn 可见redis的协议设计的非常简单。 【责任编辑:庞桂玉 TEL:(010)68476606】点赞 0 (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |