StackExchange.Redis 命令扩展

StackExchange.Redis 命令扩展

Intro

在之前的文章中有简单介绍过 StackExchange.Redis 直接调用 Redis 命令来实现调用 Stream 的根据消息 Id 来控制消息长度,因为 StackExchange.Redis 目前还不支持根据消息 Id 控制 Stream 消息长度,目前有很多 6.2 以后带来的新特性大多还不支持。

前段时间,给 StackExchange.Redis 提了一个 PR 支持了一个 Redis 6.2 的新命令 GETDEL,给大家分享一下,有想去蹭贡献的也可以尝试贡献一下

GETDEL

GETDEL 是 Redis 6.2 中引入的新功能中的其中一个,是针对 String 类型的数据的命令,如同命令名称一样,先 GET 并删除某一个 key,返回 key 的内容,如下面示例一样

redis> SET mykey "Hello"

"OK"

redis> GETDEL mykey

"Hello"

redis> GET mykey

(nil)

Implement

命令比较简单,不会造成产生破坏性的变更,实现起来也是比较简单,主要是新增下面两个 API:

RedisValue StringGetDelete(RedisKey key, CommandFlags flags = CommandFlags.None);
Task<RedisValue> StringGetDeleteAsync(RedisKey key, CommandFlags flags = CommandFlags.None);

分别定义在 IDatabase/IDatabaseAsync

对于其实现来说,会增加一个 Redis 命令的枚举定义,需要在 RedisCommand 中增加一个新命令 GETDEL

enum RedisCommand:
+  GETDEL,

实现需要修改的地方有三个:

RedisDatabase,新增的 API 实现如下

public RedisValue StringGetDelete(RedisKey key, CommandFlags flags = CommandFlags.None)
{var msg = Message.Create(Database, flags, RedisCommand.GETDEL, key);return ExecuteSync(msg, ResultProcessor.RedisValue);
}public Task<RedisValue> StringGetDeleteAsync(RedisKey key, CommandFlags flags = CommandFlags.None)
{var msg = Message.Create(Database, flags, RedisCommand.GETDEL, key);return ExecuteAsync(msg, ResultProcessor.RedisValue);
}

DatabaseWrapper:

public RedisValue StringGetDelete(RedisKey key, CommandFlags flags = CommandFlags.None)
{return Inner.StringGetDelete(ToInner(key), flags);
}

WrapperBase:

public Task<RedisValue> StringGetDeleteAsync(RedisKey key, CommandFlags flags = CommandFlags.None)
{return Inner.StringGetDeleteAsync(ToInner(key), flags);
}

单元测试的变更如下:

tests/StackExchange.Redis.Tests/DatabaseWrapperTests.cs:

[Fact]
public void StringGetDelete()
{wrapper.StringGetDelete("key", CommandFlags.None);mock.Verify(_ => _.StringGetDelete("prefix:key", CommandFlags.None));
}

tests/StackExchange.Redis.Tests/WrapperBaseTests.cs:

[Fact]
public void StringGetDeleteAsync()
{wrapper.StringGetDeleteAsync("key", CommandFlags.None);mock.Verify(_ => _.StringGetDeleteAsync("prefix:key", CommandFlags.None));
}

tests/StackExchange.Redis.Tests/Strings.cs: 实际使用也可以参数这两个测试用例

[Fact]
public void GetDelete()
{using (var muxer = Create()){Skip.IfMissingFeature(muxer, nameof(RedisFeatures.GetDelete), r => r.GetDelete);var conn = muxer.GetDatabase();var prefix = Me();conn.KeyDelete(prefix + "1", CommandFlags.FireAndForget);conn.KeyDelete(prefix + "2", CommandFlags.FireAndForget);conn.StringSet(prefix + "1", "abc", flags: CommandFlags.FireAndForget);Assert.True(conn.KeyExists(prefix + "1"));Assert.False(conn.KeyExists(prefix + "2"));var s0 = conn.StringGetDelete(prefix + "1");var s2 = conn.StringGetDelete(prefix + "2");Assert.False(conn.KeyExists(prefix + "1"));Assert.Equal("abc", s0);Assert.Equal(RedisValue.Null, s2);}
}[Fact]
public async Task GetDeleteAsync()
{using (var muxer = Create()){Skip.IfMissingFeature(muxer, nameof(RedisFeatures.GetDelete), r => r.GetDelete);var conn = muxer.GetDatabase();var prefix = Me();conn.KeyDelete(prefix + "1", CommandFlags.FireAndForget);conn.KeyDelete(prefix + "2", CommandFlags.FireAndForget);conn.StringSet(prefix + "1", "abc", flags: CommandFlags.FireAndForget);Assert.True(conn.KeyExists(prefix + "1"));Assert.False(conn.KeyExists(prefix + "2"));var s0 = conn.StringGetDeleteAsync(prefix + "1");var s2 = conn.StringGetDeleteAsync(prefix + "2");Assert.False(conn.KeyExists(prefix + "1"));Assert.Equal("abc", await s0);Assert.Equal(RedisValue.Null, await s2);}
}

