Net 内置内存缓存

asp.net 中是有缓存的实现:HttpContext.Cache,缓存的数据是放到 Web 服务器的进程 内存里。

在控制台、WinForm、子线程、SignalR 等不支持 HttpContext 的地方还可以使用 MemoryCache.Default(System.Runtime.Caching 这个程序集中) ,HttpContext.Cache 其实就是 对 MemoryCache 的封装。

//写入:
MemoryCache.Default.Add("age", 666, DateTimeOffset.Now.AddMinutes(1));
//读取:
if(MemoryCache.Default.Contains("name"))
{
int age = (int)MemoryCache.Default["age"];
}

进程内缓存最大的优点就是效率高。在可预期数据量不大的情况下推荐使用。 如果数据量比较大或者集群服务器比较多,就要用单独的分布式缓存了,也就是搞一台 或者多台专门服务器保存缓存数据,所有服务器都访问分布式缓存服务器。

Memcached

简介

Memcached 是一个专门用来做缓存的服务器,而且缓存的数据都在内存中。Memcached 就相当于一个 Dictionary 键值对集合,保存的是键值对,然后根据 key 取 value。 当然 web 服务器和 Memcached 之间还是要网络间通讯,效率还是没有进程内缓存效率 高。Memcached 程序重启之后数据就会消失。

安装

memcached.exe -d install

卸载

memcached.exe -d uninstall

.Net 连接 memcached 安装

Memcached 的.Net 开发包:Install-Package EnyimMemcached

  1. Memcache 存入的是键值对。Memcache 存入数据的 3 中模式 Set、Replace、Add,根据名 字就能猜出来:
  • Set:存在则覆盖,不存在则新增
  • Replace:如果存在则覆盖,并且返回 true;如果不存在则不处理,并且返回 false;
  • Add:如果不存在则新增,并且返回 true;如果存在则不处理,并且返回 false;

没特殊要求一般用 Set 就可以了。

MemcachedClientConfiguration mcConfig = new MemcachedClientConfiguration(); mcConfig.AddServer("127.0.0.1:11211");
//必须指定端口
using (MemcachedClient client = new MemcachedClient(mcConfig))
{
client.Store(Enyim.Caching.Memcached.StoreMode.Set, "name", "rsfy");
}

如果保存普通类对象,则对象必须可序列化(不同 Memcached 客户端保存对象的机制 都不尽相同)。

2)存入设置过期时间 设置最后一个 TimeSpan 类型的参数:

client.Store(Enyim.Caching.Memcached.StoreMode.Set, "name", "yzk",TimeSpan.FromSeconds(5));

如果之前对于同一个 Key 设置过一个过期时间,之后又设置过一个,以最后一次的为准。

3)读取:如果找不到,则返回 null

client.Get("name");

当然也可以用

public bool TryGet(string key, out object value)

当然还支持泛型的

public T Get<T>(string key)
  1. Remove(string key)则是删除一个 key 对应的内容。 Key 的长度最高是 250 个字符,Value 最长 1M。 与 Store、Get、Remove 配套的还有 ExecuteXXX 方法,唯一区别就是返回值信息更详细。

5)Key 的选择: Memcaced就相当于一个大键值对,不同系统放到Memcached中的数据都是不隔离的, 因此设定 Key 的时候要选择好 Key,这样就不容易冲突。建议规则“系统名字_模块名字_业务_Key”,比如“Shop_Admin_FilterWords”

6) Increment、Decrement 是用来对计数器进行增减的,不过用得少。用 Redis 更合适。

Cas 操作:

用来解决并发问题:读出一个值,做一些判断或者处理,再写回,有可能有并发的问题。 Cas 是 Memcached 1.2.5 之后引入的特性,类似于数据库的“乐观锁”,查询的时候查出一个 cas 值,在写入的时候带着这个 cas 值,如果发现 cas 值已经变了,则说明已经有别人改过了。 下面的程序:

var cas = client.GetWithCas("Name");
Console.WriteLine("按任意键继续");
Console.ReadKey();
var res = client.Cas(Enyim.Caching.Memcached.StoreMode.Set, "Name", cas.Result + "1", cas.Cas);
if(res.Result) {
Console.WriteLine("修改成功");
} else {
Console.WriteLine("被别人改了");
}

启动两个实例,测试效果。 Memcached 一般就是做缓存用,因此也不要用这个 Cas。

memcached 的集群

memcached 重启之后短时间内大量的请求会涌入数据库,给数据库造成压力,解决这 个的方法就是使用集群,有多台 Memcached 服务器提供服务。 当 memcached 服务器压力大了之后也有必要搞 memcached 集群来分担压力。 Memcached 服务器的“雪崩”问题:如果所有缓存设置过期时间一样,那么每隔一段 时间就会造成一次数据库访问的高峰:

**解决的方法就是缓存时间设置不一样,比如加上一个随机数。 **

Memcached 的集群实现很简单,集群节点直接不进行通讯、同步,只要在多个服务器 上启动多个 Memcached 服务器即可,客户端决定把数据写入不同的实例,不搞主从复制, 每个数据库实例保存一部分内容。 然后 mcConfig.AddServer("127.0.0.1:11211");添加多个服务器 ip 地址,然后客户端根据 自己的算法决定把数据写入哪个 Memcached 实例,取数据库的时候再根据同样的定位算法 去哪台服务器上去取。 节点定位算法有很多种,最常用的有两种 Ketama、VBucket。Ketama 是根据 Key 算出一 个 hash 值,根据 hash 值再算到服务器;而 VBucket 也是根据 key 算出 hash 值,但是不是直 接根据 hash 值算出服务地址,而是维护一个 VBucket 表,在表中指定不同的 hash 值由不同 的服务器处理,还可以临时改变指向。建议用 Ketama 就可以了。节点定位算法会自动处理 故障服务器。

mcConfig.NodeLocatorFactory = new KetamaNodeLocatorFactory()。

缓存要求都 不高。

Memcached 封装示例

/// <summary>
/// 获取token
/// </summary>
/// <param name="args"></param>
/// <returns>token</returns>
/// <exception cref="ArgumentException"></exception>
public static string JwtEncoding(Dictionary<string, object> args)
{
var payload = args.Count == 0 ? throw new ArgumentException($"{nameof(args)}长度为0") : args;
var secret = ConfigurationManager.AppSettings["Jwt"];
IJwtAlgorithm algorithm = new HMACSHA256Algorithm();
IJsonSerializer serializer = new JsonNetSerializer();
IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder();
IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder);
var token = encoder.Encode(payload, secret);
return token;
}
/// <summary>
/// 解token
/// </summary>
/// <param name="token">token</param>
/// <returns></returns>
public static Dictionary<string, object> JwtDecoding(string token)
{
Dictionary<string, object> data = null;
try
{
var secret = ConfigurationManager.AppSettings["Jwt"];
var serializer = new JsonNetSerializer();
var algorithm = new HMACSHA256Algorithm();
IDateTimeProvider provider = new UtcDateTimeProvider();
IJwtValidator validator = new JwtValidator(serializer, provider);
var urlEncoder = new JwtBase64UrlEncoder();
IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder, algorithm);
var json = decoder.Decode(token, secret, verify: true);
data = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
}
catch (TokenExpiredException)
{
Console.WriteLine("Token has expired");
return null;
}
catch (SignatureVerificationException)
{
Console.WriteLine("Token has invalid signature");
return null;
}
catch (Exception e)
{
return null;
}
return data;
}

