一、前言

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

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

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

介绍的是数据的缓存。当然本文说是这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. 大家一起Aop

    一.前言 1.在项目中无处不充斥着记录日志的代码,各种try catch,实在是有点看着不爽.这不,果断要想法子偷个懒儿. 二.摘要 鄙人不才,先总结一下个人想到的可实现AOP的几种思路: 1.通过继 ...

  2. Visual Studio 2015 前端开发工作流

    Visual Studio 2015 CTP 5,全称为 Visual Studio 2015 Community Technology Preview 5,意为社区技术预览版,之前的版本为:Visu ...

  3. Hadoop 和 HDInsight:Windows Azure 中的大数据

    世界的大数据包含一个庞大而充满活力的生态系统,但一个开放源码项目上面有这一切,那就是 Hadoop 的王朝. Hadoop 是事实上的标准的分布式的数据运算.Hadoop 提供了一个 MapReduc ...

  4. 剑指Offer面试题:11.打印1到最大的n位数

    一.题目:打印1到最大的n位数 题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1.2.3一直到最大的3位数即999. 二.不同的解法 2.1 不假思索的解法 最容易想到的办 ...

  5. C语言 · 求矩阵各个元素的和

    问题描述 这里写问题描述. 输入格式 测试数据的输入一定会满足的格式. 例:输入的第一行包含两个整数n, m,分别表示矩阵的行数和列数.接下来n行,每行m个正整数,表示输入的矩阵. 输出格式 要求用户 ...

  6. x86汇编程序基础(AT&T语法)

    一.简单的汇编程序 以下面这段简单的汇编代码为例 .section .data .section .text .globl _start _start: movl $, %eax movl $, %e ...

  7. Math的三个将小数值舍入为整数方法

    舍入规则: Math.ceil():执行向上舍入,即它总是将数值向上舍入为最接近的整数: Math.floor():执行向下舍入,即它总是将数值向下舍入为最接近的整数: Math.round():执行 ...

  8. MVC实用架构设计(三)——EF-Code First(4):数据查询

    前言 首先对大家表示抱歉,这个系列已经将近一个月没有更新了,相信大家等本篇更新都等得快失望了.实在没办法,由于本人水平有限,写篇博客基本上要大半天的时间,最近实在是抽不出这么长段的空闲时间来写.另外也 ...

  9. Web APi之捕获请求原始内容的实现方法以及接受POST请求多个参数多种解决方案(十四)

    前言 我们知道在Web APi中捕获原始请求的内容是肯定是很容易的,但是这句话并不是完全正确,前面我们是不是讨论过,在Web APi中,如果对于字符串发出非Get请求我们则会出错,为何?因为Web A ...

  10. 出操队形(LIS)

    题目来源:微策略2013年校园招聘面试一面试题 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往楼下跑了,然后身高矮的排在队伍的前面,身高较 ...