目录:
一, 分布式缓存 - Redis 与 Memched 的区别
1.1, 数据支持类型
1.2, 持久性
1.3, 内存利用情况
1.4, 数据一致性
1.5, 性能区别
1.6, 总结
二, 内存缓存 - Cache(.Net Core)
2.1, 介绍适用场景
2.2, 提供的过期的方式
2.3, 如何使用
一, 分布式缓存 - Redis 与 Memched 的区别
1.1, 数据支持类型
Redis: 支持 String(字符串),Hash(哈希),List(列表),Set(集合), ZSet(有序集合),Bitmaps(位图),HyperLogLog,Geo(地理信息定位)
Memched: 简单的 key/value 数据类型
1.2, 持久性
Redis:Redis 通过 RDB 与 AOF 持久化, 可以将内存中的数据保存到硬盘中, 然后重启之后在读取数据
Memched: 不支持数据的持久性的存储
1.3, 内存利用情况
使用简单的 key-value 存储的话, Memcached 的内存利用率更高, 而如果 Redis 采用 hash 结构来做 key-value 存储, 由于其组合式的压缩, 其内存利用率会高于 Memcached.
Memcached 默认使用 Slab Allocation 机制管理内存, 主要思想是按照原先预定的大小分配内存大小, 当客户端发过来数据的时候会选择一个最适合的地方给它储存,, 好处是效率高,
不会造成内存碎片, 但是不好的一点就是分配的内存大小 124 字节, 传进来的大小是 100 字节, 那么 24 字节的内存也就浪费了.
1.4, 数据一致性
Redis: 单线程保证了数据的顺序, 同时 Redis 还有事务操作
Memcached:memcache 需要使用 cas 保证数据一致性. CAS(Check and Set)是一个确保并发一致性的机制, 属于 "乐观锁" 范畴; 原理很简单: 拿版本号, 操作, 对比版本号,
如果一致就操作, 不一致就放弃任何操作
1.5, 性能区别
Redis 使用单核, Memcached 可以使用多核, 所以在处理小的文件的时候 Redis 会比 Memcached 有更高的效率, 但是在 100KB 以上的时候, Memcached 的效率就会比 Redis 更高一点
1.6, 总结
以上就是 Redis 和 Memcached 大致的比较了. 各有各的优点以及缺点, 存在即合理, 只有在使用在合适的运用场景, 才是最有效率的.
二, 内存缓存 - Cache(.Net Core)
2.1, 介绍适用场景
Cache, 中译名高速缓冲存储器, 其作用是为了更好的利用局部性原理, 减少 CPU 访问主存的次数. 简单地说, CPU 正在访问的指令和数据, 其可能会被以后多次访问到, 或者是该指令和数据附近的内存区域, 也可能会被多次访问. 因此, 第一次访问这一块区域时, 将其复制到 Cache 中, 以后访问该区域的指令或者数据时, 就不用再从主存中取出.
内存缓存可以存储任何对象; 分布式缓存接口仅限于 byte[]. 内存和分布式缓存将缓存项存储为键值对.
2.2, 提供的过期的方式
主要介绍两种:
绝对到期(指定在一个固定的时间点到期)
滑动到期(在一个时间长度内没有被命中则过期)
2.3, 如何使用
新建一个 CacheHelper 公共类
- public class CacheHelper
- {
- private static IMemoryCache _memoryCache;
- public CacheHelper(IMemoryCache memoryCache)
- {
- _memoryCache = memoryCache;
- }
- /// <summary>
- /// 创建绝对过期时间缓存
- /// </summary>
- /// <param name="cacheKey">缓存 key</param>
- /// <param name="obj">缓存对象</param>
- /// <param name="expireDate">过期时间 (绝对) 分钟</param>
- public static void SetAbsolute(string cacheKey, object obj,int expireDate= 10 * 60)
- {
- // 绝对到期时间
- var cacheEntryOptions = new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(expireDate));
- _memoryCache.Set(cacheKey, obj, cacheEntryOptions);
- }
- /// <summary>
- /// 每隔多长时间不调用就让其过期
- /// </summary>
- /// <param name="cacheKey">缓存 key</param>
- /// <param name="obj">缓存对象</param>
- /// <param name="expireDate">过期时间(访问缓存重置时间)</param>
- public static void SetSliding(string cacheKey, object obj, int expireDate= 10 * 60)
- {
- // 绝对到期时间
- var cacheEntryOptions = new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(expireDate));
- _memoryCache.Set(cacheKey, obj, cacheEntryOptions);
- }
- /// <summary>
- /// 判断缓存是否存在
- /// </summary>
- /// <param name="key">缓存 key</param>
- /// <returns></returns>
- public static bool IsExist(string cacheKey)
- {
- if (string.IsNullOrWhiteSpace(cacheKey))
- {
- return false;
- }
- return _memoryCache.TryGetValue(cacheKey, out _);
- }
- /// <summary>
- /// 获取缓存对象
- /// </summary>
- /// <param name="cacheKey">缓存 key</param>
- /// <returns>object 对象</returns>
- public static object Get(string cacheKey)
- {
- if (string.IsNullOrEmpty(cacheKey))
- {
- return null;
- }
- return _memoryCache.Get(cacheKey);
- }
- /// <summary>
- /// 获取缓存对象
- /// </summary>
- /// <typeparam name="T">T 对象</typeparam>
- /// <param name="cacheKey">缓存 Key</param>
- /// <returns></returns>
- public static T Get<T>(string cacheKey)
- {
- if (string.IsNullOrEmpty(cacheKey))
- {
- return default(T);
- }
- if (!_memoryCache.TryGetValue<T>(cacheKey, out T cacheEntry))
- {
- return default(T);
- }
- return cacheEntry;
- }
- /// <summary>
- /// 获取所有缓存键
- /// </summary>
- /// <returns></returns>
- public static List<string> GetCacheKeys()
- {
- const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
- var entries = _memoryCache.GetType().GetField("_entries", flags).GetValue(_memoryCache);
- var cacheItems = entries as IDictionary;
- var keys = new List<string>();
- if (cacheItems == null) return keys;
- foreach (DictionaryEntry cacheItem in cacheItems)
- {
- keys.Add(cacheItem.Key.ToString());
- }
- return keys;
- }
- /// <summary>
- /// 移除指定数据缓存
- /// </summary>
- /// <param name="cacheKey">缓存 key</param>
- public static void RemoveCache(string cacheKey)
- {
- _memoryCache.Remove(cacheKey);
- }
- /// <summary>
- /// 移除全部缓存
- /// </summary>
- public static void RemoveAllCache()
- {
- var keysList = GetCacheKeys();
- foreach (string key in keysList)
- {
- _memoryCache.Remove(key);
- }
- }
- }
然后根据前两篇文章所讲的依赖注入在 Startup.cs 里面注册
- services.AddMemoryCache();
- services.AddSingleton<CacheHelper>();
然后就可以正常使用了.
CacheHelper.SetAbsolute("admin", admin, 10 * 60);
来源: https://www.cnblogs.com/hulizhong/p/10776203.html