StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
2016-08-30 22:40
621 查看
本文版权归博客园和作者本人共同所有,转载和爬虫请注明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html
上一篇文章的不合理之处,已经有所修改。
今天分享的是Hash散列数据类型操作,不过我也觉得有了前两篇的基础搭建后,你就能自己按照StackExchange中所封装的方法,进行调用并再次封装。在实际项目中,有些方法可能并不需要,比如获取所有Field以及其Value。当真正封装成dll的时候,有些方法,我们可以在接口中禁用,在非用不可时,我们可以将其开放。
先上接口代码吧:如果有朋友希望从头看起,请进入第一章分享链接 http://www.cnblogs.com/tdws/p/5815735.html
下面是实现的代码,其实就是简单调用下dll为我们提供好的方法。
另外,当你需要批量对Hash中增加数据的时候,如果你增加一个Person对象。他拥有姓名,年龄,性别等属性,你想将他存在一个三列当中,并将属性名称作为field名称时,你可以使用如下方法。
但是如果你想将一个List<T>存入hash中的话,field名称还挺不好为你取的。
有了下面的地方法,你可以通过你传入的一个方法,这个方法用于根据item定义field名称。
针对如上两种方法,获取hashGet方法也可以跟着改变,需要反序列化成泛型T类型的对象哟。
一直在用别人的RedisHelper, 自己封装的可能会有些问题,分享出来也真诚欢迎大家来给出指导,我将会进一步改进。
上一篇文章的不合理之处,已经有所修改。
今天分享的是Hash散列数据类型操作,不过我也觉得有了前两篇的基础搭建后,你就能自己按照StackExchange中所封装的方法,进行调用并再次封装。在实际项目中,有些方法可能并不需要,比如获取所有Field以及其Value。当真正封装成dll的时候,有些方法,我们可以在接口中禁用,在非用不可时,我们可以将其开放。
先上接口代码吧:如果有朋友希望从头看起,请进入第一章分享链接 http://www.cnblogs.com/tdws/p/5815735.html
#region Redis Hash散列数据类型操作 /// <summary> /// Redis散列数据类型 批量新增 /// </summary> void HashSet(string key, List<HashEntry> hashEntrys, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 新增一个 /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <param name="val"></param> void HashSet<T>(string key, string field, T val, When when = When.Always, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 获取指定key的指定field /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <returns></returns> T HashGet<T>(string key, string field); /// <summary> /// Redis散列数据类型 获取所有field所有值,以 HashEntry[]形式返回 /// </summary> /// <param name="key"></param> /// <param name="flags"></param> /// <returns></returns> HashEntry[] HashGetAll(string key, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 获取key中所有field的值。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="flags"></param> /// <returns></returns> List<T> HashGetAllValues<T>(string key, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 获取所有Key名称 /// </summary> /// <param name="key"></param> /// <param name="flags"></param> /// <returns></returns> string[] HashGetAllKeys(string key, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 单个删除field /// </summary> /// <param name="key"></param> /// <param name="hashField"></param> /// <param name="flags"></param> /// <returns></returns> bool HashDelete(string key, string hashField, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 批量删除field /// </summary> /// <param name="key"></param> /// <param name="hashFields"></param> /// <param name="flags"></param> /// <returns></returns> long HashDelete(string key, string[] hashFields, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 判断指定键中是否存在此field /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <param name="flags"></param> /// <returns></returns> bool HashExists(string key, string field, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 获取指定key中field数量 /// </summary> /// <param name="key"></param> /// <param name="flags"></param> /// <returns></returns> long HashLength(string key, CommandFlags flags = CommandFlags.None); /// <summary> /// Redis散列数据类型 为key中指定field增加incrVal值 /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <param name="incrVal"></param> /// <param name="flags"></param> /// <returns></returns> double HashIncrement(string key, string field, double incrVal, CommandFlags flags = CommandFlags.None); #endregion
下面是实现的代码,其实就是简单调用下dll为我们提供好的方法。
#region Redis Hash散列数据类型操作 /// <summary> /// Redis散列数据类型 批量新增 /// </summary> public void HashSet(string key, List<HashEntry> hashEntrys, CommandFlags flags = CommandFlags.None) { _db.HashSet(key, hashEntrys.ToArray(), flags); } /// <summary> /// Redis散列数据类型 新增一个 /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <param name="val"></param> public void HashSet<T>(string key, string field, T val, When when = When.Always, CommandFlags flags = CommandFlags.None) { _db.HashSet(key, field, SerializeContent(val), when, flags); } /// <summary> /// Redis散列数据类型 获取指定key的指定field /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <returns></returns> public T HashGet<T>(string key, string field) { return DeserializeContent<T>(_db.HashGet(key, field)); } /// <summary> /// Redis散列数据类型 获取所有field所有值,以 HashEntry[]形式返回 /// </summary> /// <param name="key"></param> /// <param name="flags"></param> /// <returns></returns> public HashEntry[] HashGetAll(string key, CommandFlags flags = CommandFlags.None) { return _db.HashGetAll(key,flags); } /// <summary> /// Redis散列数据类型 获取key中所有field的值。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="flags"></param> /// <returns></returns> public List<T> HashGetAllValues<T>(string key, CommandFlags flags = CommandFlags.None) { List<T> list = new List<T>(); var hashVals = _db.HashValues(key, flags).ToArray(); foreach (var item in hashVals) { list.Add(DeserializeContent<T>(item)); } return list; } /// <summary> /// Redis散列数据类型 获取所有Key名称 /// </summary> /// <param name="key"></param> /// <param name="flags"></param> /// <returns></returns> public string[] HashGetAllKeys(string key, CommandFlags flags = CommandFlags.None) { return _db.HashKeys(key, flags).ToStringArray(); } /// <summary> /// Redis散列数据类型 单个删除field /// </summary> /// <param name="key"></param> /// <param name="hashField"></param> /// <param name="flags"></param> /// <returns></returns> public bool HashDelete(string key,string hashField, CommandFlags flags = CommandFlags.None) { return _db.HashDelete(key, hashField,flags); } /// <summary> /// Redis散列数据类型 批量删除field /// </summary> /// <param name="key"></param> /// <param name="hashFields"></param> /// <param name="flags"></param> /// <returns></returns> public long HashDelete(string key, string[] hashFields, CommandFlags flags = CommandFlags.None) { List<RedisValue> list = new List<RedisValue>(); for(int i = 0; i < hashFields.Length; i++) { list.Add(hashFields[i]); } return _db.HashDelete(key, list.ToArray(), flags); } /// <summary> /// Redis散列数据类型 判断指定键中是否存在此field /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <param name="flags"></param> /// <returns></returns> public bool HashExists(string key,string field, CommandFlags flags = CommandFlags.None) { return _db.HashExists(key, field, flags); } /// <summary> /// Redis散列数据类型 获取指定key中field数量 /// </summary> /// <param name="key"></param> /// <param name="flags"></param> /// <returns></returns> public long HashLength(string key, CommandFlags flags = CommandFlags.None) { return _db.HashLength(key, flags); } /// <summary> /// Redis散列数据类型 为key中指定field增加incrVal值 /// </summary> /// <param name="key"></param> /// <param name="field"></param> /// <param name="incrVal"></param> /// <param name="flags"></param> /// <returns></returns> public double HashIncrement(string key,string field,double incrVal, CommandFlags flags = CommandFlags.None) { return _db.HashIncrement(key, field, incrVal, flags); } #endregion
另外,当你需要批量对Hash中增加数据的时候,如果你增加一个Person对象。他拥有姓名,年龄,性别等属性,你想将他存在一个三列当中,并将属性名称作为field名称时,你可以使用如下方法。
/// <summary> /// 复杂类的对象 转化为List<HashEntry> 此方法不支持List等对象,需另外封装 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="obj"></param> /// <returns></returns> public List<HashEntry> ObjectToHashEntryList<T>(string key, T obj) where T : class, new() { var people = new People() { Name = "ws", Age = 18 }; List<HashEntry> list = new List<HashEntry>(); foreach (PropertyInfo p in obj.GetType().GetProperties()) { var name = p.Name.ToString(); var val = p.GetValue(obj); list.Add(new HashEntry(name, SerializeContent(val))); } HashSet(key, list); return list; }
但是如果你想将一个List<T>存入hash中的话,field名称还挺不好为你取的。
有了下面的地方法,你可以通过你传入的一个方法,这个方法用于根据item定义field名称。
/// <summary> /// Hash中存储一个集合 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="list"></param> /// <param name="ModelIdentity"></param> public static void HashSet<T>(string key, List<T> list,Func<T, string> ModelIdentity) { List<HashEntry> list = new List<HashEntry>(); foreach (var item in list) { string json = SerializeContent(item); list.Add(new HashEntry(ModelIdentity(item), json)); } db.HashSet(key, list.ToArray()); }
针对如上两种方法,获取hashGet方法也可以跟着改变,需要反序列化成泛型T类型的对象哟。
一直在用别人的RedisHelper, 自己封装的可能会有些问题,分享出来也真诚欢迎大家来给出指导,我将会进一步改进。
相关文章推荐
- StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
- StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)
- StackExchange.Redis帮助类解决方案RedisRepository封装(基础配置)
- 怎样在Redis通过StackExchange.Redis 存储集合类型List
- C#中使用 StackExchange.Redis 封装属于自己的 RedisHelper
- 怎样在Redis通过StackExchange.Redis 存储集合类型List
- Redis-Service.Stack.Redis对Redis基本数据类型String,List,Hash,Set,ZSet的操作
- c#使用 StackExchange.Redis 封装 RedisHelper
- StackExchange.Redis 二次封装
- redis入门——散列类型(hash)
- 使用 StackExchange.Redis 封装属于自己的 RedisHelper
- Redis从基础命令到实战之散列类型(Hash)
- Redis数据类型之散列(hash)
- Redis系列-string类型和hash类型
- Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)
- Redis Hash类型数据常用命令总结
- php操作redis中的hash和zset类型数据的方法和代码例子
- php操作redis中的hash和zset类型数据的方法和代码例子
- redis的hash, list, set类型相关命令
- redis学习笔记4,hash类型