Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Cache.BeginCacheLockAsync 没有工作 #305

Open
IvanZheng opened this issue Oct 14, 2024 · 1 comment
Open

Cache.BeginCacheLockAsync 没有工作 #305

IvanZheng opened this issue Oct 14, 2024 · 1 comment

Comments

@IvanZheng
Copy link

为了将accesstoken的当前所剩过期时间能返回给调用方,重新封装了下AccessTokenContainer如下:
`public class AccessTokenContainerExt: AccessTokenContainer{

public static async Task GetAccessTokenInfo(string appId, bool getNewToken = false)
{
await ValidateAppRegistered(appId).ConfigureAwait(false);

 var accessTokenBag = await TryGetItemAsync(appId).ConfigureAwait(false);

 using (await Cache.BeginCacheLockAsync(LockResourceName, appId).ConfigureAwait(false))//同步锁
 {
     if (getNewToken || accessTokenBag.AccessTokenExpireTime <= SystemTime.Now)
     {
         //已过期,重新获取
         var accessTokenResult = await CommonApi.GetTokenAsync(accessTokenBag.AppId, accessTokenBag.AppSecret).ConfigureAwait(false);
         accessTokenBag.AccessTokenResult = accessTokenResult;
         accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.expires_in);
         await UpdateAsync(accessTokenBag, null).ConfigureAwait(false);//更新到缓存
     }
 }
 return new AccessTokenInfo
 {
     AppId = accessTokenBag.AppId,
     AccessToken = accessTokenBag.AccessTokenResult.access_token,
     ExpireTime = accessTokenBag.AccessTokenExpireTime,
     ExpireIn =  (int)(accessTokenBag.AccessTokenExpireTime - DateTimeOffset.Now).TotalSeconds
 };

}
}`

验证分布式锁时, 发现多个实例都进入了竞争代码Cache.BeginCacheLockAsync 没有起作用,并查看了Redis库,也确实没有锁的数据写入, 并且验证过其他Redis功能都是正常的, 生成的accesstoken也都能正常写入Redis,目前就分布式锁有问题。

初始代码如下:
` private void UseSenparcWexin(IApplicationBuilder app)
{
var senparcSetting = app.ApplicationServices.GetRequiredService<IOptions>().Value;
var senparcWeixinSetting = app.ApplicationServices.GetRequiredService<IOptions>().Value;

 // 启动 CO2NET 全局注册,必须!
 // 关于 UseSenparcGlobal() 的更多用法见 CO2NET Demo:https://github.com/Senparc/Senparc.CO2NET/blob/master/Sample/Senparc.CO2NET.Sample.netcore3/Startup.cs
 var registerService = app.UseSenparcGlobal(_environment, senparcSetting, globalRegister =>
 {
     //当同一个分布式缓存同时服务于多个网站(应用程序池)时,可以使用命名空间将其隔离(非必须)
     globalRegister.ChangeDefaultCacheNamespace("DefaultCO2NETCache");

     #region 配置和使用 Redis          -- DPBMARK Redis
     //Register.SetConfigurationOption(senparcSetting.Cache_Redis_Configuration);
     ////以下会立即将全局缓存设置为 Redis
     //Register.UseKeyValueRedisNow(); //键值对缓存策略(推荐)

     #endregion

     #region 注册 StackExchange.Redis

     /* 如果需要使用 StackExchange.Redis,则可以使用 Senparc.CO2NET.Cache.Redis 库
      * 注意:这一步注册和上述 CsRedis 库两选一即可,本 Sample 需要同时演示两个库,因此才都进行注册
      */

     Senparc.CO2NET.Cache.Redis.Register.SetConfigurationOption(senparcSetting.Cache_Redis_Configuration);
     Senparc.CO2NET.Cache.Redis.Register.UseKeyValueRedisNow();//键值对缓存策略(推荐)

     #endregion

 }, true);
 

 //使用 Senparc.Weixin SDK
 registerService.UseSenparcWeixin(senparcWeixinSetting, (weixinRegister, weixinSetting) =>
 {
     //weixinRegister.UseSenparcWeixinCacheCsRedis();
     weixinRegister.UseSenparcWeixinCacheRedis();
     weixinSetting.Items
                  .Where(i => i.Key != "Default")
                  .ToArray()
                  .ForEach(item =>
     {
         if (!string.IsNullOrWhiteSpace(item.Value.WeixinAppId))
         {
             weixinRegister.RegisterMpAccount(item.Value, item.Key);
         }
         else if (!string.IsNullOrWhiteSpace(item.Value.WeixinCorpId))
         {
             weixinRegister.RegisterWorkAccount(item.Value, item.Key);
         }     
     });
 });

}`
并且分别尝试了CsRedis和StackExchange.Redis都不起作用。使用的版本是如下:运行环境是net8,
image
请问是哪里没有配置好吗?

@JeffreySu
Copy link
Contributor

@IvanZheng 请看一下是否锁定时间太短,导致自动解锁,其他请求一起进入。

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants