作家
登录

Redis缓存技术学习系列之事务处理

作者: 来源: 2017-04-10 15:35:08 阅读 我要评论

  • 事务是由一系列操作构成的单个逻辑工作履行单位。特别地,因为在Redis中敕令是存储在一个队列中,所以,事务中的所有敕令都邑按次序履行,并且在履行事务的过程中不会被客户端发送的其它敕令中断。
  • 事务是一个原子操作,事物中的敕令只有两种履行结不雅,即全部履行或者全部不履行。如不雅客户端在应用MULTI敕令开启事务后因为不测而没有履行EXEC敕令,则事务中的所有敕令都不会履行。同理,如不雅客户端在应用MULTI敕令开启事务后履行EXEC敕令,则事务中的所有敕令都邑履行。
  • Redis中的事务可以应用DISCARD敕令来清空一个敕令队列,并放弃对事务的履行。如不雅敕令在入队时产生缺点,Redis将在客户端调用EXEC敕令时拒绝履行并撤消事务,然则在EXEC敕令履行后产生的缺点,Redis将选择主动忽视。
  1. WATCH Record_Count 
  2. val = GET Record_Count 
  3. val = val + 1 
  4. MULTI 
  5. SET Record_Count $val 
  6. EXEC 

在这个例子中,我们测验测验在事务中对Record_Count做一个自增操作,这段代码在非并发的情况下是没有问题的,可是在并发的情况下,如不雅在履行EXEC敕令前有一个用户修改了Record_Count的值,那么我们此时的结不雅就会比期望的结不雅小1,如今我们有了WATCH,Redis就会对Record_Count进行监听,当Redis监听到该值产生变更的时刻,这个事务就会被主动撤消,进而避免造成冲突。

若何治理Redis的键

​ 其实大年夜切题的角度来讲,这篇博客根本上说清跋扈了事务处理问题,是以这篇博客固然没有给大年夜家带来若干惊喜,却依然可以异常适可而止的结题,可是因为之前有同伙在博客中留言并问到Redis的键治理的问题,所以博主决定在这里简单的评论辩论下这个问题,鉴于博主和大年夜家一样都是感刚接触Redis,所以下面的不雅点仅仅是一家之言,如不雅有疑问可以在博客中留言,迎接大年夜家批驳斧正。我认为Redis中的键的治理,根本上有两种策略,即惰性删除和按期删除,而实际上这恰是Redis默认的键删除策略:

redis应用 惰性删除 和 按期删除 两种策略来删除过时的键:惰性删除策略在碰着过时键时方进行删除操作,按期删除策略则每隔一段时光主动查找并删除过时键。

所以,基于这两种键删除策略,我们可以想到的做法有:

  • 对于临时变量可以采取临时键来存储,在数据库全局设定一个过不时光,由Redis在键过时后主动删除。
  • 对于持久化数据可以采取通俗键来存储,经由过程办事器和客户端间定义协定来竽暌股客户端主动删除键。
  • 对于不合模块中的键采取同一规范的定名规矩来定名键,大年夜而解决Redis中键治理纷乱的问题。

平日来讲,乐不雅锁合适在写冲突相对较少的场合下,消极锁合适在写冲突相对较多的场合下。Redis中供给了一种称为check-and-set的机制,该机制重要经由过程WATCH敕令来实现,其道理恰是基于乐不雅锁的策略,Redis会在履行EXEC敕令前检查被监督的键对应的值是否产生变更,如不雅该值产生变更注解有人修悛改┞封个键中存储的值,此时Redis将会主动撤消当前事务。我们来看这个简单的例子:

设计合理的键收受接收机制,避免Redis应用跨越95%以上的内存,或者经由过程设置Redis中的最大年夜内存容量及其内存策略来主动触发Redis对键的镌汰。

好了,这篇文┞仿就是如许了,欲望大年夜家爱好,下篇见!

我们知道,常见的并发控制筹划重要有消极锁和乐不雅锁两种筹划,这里起首来解释锫这两种概念。所谓消极锁,顾名思义是一种消极的策略,消极锁认为:在对任何记录做修改前都应当加锁,如不雅加锁掉败则注解该机录正在被修改,此时应当抛出异常;如不雅加锁成功则修改记录并在事务完成后解锁;如不雅有其它人修改则应当等待当前修改解锁或者是抛出异常。而所谓乐不雅锁,顾名思义是一种乐不雅的策略,乐不雅锁认为:每次大年夜记录中查找数据别人都不会修改,是以这个过程中不须要加锁,然则在更新记录的时刻,会经由过程版本号来断定别人是否修悛改当前记录。

【编辑推荐】

  1. C#客户端Redis办事器的分布式缓存
  2. 十个精确应用 Redis 的技能
  3. Redis整合Spring结合应用缓存实例
  4. 如安在Go说话中应用Redis连接池
  5. signalR+redis分布式聊天办事器搭建
【义务编辑:51CTO_OS TEL:(010)68476606】

  推荐阅读

  Go语言HTTP Server源码分析

func (mux *ServeMux) ServeHTTP (w ResponseWriter, r *Request) { if r.RequestURI == "*" { if r.ProtoAtLeast(1, 1) { w.Header().Set("Connection", "close") } w.WriteHea>>>详细阅读


本文标题:Redis缓存技术学习系列之事务处理

地址:http://www.17bianji.com/lsqh/34686.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)