首页 > 数据库 >windows下使用redis解决.net6.0下人工调用接口时分配位置的并发问题

windows下使用redis解决.net6.0下人工调用接口时分配位置的并发问题

时间:2024-05-23 13:56:05浏览次数:34  
标签:string windows Redis await redis public key using net6.0

使用了nuget包包括了:CSRedisCore,StackExchange.Redis,MyStack.DistributedLocking,Microsoft.Extensions.Configuration

安装Redis并注册为windows服务 直接参考这位兄弟的成果:

https://www.cnblogs.com/qingheshiguang/p/17952623

注册服务:

配置文件appsetting.json中加上Redis的连接字符串
 "Redis": "127.0.0.1:6379",

Program.cs中添加注册服务
// 添加并发锁支持
builder.Services.AddDistributedLock(builder.Configuration["Redis"]);
Program

 

using CSRedis;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Redis;
using Utility.Concurrent;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class ServiceCollectionExtensions
    {
        /// <summary>
        /// 添加并发锁支持
        /// </summary>
        /// <param name="services"></param>
        /// <param name="connectionString"></param>
        /// <returns></returns>
        public static IServiceCollection AddDistributedLock(this IServiceCollection services, string connectionString)
        {
            RedisHelper.Initialization(new CSRedisClient(connectionString));
            services.AddSingleton<IDistributedCache>(new CSRedisCache(RedisHelper.Instance));
            services.AddSingleton(typeof(IDistributedLock), typeof(DistributedLock));
            return services;
        }
    }
}
View Code

 

redis客户端实现

using CSRedis;

namespace Concurrent
{
    public class DistributedLock : IDistributedLock
    {
        private const string _lockKey = "LockKey";
        public async Task<bool> TryLockAsync(string key, int lockExpirySeconds = 10, long waitLockSeconds = 60)
        {
            if (string.IsNullOrEmpty(key))
            {
                throw new ArgumentNullException("锁键值不能为空。");
            }

            DateTime begin = DateTime.Now;
            while (true)
            {
                if (await RedisHelper.SetAsync($"{_lockKey}.{key}", Thread.CurrentThread.ManagedThreadId, lockExpirySeconds, RedisExistence.Nx))
                {
                    return true;
                }
                //不等待锁则返回
                if (waitLockSeconds == 0)
                {
                    break;
                }

                //超过等待时间,则不再等待
                if ((DateTime.Now - begin).TotalSeconds >= waitLockSeconds)
                {
                    break;
                }

                Thread.Sleep(100);
            }
            return false;
        }

        public async Task UnLockAsync(string key)
        {
            await RedisHelper.DelAsync($"{_lockKey}.{key}");
        }

        public async Task<T> LockExecuteAsync<T>(string key, Func<Task<T>> handle, int lockExpirySeconds = 10, long waitLockSeconds = 60)
        {
            if (await TryLockAsync(key, lockExpirySeconds, waitLockSeconds))
            {
                try
                {
                    return await handle?.Invoke();
                }
                finally
                {
                    try { await UnLockAsync(key); } finally { }
                }
            }
            return await Task.FromResult(default(T));
        }
    }
}
DistributedLock
    //锁定分配的目标库位
   var hasLock = await _distributedLock.TryLockAsync(LocationCode, 5, 10);
    if (!hasLock) 
    {
        throw new BizException(_Localizer["操作频繁,稍后再试"]);
    }

业务中调用

标签:string,windows,Redis,await,redis,public,key,using,net6.0
From: https://www.cnblogs.com/yanghucheng/p/18208318

相关文章

  • 阿里oceanbase数据库安装步骤-windows-docker
    打开阿里的安装教程:OceanBase分布式数据库-海量数据笔笔算数找到方案3:容器-docker。https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000639587 下载docker-desktop:https://www.docker.com/https://www.docker.com/products/docker-desktop/......
  • Windows 10 LTSC中个人版OneDrive失效的问题
    该问题是由于LTSC注册表无onedriver的id{A52BBA46-E9E1-435f-B3D9-28DAA648C0F6}定义导致,解决方案是新建一个reg_onedrive.reg文件,并编辑内容如下:WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescript......
  • windows上使用wsl的ubuntu部署stirling-pdf
    由于要部署stirling-pdf需要docker环境,所以需要使用ubuntu系统,那么在win10/win11上最方便的方式就是使用wsl安装ubuntu然后再wsl上的ubuntu上进行部署,接下来就是整个步骤在windows上使用wsl安装ubuntu,在powershell上使用wsl--install命令就可以默认安装ubuntu了,方便快捷登录ub......
  • Redis篇
    ----------------------------------------------------------------------------------------------------------------默认端口:6379----------------------------------------------------------------------------------------------------------------前端启动:/usr/local/redi......
  • Windows server高危漏洞 - 目标主机使用了不受支持的SSL加密算法
    系统扫描出高危漏洞:目标主机使用了不受支持的SSL加密算法。 修复过程:使用IISCrypto工具,下载地址:NartacSoftware-IISCrypto1.打开工具,点击“BestPractices”后,会自动反选掉一些选项,如下图,根据解决建议,手动反选掉TLS1.0和TLS1.1。然后Apply,重启服务器。 2. 服务......
  • QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇
     Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台。在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他的IDE配合CMake等方式,但使用QtCreator更加方便,并且操作环境完全一致。QtCreator支持Windows、Linux、M......
  • QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境De
    前言  使用QGis的目的是进行二次开发,或者说是融入我们的应用(无人车、无人船、无人机),本片描述搭建QGis二次基础开发环境,由于实在是太长了,进行了分篇:上半部分:主要是安装好后,使用QtCreator可以使用QGIs的apps下的Qt使用对应的编译器编译不带qgis的空工程。下半部分:在上半......
  • 远程连接redis
    连接服务器上的redis所需要的操作1、copy一份redis.conf文件,并修改以下内容#开启后台登录daemonizeyes#允许所有连接访问,包括外部连接bind0.0.0.0#不使用密码也可以登陆protected-modeno2、修改完成后使用这个配置文件启动redis#redis服务器启动......
  • python在Linux环境下访问Windows共享目录
    1.smbprotocol 不推荐,偶然会出现 "SMBsocketwasclosed,cannotsendorreceiveanymoredata" 的异常。pipinstallsmbprotocol实现代码:#!/usr/bin/envpython#-*-encoding:utf-8-*-fromsmbclientimportopen_file,register_session,delete_session......
  • Windows 电源管理BUG--2024年5月22日了解
    目录注意:笔记本电脑一定不能拔电后长时间休眠,特别是11系统!!Win11休眠后的电源管理有bug,会将你的电池彻底用到激活电压以下,很有可能导致电池锁定(只能通过特定设备激活解锁).你的电脑就会永远进入0%电池状态,电池只能通过更换或激活(没有那个设备)才能恢复充电功能.问......