Skip to content

Cache.BeginCacheLockAsync 没有工作 #305

@IvanZheng

Description

@IvanZheng

为了将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
请问是哪里没有配置好吗?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions