Redis分布式锁取流水号
前言
在日常开发工作中,许多业务场景涉及到取流水号,今天给大家分享一种分布式系统架构环境中取流水号的方案,利用Redis的分布式锁获取流水号。
开发环境
VS2022+.Net6+Docker+Redis+Mysql
开发步骤
1.MySQL数据库新建一个datatable:tb_seqno,新建num字段记录当前流水号
这里简单定义了一个int类型字段,默认值为1
如下(示例):
2.启动Redis容器
如下(示例):
3.核心代码编写
新建一个控制台程序,新建一个类文件SeqNo,写入以下代码(需Nuget引入CSRedisCore):
public static string GetSeqNoByRedisLock()
{
using var csredis = new CSRedis.CSRedisClient("192.168.11.112:6379, defaultDatabase = 0, poolsize = 500, ssl = false, writeBuffer = 10240");
RedisHelper.Initialization(csredis);
string getSeqNosql = "select num from tb_seqno";
string updateSeqNoSql = "update tb_seqno set num=num+1";
var seqNo = string.Empty;
using (csredis.Lock("test", 5000))
{
seqNo = MysqlHelper.ExecuteScalar(getSeqNosql).ToString();
MysqlHelper.ExecuteNonQuery(updateSeqNoSql);
}
return seqNo!;
}
4.测试
在Program中调用GetSeqNoByRedisLock方法,并打印取出的流水号,使用命令行启动多个项目用来模拟分布式架构环境下的多台机器请求
如下(示例):
结果如下(示例):
总结
通过控制打印的结果来看并没有出现重复的流水号,这里通过一个简单的Demo给大家分享一种可行性方案,当然实际业务中还需要根据自己的业务需求自定义流水号规则,业务逻辑处理等等,笔者希望此文能起到抛砖引玉的作用,如能给各位朋友一点启发或者帮助那是再好不过。