.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);
(0)

相关推荐

  • 优雅的在WinForm/WPF/控制台 中使用特性封装WebApi

    说明 在C/S端作为Server,建立HTTP请求,方便快捷. 1.使用到的类库 Newtonsoft.dll 2.封装 HttpListener HttpApi类 public class Http ...

  • .NET Core MemoryCache的使用

    好像是没有 nuget 包的直接using即可. using Microsoft.Extensions.Caching.Memory; 1 public static class CacheHelpe ...

  • Redis分布式缓存系列(二)- Redis中的String类型以及使用Redis解决订单秒杀超卖问题

    本系列将和大家分享Redis分布式缓存,本章主要简单介绍下Redis中的String类型,以及如何使用Redis解决订单秒杀超卖问题. Redis中5种数据结构之String类型:key-value的 ...

  • 一小时让你搞懂分布式缓存

    在高并发架构的设计中,缓存是如何也绕不开的一个重要步骤,从简单的电商秒杀系统,到全民为之疯狂的双十一都有它的身影,可以说,如果你想设计出一个能巨大流量的高并发架构,分布式缓存的设计是第一道拦路虎. 5 ...

  • 什么是分布式缓存

    分布式缓存由一个服务端实现管理和控制,有多个客户端节点存储数据,可以进一步提高数据的读取速率.那么我们要读取某个数据的时候,应该选择哪个节点呢?如果挨个节点找,那效率就太低了.因此需要根据一致性哈希算 ...

  • Redis分布式缓存系列(三)- Redis中的Hash类型

    本系列将和大家分享Redis分布式缓存,本章主要简单介绍下Redis中的Hash类型. 散列Hash:类似dictionary,通过索引快速定位到指定元素的,耗时均等,跟string的区别在于不用反序 ...

  • Redis分布式缓存系列(四)- Redis中的Set类型

    本系列将和大家分享Redis分布式缓存,本章主要简单介绍下Redis中的Set类型,以及如何使用Redis解决数据去重.共同好友.可能认识.统计访问网站的IP数.统计点赞数和随机获取某项值等问题. S ...

  • Tair分布式缓存

    Tair是为了解决什么问题而生? Redis很好用,相比memcached多了很多数据结构,支持持久化.但是在很长一段时间里,原生是不支持分布式的.后来就出现了很多redis集群类产品,Tair是其中 ...

  • 分布式缓存的选择

    架构师(JiaGouX) 我们都是架构师! 架构未来,你来不来? XA/二阶段提交 基于XA协议的二阶段提交 所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器 ...

  • 用动图的方式,理解 CPU 缓存一致性协议!

    大家好,我是小林. 我之前写过 CPU 缓存一致性 MESI 协议:10 张图打开 CPU 缓存一致性的大门. 然后期间挺多人对 MESI 协议的转换有疑问,其实我在文章中把 MESI 协议状态切换的 ...

  • 使用 .NET Core模板引擎创建自定义的模板和项目

    WEB前端开发社区 昨天本文是我们 .NET教育系列的一部分,该教育系列探讨了 .NET 技术的好处,以及它是如何不仅可以帮助传统的 .NET 开发人员,还可以帮助所有想要为市场提供可靠.高效且经济的 ...