zoukankan      html  css  js  c++  java
  • .Net Core 缓存方式(二)自定义分布式缓存的扩展方法(5)

    .Net Core 缓存方式(二)自定义分布式缓存的扩展方法(5)

    IDistributedCache 的扩展方法

    IDistributedCache 的扩展方法实现了类似于 cache.GetString(key); 这种写法,但是实际使用起来还需要写多行 类转字符串的代码,这时候就可以自己自定义 IDistributedCache 的扩展方法。

    实现类似 MemoryCache的GetOrCreate方法

    _cache.GetOrCreate

        var cacheEntry = _cache.GetOrCreate(CacheKeys.Entry, entry =>
        {
            entry.SlidingExpiration = TimeSpan.FromSeconds(3);
            return DateTime.Now;
        });
    

    MemoryCache的GetOrCreate好用,看下实现方法:

            public static TItem GetOrCreate<TItem>(this IMemoryCache cache, object key, Func<ICacheEntry, TItem> factory)
            {
                if (!cache.TryGetValue(key, out object result))
                {
                    ICacheEntry entry = cache.CreateEntry(key);
                    result = factory(entry);
                    entry.SetValue(result);
                    // need to manually call dispose instead of having a using
                    // in case the factory passed in throws, in which case we
                    // do not want to add the entry to the cache
                    entry.Dispose();
                }
    
                return (TItem)result;
            }
    

    我们可以写个类似 GetOrCreate 的扩展方法

            public static TItem GetOrCreate<TItem>(this IDistributedCache cache, string key, Func<TItem> factory, DistributedCacheEntryOptions options)
            {
                if (!cache.TryGetValue(key, out TItem obj))
                {
                    obj = factory();
                    cache.Set(key, obj, options);
                }
                return (TItem)obj;
            }
    

    自定义分布式缓存的扩展方法

    我这里设置默认 半小时过期

        public static class DistributedCacheExtensions
        {
            private static readonly DistributedCacheEntryOptions DefaultOptions = new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(30));
    
            public static TItem Get<TItem>(this IDistributedCache cache, string key)
            {
                try
                {
                    var valueString = cache.GetString(key);
    
                    if (string.IsNullOrEmpty(valueString))
                    {
                        return default(TItem);
                    }
    
                    return JsonSerializer.Deserialize<TItem>(valueString);
                }
                catch (Exception e)
                {
                    return default(TItem);
                }
            }
    
            public static async Task<TItem> GetAsync<TItem>(this IDistributedCache cache, string key, CancellationToken token = default(CancellationToken))
            {
                try
                {
                    var valueString = await cache.GetStringAsync(key, token);
    
                    if (string.IsNullOrEmpty(valueString))
                    {
                        return default(TItem);
                    }
    
                    return JsonSerializer.Deserialize<TItem>(valueString);
                }
                catch (Exception e)
                {
                    return default(TItem);
                }
            }
    
            public static bool TryGetValue<TItem>(this IDistributedCache cache, string key, out TItem value)
            {
                var valueString = cache.GetString(key);
                if (!string.IsNullOrEmpty(valueString))
                {
                    value = JsonSerializer.Deserialize<TItem>(valueString);
                    return true;
                }
                value = default(TItem);
                return false;
            }
    
            public static void Set<TItem>(this IDistributedCache cache, string key, TItem value)
            {
                cache.SetString(key, JsonSerializer.Serialize(value), DefaultOptions);
            }
    
            public static void Set<TItem>(this IDistributedCache cache, string key, TItem value, DistributedCacheEntryOptions options)
            {
                cache.SetString(key, JsonSerializer.Serialize(value), options);
            }
    
            public static async Task SetAsync<TItem>(this IDistributedCache cache, string key, TItem value, CancellationToken token = default(CancellationToken))
            {
                await cache.SetStringAsync(key, JsonSerializer.Serialize(value), DefaultOptions, token);
            }
    
            public static async Task SetAsync<TItem>(this IDistributedCache cache, string key, TItem value, DistributedCacheEntryOptions options, CancellationToken token = default(CancellationToken))
            {
                await cache.SetStringAsync(key, JsonSerializer.Serialize(value), options, token);
            }
    
            public static TItem GetOrCreate<TItem>(this IDistributedCache cache, string key, Func<TItem> factory)
            {
                if (!cache.TryGetValue(key, out TItem obj))
                {
                    obj = factory();
                    cache.Set(key, obj);
                }
                return (TItem)obj;
            }
    
            public static TItem GetOrCreate<TItem>(this IDistributedCache cache, string key, Func<TItem> factory, DistributedCacheEntryOptions options)
            {
                if (!cache.TryGetValue(key, out TItem obj))
                {
                    obj = factory();
                    cache.Set(key, obj, options);
                }
                return (TItem)obj;
            }
    
            public static async Task<TItem> GetOrCreateAsync<TItem>(this IDistributedCache cache, string key, Func<Task<TItem>> factory)
            {
                if (!cache.TryGetValue(key, out TItem obj))
                {
                    obj = await factory();
                    await cache.SetAsync(key, obj);
                }
                return (TItem)obj;
            }
    
            public static async Task<TItem> GetOrCreateAsync<TItem>(this IDistributedCache cache, string key, Func<Task<TItem>> factory, DistributedCacheEntryOptions options)
            {
                if (!cache.TryGetValue(key, out TItem obj))
                {
                    obj = await factory();
                    await cache.SetAsync(key, obj, options);
                }
                return (TItem)obj;
            }
        }
    

    用法 example:

            private readonly IDistributedCache _distributedCache;
            public CategoryService(
                IDistributedCache distributedCache)
            {
                _distributedCache = distributedCache;
            }
    
            public async Task<List<CategoryList>> GetCategoryList()
            {
                return await _distributedCache.GetOrCreateAsync(ProductCaching.GetCategoryList, 
                    async () => await GetFormHybris());
            }
    
                var saveCode = _distributedCache.Get<string>(cacheKey);
                var order= _distributedCache.Get<Order>(cacheKey);
    
  • 相关阅读:
    oc 阿拉伯数字转中文数字
    std::vector<char> 转 const char
    cocos2d-x类型转换(CCstring int string char UTF-8互转)
    js Array.prototype.join.call(arguments,",") 理解
    去除console.log
    This renderer process has Node.js integration enabled and attempted to load remote content from Electron的警告
    [vue/no-parsing-error] Parsing error: x-invalid-end-tag 提示报错
    node 调用cmd 乱码
    nodeIntegration: true Electron的警告
    take it away `electron-builder` Electron打包失败的问题
  • 原文地址:https://www.cnblogs.com/WNpursue/p/13567109.html
Copyright © 2011-2022 走看看