当前位置: 首页 > news >正文

深圳商城网站开发七冶建设集团网站

深圳商城网站开发,七冶建设集团网站,修改wordpress后台,小说网站防盗做的好处基于 Redis 实现 CAS 操作Intro在 .NET 里并发情况下我们可以使用 Interlocked.CompareExchange 来实现 CAS #xff08;Compare And Swap#xff09; 操作#xff0c;在分布式的情景下很多时候我们都会使用 Redis #xff0c;最近在改之前做的一个微信小游戏项目#xff… 基于 Redis 实现 CAS 操作Intro在 .NET 里并发情况下我们可以使用 Interlocked.CompareExchange 来实现 CAS Compare And Swap 操作在分布式的情景下很多时候我们都会使用 Redis 最近在改之前做的一个微信小游戏项目之前是单机运行的有些数据存储是基于内存的直接基于对象操作的最近要改成支持分布式的于是引入了 redis原本基于内存的数据就要迁移到 redis 中存储原来的代码里有一些地方使用了 Interlocked.CompareExchange 来实现 CAS 操作迁移到 redis 中之后也需要类似的功能于是就想基于 redis 实现 CAS 操作。CASCAS (Compare And Swap) 通常可以使用在并发操作中更新某一个对象的值CAS 是无锁操作CAS 相当于是一种乐观锁而直接加锁相当于是悲观锁所以相对来说 CAS 操作 是会比直接加锁更加高效的。——个人理解Redis Luaredis 从 2.6.0 版本开始支持 Lua 脚本Lua 脚本的执行是原子性的所以我们在实现基于 redis 的分布式锁释放锁的时候或者下面要介绍的实现CAS 操作的要执行多个操作但是希望操作是原子操作的时候就可以借助 Lua 脚本来实现也可以使用事务来做基于 Redis Lua 实现 CASString CAS Lua Script:KEYS[1] 对应要操作的String 类型的 redis 缓存的 keyARGV[1]对应要比较的值值相同则更新成 ARGV[2]并返回 1否则返回 0if redis.call(get, KEYS[1]) ARGV[1] thenredis.call(set, KEYS[1], ARGV[2])return 1 elsereturn 0 end Hash CAS Lua Script:KEYS[1] 对应要操作的 Hash 类型的 redis 缓存的 keyARGV[1] 对应 Hash 的 fieldARGV[2]对应要比较的值值相同则更新成 ARGV[3]并返回 1否则返回 0if redis.call(hget, KEYS[1], ARGV[1]) ARGV[2] thenredis.call(hset, KEYS[1], ARGV[1], ARGV[3])return 1 elsereturn 0 end 基于 StackExchange.Redis 的实现为了方便使用基于 IDatabase 提供了几个方便使用的扩展方法实现如下public static bool StringCompareAndExchange(this IDatabase db, RedisKey key, RedisValue newValue, RedisValue originValue) {return (int)db.ScriptEvaluate(StringCasLuaScript, new[] { key }, new[] { originValue, newValue }) 1; } public static async Taskbool StringCompareAndExchangeAsync(this IDatabase db, RedisKey key, RedisValue newValue, RedisValue originValue) {return await db.ScriptEvaluateAsync(StringCasLuaScript, new[] { key }, new[] { originValue, newValue }).ContinueWith(r (int)r.Result 1); } public static bool HashCompareAndExchange(this IDatabase db, RedisKey key, RedisValue field, RedisValue newValue, RedisValue originValue) {return (int)db.ScriptEvaluate(HashCasLuaScript, new[] { key }, new[] { field, originValue, newValue }) 1; } public static async Taskbool HashCompareAndExchangeAsync(this IDatabase db, RedisKey key, RedisValue field, RedisValue newValue, RedisValue originValue) {return await db.ScriptEvaluateAsync(HashCasLuaScript, new[] { key }, new[] { field, originValue, newValue }).ContinueWith(r (int)r.Result 1); } 实际使用使用可以参考下面的测试代码[Fact] public void StringCompareAndExchangeTest() {var key test:String:cas;var redis DependencyResolver.Current.GetRequiredServiceIConnectionMultiplexer().GetDatabase();redis.StringSet(key, 1);// set to 3 if now is 2Assert.False(redis.StringCompareAndExchange(key, 3, 2));Assert.Equal(1, redis.StringGet(key));// set to 4 if now is 1Assert.True(redis.StringCompareAndExchange(key, 4, 1));Assert.Equal(4, redis.StringGet(key));redis.KeyDelete(key); } [Fact] public void HashCompareAndExchangeTest() {var key test:Hash:cas;var field testField;var redis DependencyResolver.Current.GetRequiredServiceIConnectionMultiplexer().GetDatabase();redis.HashSet(key, field, 1);// set to 3 if now is 2Assert.False(redis.HashCompareAndExchange(key, field, 3, 2));Assert.Equal(1, redis.HashGet(key, field));// set to 4 if now is 1Assert.True(redis.HashCompareAndExchange(key, field, 4, 1));Assert.Equal(4, redis.HashGet(key, field));redis.KeyDelete(key); } Referenceshttps://redis.io/commands/evalhttps://redisbook.readthedocs.io/en/latest/feature/scripting.htmlhttps://github.com/WeihanLi/WeihanLi.Redis/blob/dev/src/WeihanLi.Redis/RedisExtensions.cshttps://github.com/WeihanLi/WeihanLi.Redis/blob/dev/test/WeihanLi.Redis.UnitTest/RedisExtensionsTest.cs
http://www.zqtcl.cn/news/322781/

相关文章:

  • 广州旅游网站建设设计公司wordpress长文章分页代码
  • 手机营销网站网站的字体
  • 设计网站大全软件互动营销用在哪些推广上面
  • 建设银行网站怎样查询贷款信息吗台州网站制作 外贸
  • 建设网站的步骤知乎app开发定制公司
  • 怎样自己做刷赞网站专业网站设计服务
  • 云主机建站如何让自己做的博客网站上线
  • 目前我们的网站正在建设中做网站违反广告法
  • 有没有做美食的规模网站怎么做国外的网站吗
  • 竭诚网络网站建设开发杭州百度推广
  • 怎样购买起名软件自己做网站小程序制作收费
  • 制作企业网站欢迎界面素材cuntlove wordpress
  • 适合建设网站的国外服务器人工智能培训机构
  • 怎么套网站潜江资讯网招聘信息
  • 网站建设 微信公众号建设网站需要
  • 做房产经纪的那些网站可以进客网站关键词排名如何做
  • 网站建设实验总结百科wordpress 前台插件
  • 招聘网站建设销售成都 网站建设
  • 手机选择网站wordpress捐赠按钮
  • 网站建设上动漫制作教学
  • 怎么用cms做网站计算机网络技术专业
  • 建设部颁发的证书网站请问注册公司怎么注册
  • 网站开发php和c语言区别网站开发教程大全
  • 建设银行通控件网站谷歌推广
  • 我要建网站需要什么付费wordpress
  • 网站收录查询情况wordpress主题仿
  • 网站单页生成器c 网站开发需要学什么
  • 什么网站是免费的免费图片链接生成器
  • 网站建设伍金手指下拉9服务器多少钱
  • 手机网站大全网站收费网站推广