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及使用实例的更多相关文章

  1. Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  2. Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级

    1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...

  3. Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例

    本文目录 1. Net下日志记录 2. NLog的使用     2.1 添加nuget引用NLog.Web.AspNetCore     2.2 配置文件设置     2.3 依赖配置及调用     ...

  4. Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类

    本文目录 1.  前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...

  5. Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密

    本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1.  摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. cocos2D v3.x 中action的回调block变化

    cocos2D v2.x中有带参数的回调block: id blk = [CCCallBlockN actionWithBlock:^(CCNode *node){ node.position = o ...

  2. Windows2008+MyEclipse10+Android开发环境搭配

    Windows2008+MyEclipse10+Android开发环境搭配 知识要点:64位系统中离线安装MyEclipse的ADT插件步骤办法 功能描述:解决Windows2008+MyEclips ...

  3. 数据包接收系列 — IP协议处理流程(一)

    本文主要内容:在接收数据包时,IP协议的处理流程. 内核版本:2.6.37 Author:zhangskd @ csdn blog IP报头 IP报头: struct iphdr { #if defi ...

  4. myBatis源码之Executor、BaseExecutor和CachingExecutor

    接下来是mybatis的执行过程,mybatis提供了一个接口Executor,Executor接口主要提供了update.query方法及事物相关的方法接口 /** * @author Clinto ...

  5. 程序设计之---单例模式VS静态方法

    我们在设计程序经常会有这种需求 , 某个类里的方法能够全局访问. 在这种情况下有两种实现方案 : 1>单例模式(Singleton); 2>静态方法. 但是, 对于这两种实现方式 , 那种 ...

  6. 【nginx】4xx,5xx 保持自定义header

    问题 nginx使用中,如果请求返回的状态code类似404或者50x这种,仍然返回自定义的header. 分析和解决 nginx文档中关于 add_header的部分 有这么一句 Adds the ...

  7. Linux 系统应用编程——线程基础

    传统多任务操作系统中一个可以独立调度的任务(或称之为顺序执行流)是一个进程.每个程序加载到内存后只可以唯一地对应创建一个顺序执行流,即传统意义的进程.每个进程的全部系统资源是私有的,如虚拟地址空间,文 ...

  8. 如何将windows格式的图标作为os x应用程序的图标

    刚由windows转为os x的同学可能知道,在os x下我们想改变一个app的图标异常简单,直接打开该app的简介,然后将图标文件拖入简介窗口左上角图标方框即可.但是很多童鞋下载了一些图标文件后发现 ...

  9. python socketserver框架解析

    socketserver框架是一个基本的socket服务器端框架, 使用了threading来处理多个客户端的连接, 使用seletor模块来处理高并发访问, 是值得一看的python 标准库的源码之 ...

  10. 移动端 slide拖拽

    <html> <head> <meta charset="UTF-8"> <meta name="viewport" ...