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= * )
{
//绝对到期时间
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= * )
{
//绝对到期时间
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, * );
欢迎大家扫描下方二维码,和我一起学习更多的知识
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ... 原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ... 概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ... 目录 Cache API及默认提供的实现 demo 依赖包安装 定义实体类.服务类和相关配置文件 Cache注解 启用Cache注解 @CachePut @CacheEvict @Cacheable ... 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ... 1. Cache缓存 1.1 缓存的概念&缓存注解 Cache 缓存接口,定义缓存操作.实现有:RedisCache.EhCacheCache.ConcurrentMapCache等 Cach ... 0916自我总结 django自带cache结合redis创建永久缓存 1.redis库 1.安装redis与可视化操作工具 1.安装redis https://www.runoob.com/redi ... <Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ... 1 添加redis支持 在pom.xml中添加 <dependency> <groupId>org.springframework.boot</groupId> & ... Spring Cache 缓存是实际工作中非经常常使用的一种提高性能的方法, 我们会在很多场景下来使用缓存. 本文通过一个简单的样例进行展开,通过对照我们原来的自己定义缓存和 spring 的基于凝视 ... 大晚上的,突然想到,我这么喜欢听歌的人,博客里怎么能少了BGM呢,说干就干. 首先,给博客侧边栏加一个空div:<div id="music"></div> ... 问题:登录服务器时 报无监听服务 检查步骤: 1.进入sqlplus查看数据库的状态,显示当前数据库的状态为OPEN 脚本:select status from v$Instance; 2.检查数据库 ... ======================================= var count = 0; function cc(card) {// Only change code below ... body { background-color: rgb(60,60,60) } 接触C#语言只有短短几天时间,想要写出什么高大上的深入性研究文章,估计也是满篇的猜想和一些没有逻辑的推断.截至目前而言 ... 1120. Friend Numbers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Two in ... 1058. A+B in Hogwarts (20) 时间限制 50 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue If you ... 1 java事务类型 Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 常见的容器事务如Spring事务,容器事务主要是J2EE应用服务器提供 ... 我们知道在JDK6甚至之前的时候,我们想要读取一个文本文件也是非常麻烦的一件事,而现在他们都变得简单了, 这要归功于NIO2,我们先看看之前的做法: 读取一个文本文件 BufferedReader b ... 部署项目首先你需要把你的java web项目打包成war文件 在需要打包的项目上右键>选择[Export] 选中[Web]下面的[WAR file],点击[Next] 通过[Browse]选择保 ... 基于组件的项目很多,但是如果直接用包的方式直接引用到项目中,如果出现问题很难进行调试的操作,也很难进行组件的优化和管理,所以写了一篇文章来介绍下git submodule的用法,用submodule可 ...Redis--Memched--Cache缓存介绍使用的更多相关文章
随机推荐