目录:

 一、分布式缓存—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公共类

 

  1. public class CacheHelper
  2. {
  3. private static IMemoryCache _memoryCache;
  4.  
  5. public CacheHelper(IMemoryCache memoryCache)
  6. {
  7. _memoryCache = memoryCache;
  8. }
  9.  
  10. /// <summary>
  11. /// 创建绝对过期时间缓存
  12. /// </summary>
  13. /// <param name="cacheKey">缓存key</param>
  14. /// <param name="obj">缓存对象</param>
  15. /// <param name="expireDate">过期时间(绝对)分钟</param>
  16. public static void SetAbsolute(string cacheKey, object obj,int expireDate= * )
  17. {
  18. //绝对到期时间
  19. var cacheEntryOptions = new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(expireDate));
  20.  
  21. _memoryCache.Set(cacheKey, obj, cacheEntryOptions);
  22. }
  23.  
  24. /// <summary>
  25. /// 每隔多长时间不调用就让其过期
  26. /// </summary>
  27. /// <param name="cacheKey">缓存key</param>
  28. /// <param name="obj">缓存对象</param>
  29. /// <param name="expireDate">过期时间(访问缓存重置时间)</param>
  30. public static void SetSliding(string cacheKey, object obj, int expireDate= * )
  31. {
  32. //绝对到期时间
  33. var cacheEntryOptions = new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(expireDate));
  34.  
  35. _memoryCache.Set(cacheKey, obj, cacheEntryOptions);
  36. }
  37.  
  38. /// <summary>
  39. /// 判断缓存是否存在
  40. /// </summary>
  41. /// <param name="key">缓存key</param>
  42. /// <returns></returns>
  43. public static bool IsExist(string cacheKey)
  44. {
  45. if (string.IsNullOrWhiteSpace(cacheKey))
  46. {
  47. return false;
  48. }
  49. return _memoryCache.TryGetValue(cacheKey, out _);
  50. }
  51.  
  52. /// <summary>
  53. /// 获取缓存对象
  54. /// </summary>
  55. /// <param name="cacheKey">缓存key</param>
  56. /// <returns>object对象</returns>
  57. public static object Get(string cacheKey)
  58. {
  59. if (string.IsNullOrEmpty(cacheKey))
  60. {
  61. return null;
  62. }
  63. return _memoryCache.Get(cacheKey);
  64. }
  65.  
  66. /// <summary>
  67. /// 获取缓存对象
  68. /// </summary>
  69. /// <typeparam name="T">T对象</typeparam>
  70. /// <param name="cacheKey">缓存Key</param>
  71. /// <returns></returns>
  72. public static T Get<T>(string cacheKey)
  73. {
  74. if (string.IsNullOrEmpty(cacheKey))
  75. {
  76. return default(T);
  77. }
  78. if (!_memoryCache.TryGetValue<T>(cacheKey, out T cacheEntry))
  79. {
  80. return default(T);
  81. }
  82. return cacheEntry;
  83. }
  84.  
  85. /// <summary>
  86. /// 获取所有缓存键
  87. /// </summary>
  88. /// <returns></returns>
  89. public static List<string> GetCacheKeys()
  90. {
  91. const BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
  92. var entries = _memoryCache.GetType().GetField("_entries", flags).GetValue(_memoryCache);
  93. var cacheItems = entries as IDictionary;
  94. var keys = new List<string>();
  95. if (cacheItems == null) return keys;
  96. foreach (DictionaryEntry cacheItem in cacheItems)
  97. {
  98. keys.Add(cacheItem.Key.ToString());
  99. }
  100. return keys;
  101. }
  102.  
  103. /// <summary>
  104. /// 移除指定数据缓存
  105. /// </summary>
  106. /// <param name="cacheKey">缓存key</param>
  107. public static void RemoveCache(string cacheKey)
  108. {
  109. _memoryCache.Remove(cacheKey);
  110. }
  111.  
  112. /// <summary>
  113. /// 移除全部缓存
  114. /// </summary>
  115. public static void RemoveAllCache()
  116. {
  117. var keysList = GetCacheKeys();
  118. foreach (string key in keysList)
  119. {
  120. _memoryCache.Remove(key);
  121. }
  122. }
  123. }

