一、前言

说起缓存,或许大家都不陌生,甚至是天天都在用!当然缓存也被分的越来越细,页面缓存、数据缓存、文件缓存等等。

其实呢,我个人觉得,主要还是两大类:数据的缓存和页面的缓存。数据缓存的话就包括所有跟数据扯上关系的都可以

归到这一类,至于页面缓存的话,就是把一些页面缓存起来,尤其是静态的页面,对访问速度可以说是杠杠的。本文主要

介绍的是数据的缓存。当然本文说是这Nancy中使用,但是这一块是通用的,无论你是在MVC、WebForm、甚至是最新的

Asp.Net Core都是基本一致的。可以选择的缓存类型又有很多,可以用微软自己的MemoryCache,可以用牛逼的Redis,当然

也可以用分布式缓存MemCached,如果问要怎么选的话,那就是视情况而定!

说起数据缓存,最直接想到的肯定就是对时间的缓存。在某个页面显示一个时间,缓存了10秒的话,那这10秒怎么刷新都是不换

变化的。这个可以说是理解缓存最最最简单的一个例子了。下面就来看看Demo吧。

二、用MemoryCache的Demo

先简单介绍一下MemoryCache吧,MemoryCache是位于System.Runtime.Caching下面的一个类。

里面具体的一些属性和方法可以参见msdn上的介绍

https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache

值得一提的是Default这个属性。这个属性也是我们等下要用到的。MemoryCache中的实现用了单例模式,更具体的可以参见源码

http://referencesource.microsoft.com/#System.Runtime.Caching/System/Caching/MemoryCache.cs

好了,不废话了,开始正题了。

首先定义一个ICache的接口

 namespace NancyFxDemo01.MyCache
{
public interface ICache
{
/// <summary>
/// 添加缓存对象
/// </summary>
/// <param name="key">缓存Key</param>
/// <param name="obj">要缓存的对象</param>
void Add(string key, object obj);
/// <summary>
/// 添加有时间限制的缓存对象
/// </summary>
/// <param name="key">缓存Key</param>
/// <param name="obj">要缓存的对象</param>
/// <param name="seconds">缓存时间</param>
void Add(string key, object obj, int seconds);
/// <summary>
/// 判断指定的Key是否已经有缓存数据
/// </summary>
/// <param name="key">缓存Key</param>
/// <returns>true/false</returns>
bool Exists(string key);
/// <summary>
/// 获取缓存的对象
/// </summary>
/// <typeparam name="T">缓存对象的类型</typeparam>
/// <param name="key">缓存Key</param>
/// <returns>缓存的对象</returns>
T Get<T>(string key);
/// <summary>
/// 移除缓存项
/// </summary>
/// <param name="key">缓存Key</param>
void Remove(string key);
}
}

这个接口应该没有什么好说的,了解过缓存的应该都是懂的,不过写的也不全,像清空缓存等方法还是没有写,不都都是挺好理解的。

有了接口,肯定会有实现!Cache就是基于MemoryCache实现的。

 using System;
