学习
实践
活动
工具
TVP
写文章
专栏首页.Net、.Net Core 、DockerRedis--Memched--Cache缓存介绍使用

Redis--Memched--Cache缓存介绍使用

目录:

一、分布式缓存—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/复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • SpringBoot缓存注解@Cacheable使用姿势介绍

    Spring在3.1版本,就提供了一条基于注解的缓存策略,实际使用起来还是很丝滑的,本文将针对几个常用的注解进行简单的介绍说明,有需要的小伙伴可以尝试一下

    一灰灰blog
  • web缓存介绍

    web缓存是什么,其实就是一些静态的资源及数据存储到本地浏览器或者是服务器上。缓存会根据进来的请求保存输出内容的副本,当下一个请求来到的时候,如果是相同的UR...

    OECOM
  • 文件缓存介绍

    随着网络的发展,数据越来越多,从而导致运算压力越来越大。为了解决这一问题,就需要合理分配资源,充分利用已有资源,缓存的工作实际就是资源的合理分配。 在w...

    wangxl
  • PHP缓存技术介绍

    缓存是指临时文件交换区,电脑把最常用的文件从存储器里提出来临时放在缓存里,就像把工具和材料搬上工作台一样,这样会比用时现去仓库取更方便。因为缓存往往使用的是RA...

    用户7657330
  • Spring系列缓存注解@Cacheable @CacheEvit @CachePut 使用姿势介绍

    Spring在3.1版本,就提供了一条基于注解的缓存策略,实际使用起来还是很丝滑的,本文将针对几个常用的注解进行简单的介绍说明,有需要的小伙伴可以尝试一下

    一灰灰blog
  • 后端:MyBatis缓存知识介绍

    今天给大家分享一下MyBatis缓存知识介绍,希望对大家日常的开发当中能有所帮助!

    IT技术分享社区
  • Caffeine缓存的简单介绍

    一个清理策略会决定在某个给定时间哪些对象应该被删除,这个策略直接影响缓存的命中率——缓存库的一个关键特性。

    用户7353950
  • HTTP缓存相关知识介绍

    HTTP协议的缓存是通过6个报文头完成的,通过两层协商使web资源能够不那么频繁地在服务器与客户端之间传递,从而节约了流量,提高浏览速度。以从客户端到服务器的顺...

    IT技术分享社区
  • java缓存技术的介绍

    一、什么是缓存 1、Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问 2、凡是位于速度相差较大的两种硬件/软件之...

    全栈程序员站长
  • Python开发:缓存机制介绍

    缓存是一种将定量数据加以保存以备迎合后续请求的处理方式,旨在加快数据的检索速度。在今天的文章中,我们将一同从简单示例出发,了解如何使用缓存机制。在此之后,我们将...

    CDA数据分析师
  • SpringBoot 缓存之 @Cacheable 详细介绍

    Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springf...

    用户8639654
  • 浏览器缓存详细介绍

      我们拿百度首页来举例:   百度搜索输入框上面的logo是一张png图片,当我们浏览器请求这张图片的时候,会先检查该图片的HTTP头部字段,是这样的

    从入门到进错门
  • OkGo使用缓存(苹果清理缓存)

    发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128573.html原文链接:https://javaforall.cn

    全栈程序员站长
  • 使用本地缓存

    缓存是高并发程序开发中的一大利器,利用缓存我们能够显著有效的提高程序的响应能力,缓存服务器和数据库的压力,市面上常用的缓存有单机缓存memcached,集群缓存...

    叔牙
  • SpringBoot缓存使用

    JSR是Java Specification Requests 的缩写 ,Java规范请求,故名思议提交Java规范,大家一同遵守这个规范的话,会让大家‘沟通’...

    Yuyy
  • 使用Cache缓存

    存放位置:服务器内存,用于频繁访问且不轻易更改的内容缓存。 string CacheKey = "CT1"; //检索指定项, object objModel ...

    纯粹是糖
  • SpringBoot使用缓存

    dalaoyang
  • 使用memcache缓存

    allsmallpig

扫码关注腾讯云开发者

领取腾讯云代金券