然后根据前两篇文章所讲的依赖注入在Startup.cs里面注册

  1. services.AddMemoryCache();
  2.  
  3. services.AddSingleton<CacheHelper>();

然后就可以正常使用了。

  1. CacheHelper.SetAbsolute("admin", admin, * );

 


  欢迎大家扫描下方二维码,和我一起学习更多的知识

Redis--Memched--Cache缓存介绍使用的更多相关文章

  1. 注释驱动的 Spring cache 缓存介绍

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  2. [转]注释驱动的 Spring cache 缓存介绍

    原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...

  3. 注释驱动的 Spring cache 缓存介绍--转载

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  4. 基于Redis的Spring cache 缓存介绍

    目录 Cache API及默认提供的实现 demo 依赖包安装 定义实体类.服务类和相关配置文件 Cache注解 启用Cache注解 @CachePut @CacheEvict @Cacheable ...

  5. Spring的cache缓存介绍

    从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...

  6. springboot(九) Cache缓存和Redis缓存

    1. Cache缓存 1.1 缓存的概念&缓存注解 Cache 缓存接口,定义缓存操作.实现有:RedisCache.EhCacheCache.ConcurrentMapCache等 Cach ...

  7. django自带cache结合redis创建永久缓存

    0916自我总结 django自带cache结合redis创建永久缓存 1.redis库 1.安装redis与可视化操作工具 1.安装redis https://www.runoob.com/redi ...

  8. Windows Azure Cloud Service (43) 使用Azure In-Role Cache缓存(2)Dedicated Role

    <Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ...

  9. Spring Boot使用redis做数据缓存

    1 添加redis支持 在pom.xml中添加 <dependency> <groupId>org.springframework.boot</groupId> & ...

  10. Spring Cache简单介绍和使用

    Spring Cache 缓存是实际工作中非经常常使用的一种提高性能的方法, 我们会在很多场景下来使用缓存. 本文通过一个简单的样例进行展开,通过对照我们原来的自己定义缓存和 spring 的基于凝视 ...

随机推荐

  1. javaXML文件的写入之DOM和DOM4J

    1.DOM篇 首先是DOM的操作方法,字符串数据可以从对象中读,例如上篇提到的Person对象,这里为了方便直接手写. package com.dom.node; import javax.xml.p ...

  2. Java多线程:wait(),notify(),notifyAll()

    1. wait(),notify(),notifyAll() 2. wait() 2.1. wait() 2.2. wait(long timeout) 2.3. wait(long timeout, ...

  3. Robot framework(RF) 用户关键字

    3.6  用户关键字 在Robot Framework 中关键字的创建分两种:系统关键字和用户关键字. 系统关键字是需要通过脚本开发相应的类和方法,从而实现某一逻辑功能. 用户关键字是根据业务的需求利 ...

  4. JavaScript 字符串反转

    第一种方法:使用内置方法 split()方法将一个字符串对象的每个字符拆出来,并且将每个字符串当成数组的每个元素 reverse()方法用来改变数组,将数组中的元素倒个序排列,第一个数组元素成为最后一 ...

  5. URL 规范 整理

    URL 规范 不用大写:(强制) 用中杠-不用下杠_:(强制) 参数列表要encode,编码使用utf-8:(强制) URI中的名词表示资源集合,使用复数形式.(建议) 增加版本号(建议) URI中统 ...

  6. 从 源码 谈谈 redux compose

    compose,英文意思 组成,构成. 它的作用也是通过一系列的骚操作,实现任意的.多种的.不同的功能模块的组合,用来加强组件. 看看源码 https://github.com/reactjs/red ...

  7. 使用FluentScheduler和IIS预加载在asp.net中实现定时任务管理

    FluentScheduler介绍 github地址:https://github.com/fluentscheduler/FluentScheduler FluentScheduler是一个简单的任 ...

  8. 0516js综合练习

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  9. springboot之启动原理解析

    前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...

  10. Java公开课-05.log4j

    log4j 一,log4j简介 1.如果程序中出现异常,我们怎么解决? 01.使用异常处理机制===>异常 (但是使用原则是,能不用异常处理机制,最好不用,怎么办?) 02.通过debug调试 ...