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.简单介绍 当我们需要展示数据的时候,后台会根据需要从服务器中获取数据,但是频繁的请求数据库会对服务造成压力,于是我们引入了缓存这个概念. 当 ...
随机推荐
- 详解Maple中的基础工具栏
鉴于Maple 强大的符号计算功能,越来越多的人选择使用Maple 2015计算复杂的数学问题,初学者刚开始时需要对Maple有所熟悉才能很好地进行运用,下面就从基础开始,介绍Maple工作环境. M ...
- The Myths about Transactions (ACID) and NoSQL
There has been widespread characterization of one of the major distinctions between NoSQL and tradit ...
- CodeFirst实战:用文本数据库存档软件配置
背景: 以前要写软件的时候,在编写用户配置这一块时,由于存档数据库不靠谱或大题小作,所以一般是存在文本中. 一开始是一个文件保存一个配置(图个File.Read与File.Write的操作简单) 由于 ...
- .NET Core与.NET Framework、Mono之间的关系
随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...
- 关于大型网站技术演进的思考(二十)--网站静态化处理—web前端优化—中(12)
Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原理,很有可能掉进这些陷阱里,最终没有达到最佳 ...
- MySQL HASH分区
200 ? "200px" : this.width)!important;} --> 介绍 基于给定的分区个数,将数据分配到不同的分区,HASH分区只能针对整数进行HASH ...
- 一个新人如何学习在大型系统中添加新功能和Debug
文章背景: 今年七月份正式入职,公司主营ERP软件,楼主所在的组主要负责二次开发,使用的语言是Java. 什么叫二次开发呢?ERP软件的客户都是企业.而这些企业之间的情况都有所不同,一套标准版本的企业 ...
- I/O重定向的原理和实现
在Unix系统中,每个进程都有STDIN.STDOUT和STDERR这3种标准I/O,它们是程序最通用的输入输出方式.几乎所有语言都有相应的标准I/O函数,比如,C语言可以通过scanf从终端输入字符 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16 过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...
- Angular1还是Angular2
Angular1还是Angular2 学完angular1,尝试去看了下angular2,虽然号称更强更快,可是这基于ES6和TypeScript的全新框架让人完全招架不住,而且我只是需要angula ...