using System.Runtime.Caching;
namespace NancyFxDemo01.MyCache
{
public class Cache : ICache
{
private readonly MemoryCache _cache;
private readonly CacheItemPolicy _defaultCacheItemPolicy;
public Cache()
{
_cache = MemoryCache.Default;
_defaultCacheItemPolicy = new CacheItemPolicy { SlidingExpiration = TimeSpan.FromSeconds( * ) };
}
/// <summary>
/// 添加缓存对象
/// </summary>
/// <param name="key">缓存Key</param>
/// <param name="obj">要缓存的对象</param>
public void Add(string key, object obj)
{
var cacheItem = new CacheItem(key, obj);
_cache.Set(cacheItem, _defaultCacheItemPolicy);
}
/// <summary>
/// 添加有时间限制的缓存对象
/// </summary>
/// <param name="key">缓存Key</param>
/// <param name="obj">要缓存的对象</param>
/// <param name="seconds">缓存时间</param>
public void Add(string key, object obj, int seconds)
{
_cache.Set(key, obj, DateTimeOffset.Now.AddSeconds(seconds));
}
/// <summary>
/// 判断指定的Key是否已经有缓存数据
/// </summary>
/// <param name="key">缓存Key</param>
/// <returns>true/false</returns>
public bool Exists(string key)
{
return _cache.Get(key) != null;
}
/// <summary>
/// 获取缓存的对象
/// </summary>
/// <typeparam name="T">缓存对象的类型</typeparam>
/// <param name="key">缓存Key</param>
/// <returns>缓存的对象</returns>
public T Get<T>(string key)
{
return (T)_cache.Get(key);
}
/// <summary>
/// 移除缓存项
/// </summary>
/// <param name="key">缓存Key</param>
public void Remove(string key)
{
_cache.Remove(key);
}
}
}

前面说过,会用到Default这个属性。我是在构造函数中去赋值的。那些常规的操作就是通过MemoryCache.Default去进行操作的!

下面就是Nancy的代码了,如果对Nancy还有疑问的话,可以去看看我前面介绍Nancy的文章。

 using System;
using Nancy;
using NancyFxDemo01.MyCache;
namespace NancyFxDemo01
{
public class FirstModule : NancyModule
{
public FirstModule()
{
Get["/"] = _ =>
{
string time = DateTime.Now.ToString();
ICache cache = new Cache();
if (!cache.Exists("time"))
{
cache.Add("time", time , );
return DateTime.Now.ToString();
}
return cache.Get<string>("time");
};
}
}
}

效果图:

可以看到,这个时间被缓存了10秒,十秒之后才会发生变化。

三、用Redis的Demo

Redis可以说是神器啊,它的性能确实比memcached要好一些。

要用Redis,肯定要先装一个redis,这个是必不可少的,本人装的是windows版,具体如下:

当然,这只是个大前提,要想去操作Redis还得用工具的,这个时候我们可以通过NuGet去安装

StackExchange.Redis 或者是 ServiceStack.Redis ,相信这两个是大家用的最多的。

示例用的是StackExchange.Redis这个包。

 using System;
using Nancy;
using StackExchange.Redis;
namespace NancyFxDemo01
{
public class SecondModule : NancyModule
{
private string _host = "127.0.0.1";
public SecondModule()
{
Get["/redis"] = _ =>
{
string time = DateTime.Now.ToString();
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(_host);
IDatabase db = redis.GetDatabase();
if (!db.KeyExists("time"))
{
db.StringSet("time", time, TimeSpan.FromSeconds());
} return db.StringGet("time").ToString() ;
};
}
}
}

这个是在Nancy中使用Redis的代码,这里的话就没对Reids的操作进行封装,是直接在方法里面进行了操作。

下面是效果图

可以看到效果已经出来了!!!

至于memcached的话,就不在做Demo演示了。

四、总结

本文这两个例子比较简单,但是应该是通俗易懂的。不过篇幅基本都在介绍缓存,只是在Nancy中使用到了

这些知识而已。缓存说复杂的话,它并不那么复杂,无非就是读和写。但是说简单,它也并不简单,用的时机以及怎么用

对一个网站会带来很重要的影响。

后面有时间的话会用Nancy和Redis做一个复杂一点的例子。

