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.简单介绍 当我们需要展示数据的时候,后台会根据需要从服务器中获取数据,但是频繁的请求数据库会对服务造成压力,于是我们引入了缓存这个概念. 当 ...
随机推荐
- Javaee中文乱码解决方法
分类: javaee2015-07-09 16:35 29人阅读 评论(0) 收藏 编辑 删除 post 中文乱码解决方式 接受数据的时候设置 request.setCharacterEncoding ...
- 参加MVP OpenDay 和2015 MVP Community Camp社区大课堂
微软MVP Openday 1月30日在北京召开,到时全国上百位 MVP 专家将齐聚北京.当然还有亚太的其他国家地区的MVP 也会来北京,1月31日微软 MVP 项目组主办的年度微软技术社区分享大会- ...
- Hybrid App移动应用开发初探
一.移动App类型及其优缺点 1.1 Native App Native App(原生App)是用原生语言(Object-C/Java/C#/....)开发,用户需要下载安装的手机应用. 优点是 可以 ...
- Key/Value之王Memcached初探:一、掀起Memcached的盖头来
一.Memcached是何方神圣? 在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的HttpRuntim ...
- Java动态编译
程序产生过程 下图展示了从源代码到可运行程序的过程,正常情况下先编译(明文源码到字节码),后执行(JVM加载字节码,获得类模板,实例化,方法使用).本文来探索下当程序已经开始执行,但在.class甚至 ...
- 【ssh信任关系】解决信任关系不生效问题
配置的时候遇见点问题,发现即便将id_rsa.pub拷贝到了另一台机器上,信任也没有建立起来. 原因是另外一台机器上目录权限不对,可以通过su root后观察/var/log/message里的日志信 ...
- LINQ系列:LINQ to SQL Transact-SQL函数
1. CASE WHEN ... THEN ... var expr = from p in context.Products select new { 商品ID = p.ProductID, 商品名 ...
- 判断checkbox的checked状态(jQuery写法)
$('#checkboxInput').click(function(){ if (this.checked){ $('.questionContainer').css({ "opacity ...
- 我被比特币撞了一下腰——记OKCoin试用体验
本博客还有大量的.NET开源技术文章,您可能感兴趣: 1.开源Math.NET基础数学类库使用系列文章:链接 2.开源C#彩票数据资料库系列文章:链接 3.开源的.NET平台ORM组件文章:链接 4. ...
- 谈谈基于OAuth 2.0的第三方认证 [中篇]
虽然我们在<上篇>分别讨论了4种预定义的Authorization Grant类型以及它们各自的适用场景的获取Access Token的方式,我想很多之前没有接触过OAuth 2.0的读者 ...