Nancy之Cache的简单使用
一、前言
说起缓存,或许大家都不陌生,甚至是天天都在用!当然缓存也被分的越来越细,页面缓存、数据缓存、文件缓存等等。
其实呢,我个人觉得,主要还是两大类:数据的缓存和页面的缓存。数据缓存的话就包括所有跟数据扯上关系的都可以
归到这一类,至于页面缓存的话,就是把一些页面缓存起来,尤其是静态的页面,对访问速度可以说是杠杠的。本文主要
介绍的是数据的缓存。当然本文说是这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的简单使用的更多相关文章
- Nancy和MVC的简单对比
Nancy和MVC的简单对比 在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy ...
- .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比
在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...
- cache 的简单认识与思考
之前对NOSQL的总结是:基本功能是key-value, 然后各自附加特殊功能. 现在简单的来认识一下cache. 背景 大家都知道NoSQL, 大多数都是 key-value 型的数据库.有些内存型 ...
- LRU Cache的简单c++实现
什么是 LRU LRU Cache是一个Cache的置换算法,含义是“最近最少使用”,把满足“最近最少使用”的数据从Cache中剔除出去,并且保证Cache中第一个数据是最近刚刚访问的,因为这样的数据 ...
- spring使用@Cache的简单实现
基于xml的配置感觉没有注解形式简单明了,咱不考虑了. 进入正题之前先提个疑问,希望知道的人能告诉一下 下述介绍会有这段代码: @Cacheable(value="myCache" ...
- LRU cache缓存简单实现
LRU cache LRU(最近最少使用)是一种常用的缓存淘汰机制.当缓存大小容量到达最大分配容量的时候,就会将缓存中最近访问最少的对象删除掉,以腾出空间给新来的数据. 实现 (1)单线程简单版本 ( ...
- [Java 缓存] Java Cache之 Guava Cache的简单应用.
前言 今天第一次使用MarkDown的形式发博客. 准备记录一下自己对Guava Cache的认识及项目中的实际使用经验. 一: 什么是Guava Guava工程包含了若干被Google的 Java项 ...
- 基于LRU Cache的简单缓存
package com.test.testCache; import java.util.Map; import org.json.JSONArray; import org.json.JSONExc ...
- 使用Springboot Cache做简单缓存
使用Springboot Cache做简单缓存 1.简单介绍 当我们需要展示数据的时候,后台会根据需要从服务器中获取数据,但是频繁的请求数据库会对服务造成压力,于是我们引入了缓存这个概念. 当 ...
随机推荐
- 测试MailUtils,作用是发邮件
package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...
- DBImport v3.5 中文版发布:数据库定时同步及文档生成工具(IT人员必备)
前言: 趁着最近的休息时间,只能多勤快些:多写代码,多更新文章. 因为一旦投入新的工作,估计博客又会恢复到一年才产几篇的状态. 对于DBImport,因为用户的意见,增加了一个亮点功能,让软件B格升为 ...
- ABP理论学习之Abp Session
返回总目录 本篇目录 介绍 注入Session 使用Session属性 介绍 当应用程序要求用户登录时,那么应用程序也需要知道当前用户正在执行的操作.虽然ASP.NET本身在展现层提供了Session ...
- Hadoop学习笔记—18.Sqoop框架学习
一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...
- Windows Azure Storage (21) 使用AzCopy工具,加快Azure Storage传输速度
<Windows Azure Platform 系列文章目录> Update 2016-09-28 想要在Azure云端,使用AzCopy工具,从Azure China 上海数据中心存储账 ...
- struts2 标签怪事
<s:if test="4 ge 3">111</s:if><s:else>222</s:else> 结果竟然是222 难道不是 4 ...
- jquery插件的两种形式
这里总结一下jquery插件的两种形式,一种是通过字面量的形式组织代码,另一种是通过构造函数的方式.下面就两种形式来分析俩个例子. 例子1: ;(function ($,window,document ...
- MySQL_01之MySQL数据库基础
1.通过SQL(结构化查询语言)操作数据库: DDL:数据定义语言,创建库,创建表,选择: DML:数据操作语言,完成数据增删改: DQL:数据查询语言,完成数据查询: DCL:数据控制语言,授权.回 ...
- 【已解决】WinPhone模拟器报错:模拟器没法确定来宾虚拟机通信的主机ID地址。某些功能已被禁用
先看警告 再看错误信息 计算机管理打不开就==>Win+R ==>compmgmt.msc 发现,dnt在管理员权限组里面,也在Hyper-V权限组里面 看看Hyper-V的驱动有木有被禁 ...
- OpenCASCADE DataExchange DWG
OpenCASCADE DataExchange DWG eryar@163.com Abstract. DWG is a file format created in the 70’s for th ...