首先,需要在项目中Nuget包中安装StackExchange.Redis类库。
1.新建单例Redis连接类ConnectionSingleton,这个就有点类似ado.net的sqlconection的数据库连接对象,这里我用单例模式保证全局只有一个对象。
using StackExchange.Redis; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GMS.Core.Redis { public sealed class ConnectionSingleton { private static object _lock = new object(); private static ConnectionMultiplexer connection; public static ConnectionMultiplexer GetConnection() { if (connection == null) { lock (_lock) { connection = ConnectionMultiplexer.Connect(ConfigurationManager.AppSettings["redis"]); } } return connection; } } }
2. 新建RedisCachingService操作类
internal class RedisCachingService { private IDatabase db; public RedisCachingService(ConnectionMultiplexer connection) { db = connection.GetDatabase(Convert.ToInt32(ConfigurationManager.AppSettings["dbNum"]));//暂时先配置到索引为0的库 } /// <summary> /// 根据key值获取某个object对象 /// </summary> /// <param name="key"></param> /// <returns></returns> public object Get(string key) { return db.StringGet(key); } /// <summary> /// 根据key值获取泛型对象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public T Get<T>(string key) { var result = db.StringGet(key); if (result.IsNull) return default(T); return JsonHelper.jsonDes<T>(result); } public T GetLitJsonObj<T>(string key) { var result = db.StringGet(key); if (result.IsNull) return default(T); return JsonHelper.LitJsonToObject<T>(result); } public T Get<T>(string key, Func<T> func) { var result = Get<T>(key); if (result == null) { var computed = func(); if (computed == null) return default(T); Put(key, computed); return computed; } return result; } public void Put<T>(string key, T value) { var jsonndata = JsonHelper.json<T>(value); db.StringSet(key, jsonndata); } public void Put<T>(string key, T value, TimeSpan timeSpan) { var jsonndata = JsonHelper.json<T>(value); db.StringSet(key, jsonndata, timeSpan); } public void Put<T>(string key, T value, DateTime dateTime) { var jsonndata = JsonHelper.json<T>(value); var timeSpan = dateTime - DateTime.Now; db.StringSet(key, jsonndata, timeSpan); } public long AppendToValue(string key, string value) { return db.StringAppend(key, value); } public void Remove(string key) { db.KeyDelete(key); } /// <summary> /// 设置hash值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="hashId">Redis的存储key值</param> /// <param name="key">该hash表中的key值</param> /// <param name="t">对象</param> /// <returns></returns> public bool HashSet<T>(string hashId, string key, T t) { var jsonndata = JsonHelper.LitToJson<T>(t); return db.HashSet(hashId, key, jsonndata); } /// <summary> /// 删除hash表中某个key值 /// </summary> /// <param name="hashId"></param> /// <param name="key"></param> /// <returns></returns> public bool HashDelete(string hashId, string key) { return db.HashDelete(hashId, key); } /// <summary> /// 获取hash中某个key的值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="hashId"></param> /// <param name="key"></param> /// <returns></returns> public T HashGet<T>(string hashId, string key) { var result = db.HashGet(hashId, key); if (result.IsNull) return default(T); return JsonHelper.LitJsonToObject<T>(result); } /// <summary> /// 获取该hashid(对应的就是存储Redis对象的key)所有列表值 /// </summary> /// <param name="hashId"></param> /// <returns></returns> public HashEntry[] HashGetAll(string hashId) { var list = db.HashGetAll(hashId); return list; } }
这里我粘贴出了部分代码,正常的获取对象,设置对象存储到Redis这个其实没有什么可以多说的,主要就是介绍一下hash的操作。
我这里做了添加和删除操作,以及获取对象操作,Redis保存的格式如下图所示:
而正常存储对象格式,对象格式需要先转为json,然后再存储到Redis服务缓存,如下图:
通过判断,可以发现,hash存储的格式和对象存储格式完全不同,对象在Redis中缓存就相当于是一个key:value的形式,这个value就是这个对象转换的json字符串。而hash,其实也是key:value的形式,不过value类似我们C#中字典格式,value存储的是一行行的字典文件(key:value表现形式)。而且我们再存储数量很大的情况下,用hash存储可以大大的提升性能,如果我们知道key,可以直接根据hashid和key值轻松的取到hash表(可以认为是一个hash表)的对应key的value。代码 稍后我会在底部贴出。
最后我们看下Redis的连接字符串:
<!--redis服务器连接字符串--> <add key="redis" value="xx.xxx.com:6480,password=123456" /> <!--操作哪个库,默认0最大15--> <add key="dbNum" value="0"/>
对了,这里需要强调的是,Redis服务安装好之后有15个库,我们可以选择需要用到的库,通过索引去设置即可。
如果有需要源码的童鞋,可以下面留言。