More

主要的变更就是这些了,是不是看起来也简单的,除了上面的基本实现就是要增加一些测试用例以及本地进行一下测试,看是不是可以按预期工作,有一些功能可能会要求集成测试

除了上面还有一个小点,就是如果不是只读命令需要声明命令是 MasterOnly 的,在 src/StackExchange.Redis/Message.cs 中的 public static bool IsMasterOnly(RedisCommand command) 声明即可,除此之外,StackExchange.Redis 会建议增加 ReleaseNote

如果你愿意也可以尝试去贡献一下 https://github.com/StackExchange/StackExchange.Redis/issues

References

  • https://github.com/StackExchange/StackExchange.Redis/pull/1840

  • https://github.com/StackExchange/StackExchange.Redis/issues/1729

  • https://redis.io/commands/getdel

  • https://github.com/StackExchange/StackExchange.Redis/issues

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那个成人总会遇到的小问题……

结语超模君就问问&#xff1a;我还有机会10万&#xff0b;吗&#xff1f;&#xff08;溜了溜了&#xff09;莱布尼茨德国数学家莱布尼茨&#xff0c;被后人誉为“百科全书式的天才”&#xff0c;他的研究涉及逻辑学、力学等40多个领域。他创建了数学理论&#xff1a;微积分学。…

java继承接口和泛型,JavaSE习题 继承接口和泛型

问答题&#xff1a;1.子类在什么情况下可以继承父类友好成员&#xff1f;答&#xff1a;在同一个包内2.子类通过怎样的方法可以隐藏继承的成员变量&#xff1f;答&#xff1a;声明一个与父类相同变量名的成员变量3.子类重写继承的方法原则是什么&#xff1f;答&#xff1a;保证…

visual studio如何修改c++项目的.net framework框架版本

一、 修改项目文件 在 Visual Studio 的“解决方案资源管理器”中&#xff0c;打开项目的快捷菜单&#xff0c;然后选择“卸载项目”。 这将为你的项目卸载项目文件 (.vcxproj)。 在菜单栏上&#xff0c;依次选择“文件”、“打开”、“文件”。 在“打开文件”对话框中&#…

vertical-align

对于vertical-align属性&#xff0c;可以用于inline或者liline-block的元素&#xff0c;它需要一个参照物&#xff0c;此参照物是该行中最高的元素。转载于:https://www.cnblogs.com/lqzerogg/archive/2012/12/17/2822274.html

Qos、Tos、Cos、DSCP

严格的说&#xff0c;Cos与Tos只是QoS的一种标记机制。QoS范围太大&#xff0c;涉及到入口数据流的标记和分类及速率限制&#xff0c;网络骨干的拥塞避免和拥塞管理&#xff0c;网络出口的队列调度机制等等。Cos是二层ISL或者802.1Q数据帧的优先级标记&#xff0c;3个bit&#…

Github CodeSpaces 使用及定制化

Github CodeSpaces 使用及定制化IntroGithub 最近推出了很多令人兴奋的新功能&#xff0c;最近使用了 Github CodeSpaces&#xff0c;觉得还是挺不错的&#xff0c;CodeSpaces 相当于自己有了一个云主机&#xff0c;真正实现了云端开发&#xff0c;CodeSpaces 和 Github 做了很…

nat+端口转发,使得宿主机secureCRT可以访问vbox里linux虚拟机

为什么80%的码农都做不了架构师&#xff1f;>>> 环境&#xff1a;vbox或者叫vitrualbox连接虚拟机&#xff0c;由于公司内网不能分配IP&#xff08;不知道是不是这个原因&#xff09;&#xff0c;虚拟机用桥接得不到IP&#xff0c;没法实现虚拟机和宿主互相访问&am…

java 四字节uid,Java入门教程-序列化版本号serialVersionUID的作用

原标题&#xff1a;Java入门教程-序列化版本号serialVersionUID的作用Java序列化是将一个对象编码成一个字节流&#xff0c;反序列化将字节流编码转换成一个对象。序列化是Java中实现持久化存储的一种方法&#xff1b;为数据传输提供了线路级对象表示法。Java的序列化机制是通过…

男人可以有多敷衍?

