Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了
Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架
Asp.Net Core 2.0 项目实战(3)NCMVC角色权限管理前端UI预览及下载
Asp.Net Core 2.0 项目实战(4)ADO.NET操作数据库封装、 EF Core操作及实例
Asp.Net Core 2.0 项目实战(5)Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。
Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例
Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密
Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类
Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
本文目录
1. 摘要
2. Redis配置3. RedisHelper
4.使用实例
5. 总结
1. 摘要
由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数据存储在系统内存中,提升数据读取的速度,在C#下常见的内存操作有微软自带的内存处理、分布式缓存Memcached以及Redis,这里我们介绍Redis分布式缓存,另外两种缓存处理参考《Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类》介绍了基于Microsoft.Extensions.Caching.Memory封装CacheHelper缓存帮助类;《Asp.Net Core 2.0 项目实战(5)Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。》Memcached帮助类。
2. Redis配置
在appsettings.json添加相关配置,配置读写redis服务器,多服务器用逗号隔开。
//redis分布式缓存
"RedisConfig": {
//是否打开缓存1是0否
"IsOpenCache": "",
"ReadWriteHosts": "192.168.1.2:6379,192.168.1.3:6379,password=123456",
"ReadOnlyHosts": "192.168.1.2:6379,password=123456"
}
3. RedisHelper
添加Nuget包StackExchange.Redis和Newtonsoft.Json;设置Key/Value,删除redis缓存。本帮助类我仅本地两台电脑测试过,生产环境暂未使用,现仅供参考。
using System;
using System.Collections.Generic;
using Microsoft.Extensions.Logging; using StackExchange.Redis;
using Newtonsoft.Json; namespace NC.Common
{
public class RedisHelper
{
//单例模式
public static RedisCommon Default{get { return new RedisCommon(); } }
public static RedisCommon One { get { return new RedisCommon(, "127.0.0.1:6379"); } }
public static RedisCommon Two { get { return new RedisCommon(, "127.0.0.1:6379"); } }
}
/// <summary>
/// Redis操作类
/// 老版用的是ServiceStack.Redis。
/// Net Core使用StackExchange.Redis的nuget包
/// </summary>
public class RedisCommon
{
public static ILogger Log = UtilLogger<RedisCommon>.Log;//日志记录
//redis数据库连接字符串
private string _conn = UtilConf.Configuration["RedisConfig:ReadWriteHosts"] ?? "127.0.0.1:6379";
private int _db = ;
//静态变量 保证各模块使用的是不同实例的相同链接
private static ConnectionMultiplexer connection;
public RedisCommon() { }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="db"></param>
/// <param name="connectStr"></param>
public RedisCommon(int db, string connectStr)
{
_conn = connectStr;
_db = db;
}
/// <summary>
/// 缓存数据库,数据库连接
/// </summary>
public ConnectionMultiplexer CacheConnection
{
get
{
try
{
if (connection == null || !connection.IsConnected)
{
connection = new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(_conn)).Value;
}
}
catch (Exception ex)
{
Log.LogError("RedisHelper->CacheConnection 出错\r\n" + ex.ToString());
return null;
}
return connection;
}
}
/// <summary>
/// 缓存数据库
/// </summary>
public IDatabase CacheRedis => CacheConnection.GetDatabase(_db); #region --KEY/VALUE存取--
/// <summary>
/// 单条存值
/// </summary>
/// <param name="key">key</param>
/// <param name="value">The value.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
public bool StringSet(string key, string value)
{
return CacheRedis.StringSet(key, value);
}
/// <summary>
/// 保存单个key value
/// </summary>
/// <param name="key">Redis Key</param>
/// <param name="value">保存的值</param>
/// <param name="expiry">过期时间</param>
/// <returns></returns>
public bool StringSet(string key, string value, TimeSpan? expiry = default(TimeSpan?))
{
return CacheRedis.StringSet(key, value, expiry);
}
/// <summary>
/// 保存多个key value
/// </summary>
/// <param name="arr">key</param>
/// <returns></returns>
public bool StringSet(KeyValuePair<RedisKey, RedisValue>[] arr)
{
return CacheRedis.StringSet(arr);
}
/// <summary>
/// 批量存值
/// </summary>
/// <param name="keysStr">key</param>
/// <param name="valuesStr">The value.</param>
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
public bool StringSetMany(string[] keysStr, string[] valuesStr)
{
var count = keysStr.Length;
var keyValuePair = new KeyValuePair<RedisKey, RedisValue>[count];
for (int i = ; i < count; i++)
{
keyValuePair[i] = new KeyValuePair<RedisKey, RedisValue>(keysStr[i], valuesStr[i]);
} return CacheRedis.StringSet(keyValuePair);
} /// <summary>
/// 保存一个对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <returns></returns>
public bool SetStringKey<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
{
string json = JsonConvert.SerializeObject(obj);
return CacheRedis.StringSet(key, json, expiry);
}
/// <summary>
/// 追加值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void StringAppend(string key, string value)
{
////追加值,返回追加后长度
long appendlong = CacheRedis.StringAppend(key, value);
} /// <summary>
/// 获取单个key的值
/// </summary>
/// <param name="key">Redis Key</param>
/// <returns></returns>
public RedisValue GetStringKey(string key)
{
return CacheRedis.StringGet(key);
}
/// <summary>
/// 根据Key获取值
/// </summary>
/// <param name="key">键值</param>
/// <returns>System.String.</returns>
public string StringGet(string key)
{
try
{
return CacheRedis.StringGet(key);
}
catch (Exception ex)
{
Log.LogError("RedisHelper->StringGet 出错\r\n" + ex.ToString());
return null;
}
} /// <summary>
/// 获取多个Key
/// </summary>
/// <param name="listKey">Redis Key集合</param>
/// <returns></returns>
public RedisValue[] GetStringKey(List<RedisKey> listKey)
{
return CacheRedis.StringGet(listKey.ToArray());
}
/// <summary>
/// 批量获取值
/// </summary>
public string[] StringGetMany(string[] keyStrs)
{
var count = keyStrs.Length;
var keys = new RedisKey[count];
var addrs = new string[count]; for (var i = ; i < count; i++)
{
keys[i] = keyStrs[i];
}
try
{ var values = CacheRedis.StringGet(keys);
for (var i = ; i < values.Length; i++)
{
addrs[i] = values[i];
}
return addrs;
}
catch (Exception ex)
{
Log.LogError("RedisHelper->StringGetMany 出错\r\n" + ex.ToString());
return null;
}
}
/// <summary>
/// 获取一个key的对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T GetStringKey<T>(string key)
{
return JsonConvert.DeserializeObject<T>(CacheRedis.StringGet(key));
} #endregion #region --删除设置过期--
/// <summary>
/// 删除单个key
/// </summary>
/// <param name="key">redis key</param>
/// <returns>是否删除成功</returns>
public bool KeyDelete(string key)
{
return CacheRedis.KeyDelete(key);
}
/// <summary>
/// 删除多个key
/// </summary>
/// <param name="keys">rediskey</param>
/// <returns>成功删除的个数</returns>
public long KeyDelete(RedisKey[] keys)
{
return CacheRedis.KeyDelete(keys);
}
/// <summary>
/// 判断key是否存储
/// </summary>
/// <param name="key">redis key</param>
/// <returns></returns>
public bool KeyExists(string key)
{
return CacheRedis.KeyExists(key);
}
/// <summary>
/// 重新命名key
/// </summary>
/// <param name="key">就的redis key</param>
/// <param name="newKey">新的redis key</param>
/// <returns></returns>
public bool KeyRename(string key, string newKey)
{
return CacheRedis.KeyRename(key, newKey);
}
/// <summary>
/// 删除hasekey
/// </summary>
/// <param name="key"></param>
/// <param name="hashField"></param>
/// <returns></returns>
public bool HaseDelete(RedisKey key, RedisValue hashField)
{
return CacheRedis.HashDelete(key, hashField);
}
/// <summary>
/// 移除hash中的某值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="dataKey"></param>
/// <returns></returns>
public bool HashRemove(string key, string dataKey)
{
return CacheRedis.HashDelete(key, dataKey);
}
/// <summary>
/// 设置缓存过期
/// </summary>
/// <param name="key"></param>
/// <param name="datetime"></param>
public void SetExpire(string key, DateTime datetime)
{
CacheRedis.KeyExpire(key, datetime);
}
#endregion }
}
4. 使用实例
在HomeCtroller控制器中添加测试redis方法如下:写;读;删除。
public IActionResult Index()
{
#region --测试redis--
RedisHelper.Default.StringSet("redis", "redis" + DateTime.Now, TimeSpan.FromSeconds());
ViewData["redis"] = RedisHelper.Default.StringGet("redis");
//RedisHelper.Default.KeyDelete("redis");
#endregion
return View();
}
5. 总结
Redis读写速度快性能高,但部署到生产环境中要注意端口、密码设置,最好是部署在内网环境中,另由于之前都是使用ServiceStack.Redis,由于ServiceStack.Redis v4版本后是收费版的,好像还有每小时6000次访问请求的问题需注意,具体这俩请自行搜索对比。Redis 有五种常用数据类型,字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)参考:https://www.cnblogs.com/mingtianct/p/6291593.html;这里我暂只处理了string类型,上面我测试的方法有限,其他类型各位可自行补充,网上有很多案例。
Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例的更多相关文章
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
- Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
本文目录 1. Net下日志记录 2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 ...
- Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类
本文目录 1. 前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...
- Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密
本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...
- Asp.Net Core 2.0 项目实战(4)ADO.NET操作数据库封装、 EF Core操作及实例
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- Asp.Net Core 2.0 项目实战(3)NCMVC角色权限管理前端UI预览及下载
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
随机推荐
- 在 ServiceModel 客户端配置部分中,找不到引用协定“XX”的默认终结点元素的解决方法
今天在CRM2011中写Plugin的的时调用WCF报错,错误如下:"在 ServiceModel 客户端配置部分中,找不到引用协定"XX"的默认终结点元素.这可能是因为 ...
- LIRe 源代码分析 7:算法类[以颜色布局为例]
===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...
- 队列链式存储 - 设计与实现 - API函数
队列相关基础内容参我的博文:队列顺序存储 - 设计与实现 - API函数 队列也是一种特殊的线性表:可以用线性表链式存储来模拟队列的链式存储. 主要代码: // linkqueue.h // 队列链式 ...
- SpriteBuilder中同父节点的显示顺序
如下图: 到目前为止,GameScene依赖于节点在SpriteBuilder中的顺序去决定其绘制的顺序. level content(_levelNode)被首先绘制,然后GameMenuLayer ...
- 原生的zfs在rhel6上的安装
原生的zfs在rhel6上的安装 ZFS(Zettabyte File System)作为一个全新的文件系统,全面抛弃传统File System + Volume Manager + Storage( ...
- Hbase问题
Q: .meta.和root表是否要分裂? A: meta表和root表不会分裂,代码中有所判断. Q: 如果不分裂,那么都只有1个region? A: ... (查看代码后)A: meta和root ...
- Linux内核中断和异常分析(下)
这节,我们继续上,中(以前的日志有)篇目进行分析,结合一个真实的驱动案例来描述linux内核中驱动的中断机制,首先我们先了解一下linux内核中提供的中断接口. 这个接口我们需要包含一个头文件:#in ...
- Nuget发布教程
nuget setApiKey Your-API-Key -Source https://www.nuget.org/api/v2/package nuget spec nuget pack Monk ...
- Day15 Javascipt内容补充
JavaScript函数: 函数: function 函数名(a,b,c){ 执行代码 } 1,如何去找到标签 Dom直接选择器: 1,找到标签 #获取单个元素 document.getElement ...
- Pyharm中关于“warning: Debugger speedups using cython not found”问题的解决
在终端中输入 Python "/Applications/PyCharm CE.app/Contents/helpers/pydev/setup_cython.py" build_ ...