dotnet 缓存的更多相关文章

  1. 使用dotnet build时复制引用dll到生成目录

    默认配置下dotnet build只会输出项目代码的dll,依赖用的是dotnet缓存中的dll,只有dotnet publish才会把依赖的dll一起输出到生成目录. 在项目csproj文件中添加以 ...

  2. .NET 2.0 参考源码索引

    http://www.projky.com/dotnet/2.0/Microsoft/CSharp/csharpcodeprovider.cs.htmlhttp://www.projky.com/do ...

  3. 微软注册dll在dotnet开发时起到缓存的作用

    经过试验,我发觉只要是注册了dll之后,会在全局的环境中得到很好的体现,比如无需指定具体物理路径的dll引用,搜索即可引用等,同时也得到一点: 1.会缓存起这个dll先,在不重启电脑的情况,本地物理路 ...

  4. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  5. 『.NET Core CLI工具文档』(六)dotnet 命令

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet command 翻译:dotnet 命令 名称 dotnet -- 运行命令行命令的一般驱动程序 概要 d ...

  6. [转]如何循序渐进向dotnet架构师发展

    微软的DotNet开发绝对是属于那种入门容易提高难的技术.而要能够成为DotNet架构师没有三年或更长时间的编码积累基本上是不可能的.特别是在大 型软件项目中,架构师是项目核心成员,承上启下,因此RU ...

  7. Cache,MemCache,Application,Cookie等其它缓存汇总

    为了提高网页运行速度我们用到了各种缓存技术,今天就来汇总下,相信聪明的你也一定会有所收获的o(^▽^)o 1.Cache(PS:看见一个博客介绍的不错,我就直接Copy了) Cache 即高速缓存.那 ...

  8. 传智播客DotNet面试题

    技术类面试.笔试题汇总(整理者:杨中科,部分内容从互联网中整理而来) 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...

  9. [Cache] C#操作缓存--CacheHelper缓存帮助类 [复制链接]

    using System;using System.Web;using System.Collections; namespace DotNet.Utilities{ public class Cac ...

  10. DotNet 资源大全中文版,内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等

    DotNet 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器. ...

随机推荐

  1. i春秋破译

    点开题目就是一段密文 TW5650Y - 0TS UZ50S S0V LZW UZ50WKW 9505KL4G 1X WVMUSL510 S001M0UWV 910VSG S0 WFLW0K510 1 ...

  2. 关于linux fcitx输入法候选词中含有省略号的问题解决

    前言 这几天舍弃了 sogou 输入法,换上了google拼音输入法,因为我在纯文本终端调用中文输入法,搜狗显示出来的是加密的,候选词都是加密的,很烦这种 问题原因 这个问题主要是因为 云拼音 模块凉 ...

  3. 谁说.NET没有GC调优?只改一行代码就让程序不再占用内存

    经常看到有群友调侃"为什么搞Java的总在学习JVM调优?那是因为Java烂!我们.NET就不需要搞这些!"真的是这样吗?今天我就用一个案例来分析一下. 昨天,一位学生问了我一个问 ...

  4. openpyxl写数据

    import osimport openpyxlos.chdir(r'D:/openpyxl') wb = openpyxl.Workbook() sht = wb.create_sheet('dat ...

  5. 动态SQL遇到的问题

    看图 查不出来任何数据 因为判断有问题 修改方法如下:

  6. overflow:scroll修改样式

    当overflow :scroll 出现滚动条后,默认的滚动条样式太丑了,不是我们想要的,那么我们来修改一下吧!~ 话不多说,直接上代码  /* 定义滚动条样式 */ ::-webkit-scroll ...

  7. 02- 快速入门MybatisPlus

    创建表 现有一张 User 表,其表结构如下: id name age email 1 Jone 18 test1@baomidou.com 2 Jack 20 test2@baomidou.com ...

  8. MongoDB从入门到实战之Docker快速安装MongoDB

    前言 在上一篇文章中带领带同学们快速入门MongoDB这个文档型的NoSQL数据库,让大家快速的了解了MongoDB的基本概念.这一章开始我们就开始实战篇教程,为了快速把MongoDB使用起来我将会把 ...

  9. [编程基础] Python中的绝对导入与相对导入

    如果您从事的Python项目有多个文件,那么您以前可能不得不使用import语句.即使对于拥有多个项目的Python重度使用者(比如我),import也可能会造成混淆!您可能正在阅读本文,因为您想对P ...

  10. Amber22 安装过程miniconda报错处理

    最近在安装amber22时,使用其官方说明安装,但在安装miniconda这一步出错,致使amber22安装不成功! 报错如下: CondaFileIOError: '/home/lbm/amber2 ...