Nancy之Cache的简单使用的更多相关文章

  1. Nancy和MVC的简单对比

    Nancy和MVC的简单对比 在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy ...

  2. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  3. cache 的简单认识与思考

    之前对NOSQL的总结是:基本功能是key-value, 然后各自附加特殊功能. 现在简单的来认识一下cache. 背景 大家都知道NoSQL, 大多数都是 key-value 型的数据库.有些内存型 ...

  4. LRU Cache的简单c++实现

    什么是 LRU LRU Cache是一个Cache的置换算法,含义是“最近最少使用”,把满足“最近最少使用”的数据从Cache中剔除出去,并且保证Cache中第一个数据是最近刚刚访问的,因为这样的数据 ...

  5. spring使用@Cache的简单实现

    基于xml的配置感觉没有注解形式简单明了,咱不考虑了. 进入正题之前先提个疑问,希望知道的人能告诉一下 下述介绍会有这段代码: @Cacheable(value="myCache" ...

  6. LRU cache缓存简单实现

    LRU cache LRU(最近最少使用)是一种常用的缓存淘汰机制.当缓存大小容量到达最大分配容量的时候,就会将缓存中最近访问最少的对象删除掉,以腾出空间给新来的数据. 实现 (1)单线程简单版本 ( ...

  7. [Java 缓存] Java Cache之 Guava Cache的简单应用.

    前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项 ...

  8. 基于LRU Cache的简单缓存

    package com.test.testCache; import java.util.Map; import org.json.JSONArray; import org.json.JSONExc ...

  9. 使用Springboot Cache做简单缓存

    使用Springboot Cache做简单缓存 1.简单介绍 ​ 当我们需要展示数据的时候,后台会根据需要从服务器中获取数据,但是频繁的请求数据库会对服务造成压力,于是我们引入了缓存这个概念. ​ 当 ...

随机推荐

  1. SSH学习笔记

    Struts2登录模块处理流程: 浏览器发送请求http://localhost/appname/login.action,到web应用服务器: 容器接收到该请求,根据web.xml的配置,服务器将请 ...

  2. 学习笔记:java线程安全

    首先得明白什么是线程安全: 线程安全是编程中的术语,指某个函数 (计算机科学).函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成. 这是维基百科里的资料,看完后还不是 ...

  3. 框架设计之ADO.NET Command的ExecuteScalar误用情景及底层解说

    最近下载了点资料,学了学Android,发现Android入门还算简单,从.NET过渡到Android,也就三七十一天的事. 大伙有空也可以学学... 好了,言归正文,那日,有网友发了一个他们公司的数 ...

  4. Expert 诊断优化系列-------------针对重点语句调索引

    上一篇我们说了索引的重要性,一个索引不仅能让一条语句起飞,也能大量减少系统对CPU.内存.磁盘的依赖.我想上一篇中的例子可以说明了.给出上一篇和目录文链接: SQL SERVER全面优化------- ...

  5. Verlet-js JavaScript 物理引擎

    subprotocol最近在Github上开源了verlet-js.地址为https://github.com/subprotocol/verlet-js.verlet-js是一个集成Verlet的物 ...

  6. 每天一个linux命令(49):at命令

    在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...

  7. 简单了解JS 中的indexOf方法

    indexOf() 方法返回指定值在字符串对象中首次出现的位置.从 fromIndex 位置开始查找,如果不存在,则返回 -1. 首先先看下MDN下的参考文档,文档里列出的很详细,这里我只列出了注意点 ...

  8. IIS7.5+WebConfig实现页面伪静态和301重定向

    IIS7.5+WebConfig实现页面伪静态和301重定向 使用URLRewriter组件在windows 2003 +iis 6.0下配置伪静态的文章网络上一大堆.但在iis7.0或iis 7.5 ...

  9. jQuery源码分析系列(40): 动画设计

    前言 jQuery动画是通过animate这个API设置执行的,其内部也是按照每一个animate的划分封装了各自动画组的行为, 包括数据过滤.缓动公式.一些动画默认参数的设置.元素状态的调整.事件的 ...

  10. 轻量级前端MVVM框架avalon源码分析-总结

    距avalon0.7版本发布有一段时间,由于之前的稳定性,就停止一段时间更新,期间研究了下Knockout源码,也尝试写了一个小型的mvvm的实现模型,仅仅只是仿造ko的核心实现,把无关的东西给剥离掉 ...