Skip to content
New issue

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

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

Already on GitHub? Sign in 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 请看一下是否锁定时间太短,导致自动解锁,其他请求一起进入。

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

No branches or pull requests

2 participants