基于Asp.net Core 3.1实现的Redis及MemoryCache缓存助手CacheHelper
这几天在面试,这个关于Redis缓存的博客一直没空写,今天总算有点时间了。
从很久很久之前,我就一直想学Redis了,反正看到各大招聘网上都要求Redis,不学就太落后了。
一开始我是按微软官网文档那样配置的,然后发现这也太简单了,不止配置简单,连使用都这么简单,简单得有点过分。如下图所示,它是基于IDistributedCache接口注入的
这么简单,怎么玩,我连判断某个key值存不存在都没办法。
当然了。绝对不是这么简单的。更高级的用法如下,要引入Microsoft.Extensions.Caching.StackExchangeRedis包
ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("127.0.0.1:6379");
IDatabase cache = connection.GetDatabase();
cache.HashSet("key", "hashKey", "value");
cache.SetAdd("key2", "value");
那要怎么用在系统里呢,当然直接使用IDatabase也可以,但不够优雅,而且我还想通过配置文件,来决定是否启用Redis,如果不启用的话,就使用MemoryCache。非常好。想法有了。
先定义一个接口ICacheHelper,这是用来注入的接口,我暂时只定义了string类型跟hash类型的缓存方法
public interface ICacheHelper
{
bool Exists(string key); void Set<T>(string key, T value); T Get<T>(string key); void Delete(string key); void Expire(string key, DateTime dateTime);
void Expire(string key, TimeSpan timeSpan); void HashSet(string key, string hashKey, object hashValue);
T HashGet<T>(string key, string hashKey); bool HashExists(string key, string hashKey); void HashDelete(string key, string hashKey);
}
然后用Redis实现这个接口,RedisCacheHelper类
/// <summary>
/// Redis助手
/// </summary>
public class RedisCacheHelper : ICacheHelper
{
public IDatabase _cache; private ConnectionMultiplexer _connection; private readonly string _instance;
public RedisCacheHelper(RedisCacheOptions options, int database = )
{
_connection = ConnectionMultiplexer.Connect(options.Configuration);
_cache = _connection.GetDatabase(database);
_instance = options.InstanceName;
} public bool Exists(string key)
{
return _cache.KeyExists(_instance + key);
} public void Set<T>(string key, T value)
{
_cache.StringSet(_instance + key, CommonHelper.ObjectToJsonString(value));
} public T Get<T>(string key)
{
return CommonHelper.JsonStringToObject<T>(_cache.StringGet(_instance + key));
} public void Delete(string key)
{
_cache.KeyDelete(_instance + key);
} public void Expire(string key, DateTime dateTime)
{
_cache.KeyExpire(_instance + key, dateTime);
}
public void Expire(string key, TimeSpan timeSpan)
{
_cache.KeyExpire(_instance + key, timeSpan);
}
public void HashSet(string key, string hashKey, object hashValue)
{
string value = CommonHelper.ObjectToJsonString(hashValue);
_cache.HashSet(_instance + key, hashKey, value);
} public T HashGet<T>(string key, string hashKey)
{
var value = _cache.HashGet(_instance + key, hashKey);
return CommonHelper.JsonStringToObject<T>(value);
} public object HashGet(string key, string hashKey, Type type)
{
var value = _cache.HashGet(_instance + key, hashKey);
return CommonHelper.JsonStringToObject(value, type);
} public bool HashExists(string key, string hashKey)
{
return _cache.HashExists(_instance + key, hashKey);
} public void HashDelete(string key, string hashKey)
{
_cache.HashDelete(_instance + key, hashKey);
}
}
再用MemoryCache实现接口,MemoryCacheHelper类
/// <summary>
/// 缓存助手
/// </summary>
public class MemoryCacheHelper : ICacheHelper
{
private readonly IMemoryCache _cache;
public MemoryCacheHelper(IMemoryCache cache)
{
_cache = cache;
} public bool Exists(string key)
{
return _cache.TryGetValue(key, out _);
} public T Get<T>(string key)
{
return _cache.Get<T>(key);
} public void Delete(string key)
{
_cache.Remove(key);
} public void Set<T>(string key, T value)
{
_cache.Set(key, value);
}
public void Expire(string key, DateTime dateTime)
{
var value = _cache.Get(key);
_cache.Set(key, value, dateTime);
} public void Expire(string key, TimeSpan timeSpan)
{
var value = _cache.Get(key);
_cache.Set(key, value, timeSpan);
}
public void HashSet(string key, string hashKey, object hashValue)
{
var hash = _cache.Get<Dictionary<string, object>>(key);
if (hash.ContainsKey(hashKey))
{
hash[key] = hashValue;
}
else
{
hash.Add(hashKey, hashValue);
}
_cache.Set<Dictionary<string, object>>(key, hash);
} public T HashGet<T>(string key, string hashKey)
{
var hash = _cache.Get<Dictionary<string, object>>(key);
if (hash.ContainsKey(hashKey))
{
return (T)hash[hashKey];
}
else
{
return default(T);
}
} public bool HashExists(string key, string hashKey)
{
var hash = _cache.Get<Dictionary<string, object>>(key);
return hash.ContainsKey(hashKey);
} public void HashDelete(string key, string hashKey)
{
var hash = _cache.Get<Dictionary<string, object>>(key);
if (hash.ContainsKey(hashKey))
{
hash.Remove(hashKey);
}
}
}
实现类都有了,那现在就来实现根据配置值来决定是否使用Redis还是MemoryCache,先在appsettings.json里添加这个配置值,当Enable为false时,就不启用Redis,使用MemoryCache,Connection是Redis的连接字符串,InstanceName是缓存的前缀,Database是使用哪个数据库
"Redis": {
"Enable": true,
"Connection": "127.0.0.1:6379",
"InstanceName": "LessSharp:",
"Database":
}
再定义一个选项类 RedisOption
public class RedisOption
{
public bool Enable { get; set; }
public string Connection { get; set; }
public string InstanceName { get; set; }
public int Database { get; set; }
}
然后在Startup.cs类里的ConfigureServices里根据配置值进行注入
var RedisConfiguration = Configuration.GetSection("Redis");
services.Configure<RedisOption>(RedisConfiguration);
RedisOption redisOption = RedisConfiguration.Get<RedisOption>();
if (redisOption != null && redisOption.Enable)
{
var options = new RedisCacheOptions
{
InstanceName = redisOption.InstanceName,
Configuration = redisOption.Connection
};
var redis = new RedisCacheHelper(options, redisOption.Database);
services.AddSingleton(redis);
services.AddSingleton<ICacheHelper>(redis);
}
else
{
services.AddMemoryCache();
services.AddScoped<ICacheHelper, MemoryCacheHelper>();
}
OK,测试后完美
基于Asp.net Core 3.1实现的Redis及MemoryCache缓存助手CacheHelper的更多相关文章
- 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)
最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...
- 如何基于asp.net core的Identity框架在mysql上作身份验证处理
首先了解这个概念,我一开始也是理解和掌握基本的概念,再去做程序的开发.Identity框架是微软自己提供,基于.net core平台,可拓展.轻量 级.面向多个数据库的身份验证框架.IdentityS ...
- 基于Asp.Net Core的简单社区项目源代码开源
2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0+EF CORE 3.0开发 使用vs2019 +sqlserver 2017(数据库脚本最低支持sql server 20 ...
- AServer - 基于Asp.net core Kestrel的超迷你http服务器
AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器.它可以集成进你的Core程序里,用来快速的响应Http请求,而不需要集成整个ASP.NET Core MVC ...
- 基于ASP.NET Core 创建 Web API
使用 Visual Studio 创建项目. 文件->新建->项目,选择创建 ASP.NET Core Web 应用程序. 基于 ASP.NET Core 2.0 ,选择API,身份验证选 ...
- 基于ASP.Net Core开发的一套通用后台框架
基于ASP.Net Core开发一套通用后台框架 写在前面 这是本人在学习的过程中搭建学习的框架,如果对你有所帮助那再好不过.如果您有发现错误,请告知我,我会第一时间修改. 知其然,知其所以然,并非重 ...
- 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用
前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ...
- [译]基于ASP.NET Core 3.0的ABP v0.21已发布
基于ASP.NET Core 3.0的ABP v0.21已发布 在微软发布仅仅一个小时后, 基于ASP.NET Core 3.0的ABP v0.21也紧跟着发布了. v0.21没有新功能.它只是升级到 ...
- 基于Asp.Net Core,利用ZXing来生成二维码的一般流程
本文主要介绍如何在.net环境下,基于Asp.Net Core,利用ZXing来生成二维码的一般操作.对二维码工作原理了解,详情见:https://blog.csdn.net/weixin_36191 ...
随机推荐
- idea 安装 codota 插件
为抄代码而生的插件哇,码农们的知心姐姐!!!
- Python Ethical Hacking - Malware Analysis(3)
Stealing WiFi Password Saved on a Computer #!/usr/bin/env python import smtplib import subprocess im ...
- Python Ethical Hacking - VULNERABILITY SCANNER(2)
VULNERABILITY_SCANNER How to discover a vulnerability in a web application? 1. Go into every possibl ...
- Python的telnetlib模块使用
telnetlib模块的常用接口 telnetlib.Telnet(host, port, timeout) # 登录 write() # 输入命令 read_until(match) # 读出响应, ...
- 前端练习错题day01
<1>.css盒子模型中,padding是透明的,这一部分可以显示背景. <2>.注意&&符号左右条件先后顺序,可能会报错. <3>.在 HTML5 ...
- 一些matlb会用到的函数
matlab这种软件功能很强大,但是都不是常常会用到,尤其是像在学生中.每次用的时候总会把一些基本的函数忘记,还的去网上查.我之前在使用的时候也总结过,可惜在一次数据丢失中全没了(︶︹︺). 从现在开 ...
- gitlab的还原
源服务器: ip: 192.168.0.199 系统:CentOS7.2 内核: 3.10.0-327 gitlab版本: gitlab-ce-8.0.5 新服务器: ip: 192.168.0.19 ...
- arcgis for js 如何用contains过滤数据
添加全部数据 // 构建map容器 var view = new MapView({ container: 'mapId', map: map }); /******************** * ...
- jieba尝鲜
import jieba strings = '我工作在安徽的安徽师范大学,这个大学很美丽,在芜湖' # print(dir(jieba)) dic_strings = {} lst_strings ...
- PHP 实例 - AJAX 与 XML-AJAX XML 实例
PHP 实例 - AJAX 与 XML AJAX 可用来与 XML 文件进行交互式通信. AJAX XML 实例 下面的实例将演示网页如何通过 AJAX 从 XML 文件读取信息: 实例 Sele ...