首页 > 编程知识 正文

基于 Redis 实现 CAS 操作,基于python的理论与实现

时间:2023-05-05 22:09:14 阅读:186780 作者:947

基于Redis实现CAS操作Intro在. NET上同时运行时,我们可以使用Interlocked.CompareExchange实现CAS(compareandswap )操作。 在分布式方案中经常使用Redis。 最近,在更改前做的一个小信件游戏项目。 以前它是独立运行的,但有些数据存储是基于内存的,直接基于对象进行操作。 最近改为支持分布式,并引入了redis。 原本基于内存的数据会迁移到redis。 原始代码中的某些部分使用Interlocked.CompareExchange实现CAS操作,并在迁移到redis后需要类似的功能

CASCAS(compareandswap )通常可用于在并发操作中更新一个对象的值。 CAS是无锁操作,CAS相当于乐观锁,直接锁相当于悲观锁,因此CAS操作比直接锁相对高效。 (——人的理解)

Redis Lua redis从2.6.0版开始支持Lua脚本,由于Lua脚本的执行是原子的,所以在实现基于redis的分布式解锁锁时,或者实现后述的CAS操作时,要执行多个操作

基于Redis Lua的cas字符串cas Lua脚本:的实现

KEYS[1]对应于要操作的String类型的redis高速缓存的key,ARGV[1]对应于要比较的值,如果值相同,则更新为ARGV[2]并返回1,否则返回0

ifredis.call('get ',KEYS[1] )==argv[1]thenredis.call('set ',KEYS[1],ARGV[2] ) return1eeer

KEYS[1]对应于要操作的散列类型的redis高速缓存的key,ARGV[1]对应于散列的字段,ARGV[2]对应于要比较的值,如果值相同,则更新为ARGV[3]并返回1

ifredis.call('hget ',KEYS[1],ARGV[1] )=argv[2]thenredis.call ) ' hset ',KEYS[1],argv )。

publicstaticboolstringcompareandexchange (thisidatabasedb,RedisKey key,RedisValue newValue, redisvalueoriginvalue (return (int ) db.scriptevaluate ) stringcasluascript,new({key},new ) {originvalue, } publicstaticasynctaskboolstringcompareandexchangeasync (thisidatabasedb,RedisKey key,RedisValue newValue, redisvalueoriginvalue (returnawaitdb.scriptevaluateasync (stringcasluascript,new({key},new ) ) {Originvalue,new } publicstaticboolhashcompareandexchange (thisidatabasedb,RedisKey key,RedisValue field,RedisValue newValue, redisvalueoriginvalue (return (int ) db.scriptevaluate ) HashCasluascript,new({key},new ) ) {field, origin value } publicstaticasynctaskboolhashcompareandexchangeasync (thisidatabasedb,RedisKey key,RedisValue field, redis value new value redisvalueoriginvalue (returnawaitdb.scriptevaluateasync ) HashCasluascript,new({key},new ) {field

[ fact ] publicvoidstringcompareandexchangetest () (varkey=' test : string : cas ); var redis=dependency resolver.current.getrequiredserviceiconnectionmultiplexer (.get database ); redis.stringset(key,1 ); //sett O3 if nowi S2 assert.false (redis.stringcompareandexchange ) key,3,2 ); assert.equal(1,redis.stringget ) key ); //setto4if nowi S1 assert.true (redis.stringcompareandexchange ) key,4,1 ); assert.equal(4,redis.stringget ) key ); redis.keydelete(key; } [ fact ] publicvoidhashcompareandexchangetest () { var key='test:Hash:cas ); var field='testField '; var redis=dependency resolver.current.getrequiredserviceiconnectionmultiplexer (.get database ); redis.Hashset(key,field,1 ); //sett O3 if nowi S2 assert.false (redis.hashcompareandexchange (key,field,3,2 ) ); assert.equal(1,redis.hashget ) key,field ); //setto4if nowi S1 assert.true (redis.hashcompareandexchange (key,field,4,1 ) ); assert.equal(4,redis.hashget ) key,field ); redis.keydelete(key; } references https://redis.io/commands/eval

3359 redis book.readthedocs.io/en/latest/feature/scripting.html

3359 github.com/weihan Li/weihan Li.redis/blob/dev/src/weihan Li.redis/redis extensions.cs

3359 github.com/weihan Li/weihan Li.redis/blob/dev/test/weihan Li.redis.unittest/redisextensionstest.cs

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。