1 现在更流行「红茶女生」&#xff1f;&#xff08;via.白头叔&#xff09;▼2 谢谢&#xff0c;有被冒犯到&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 天使与恶魔▼4 男朋友可以多敷衍&#xff1f;▼5 你的高原红&#xff0c;像极了妈妈的巴掌印&#xff…

linux 内核代码构架图

转载于:https://www.cnblogs.com/kuainiao/archive/2012/12/17/2822384.html

Win11开始大范围推送!

微软宣布 Windows11 现已开始向更多符合最低硬件要求的电脑推送。预计到 2022 年年中&#xff0c;所有符合条件的电脑都可以免费升级到 Windows 11。微软将根据硬件条件、可靠性、使用时间&#xff0c;及其它会影响升级后使用体验的因素&#xff0c;为 Windows 10 电脑分阶段推…

puppet安装

一&#xff0e; 服务器端和客户端都需要做的操作。 1. 下载软件 wget http://puppetlabs.com/downloads/facter/facter-1.6.4.tar.gz wget http://downloads.puppetlabs.com/puppet/puppet-2.7.9.tar.gz 2. 安装ruby puppet是ruby开发的&#xff0c;所以需要安装。 Yum …

HTFS.Software.v7.3-ISO 1DVD(传热模拟,最新完全解密版)

工厂设计相关软件&#xff1a; Intergraph产品: Intergraph Intools Engineering Suite v5.2-ISO 1CD(国际顶级仪表工程的设计软件) Intergraph SmartPlant Enterprise 2007-ISO 2DVD Intergraph SmartPlant 3D 2009-ISO 1DVD Intergraph SmartPlant 3D v6.1 WinXP-ISO 1DVD I…

状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely

题目传送门 题意&#xff1a;有n*m的房间&#xff0c;.表示可以被点亮&#xff0c;#表示不能被点亮&#xff0c;每点亮一个房间会使旁边的房间也点亮&#xff0c;有意盏特别的灯可以选择周围不同方向的房间点亮。问最少需要多少灯使得所有房间点亮 分析&#xff1a;需要被点亮的…

有什么看起来很难,但是其实很简单的题目

全世界只有3.14 % 的人关注了爆炸吧知识做题其实很简单今天超模君一进办公室就感觉充满“杀气”&#xff0c;果不其然&#xff0c;一抬头就看见小天拿着一张纸对着我坏笑。莫非这家伙又要我折纸&#xff1f;拿过纸张一看&#xff0c;虽然密密麻麻的一大堆公式&#xff0c;但我相…

iphone-common-codes-ccteam源代码 CCTestMacros.m

// // CCTestMacros.m // CCFC // // Created by xichen on 11-12-30. // Copyright 2011 ccteam. All rights reserved. // #import "CCTestMacros.h" implementation CCTestMacros end 可能有更新: googlecode链接地址&#xff1a;http://code.googl…

双11,2分钟狂挣20亿的神秘大厂,急招.NET!

双11小米开门红&#xff0c;2分钟不到突破20亿&#xff0c;于是机智的我又去逛了下小米的招聘官网&#xff1a;招5年左右.NET&#xff0c;35k左右&#xff0c;14薪&#xff0c;要求WPF和自动化&#xff0c;真香&#xff01;回首牛年2个跳槽季&#xff0c;招WPF的大厂太多了&…

炸了!刚刚数学家获得了2020年诺贝尔物理学奖!没想到诺奖也能蝉联.......

全世界只有3.14 % 的人关注了爆炸吧知识就在刚刚&#xff0c;万众瞩目的2020年诺贝尔奖物理学奖获得者确定了&#xff01;他们就是——天体物理学家&#xff08;该领域连续两年获得诺奖&#xff09;物理学奖得主罗格彭罗斯爵士&#xff08;Roger penrose&#xff09;&#xff0…

Perl深拷贝

使用mkdir可以创建一个目录&#xff0c;但只能创建一个目录。 使用mkpath则可以创建连续的子目录。在linux下使用cp -p同样可以实现同样的功能。 再使用File::Copy来拷贝。 1 use File::Path; 2 use File::Copy;3 sub writeSubFolder4 {5 my $root E:/perl_work/; 6 …

硬盘维护方法介绍

硬盘维护方法介绍 1、保持电脑工作环境清洁 硬盘以带有超精过滤纸的呼吸孔与外界相通&#xff0c;它可以在普通无净化装置的室内环境中使用&#xff0c;若在灰尘严重的环境下&#xff0c;会被吸附到PCBA的表面、主轴电机的内部以及堵塞呼吸过滤器&#xff0c;因此必须防尘。 还…