StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
本文版权归博客园和作者本人共同所有,转载和爬虫请注明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html
上一篇文章的不合理之处,已经有所修改。
今天分享的是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 = ; 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 = };
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封装(基础配置)
		
本文版权归博客园和作者吴双本人共同所有,转载和爬虫,请注明原文地址.http://www.cnblogs.com/tdws/p/5815735.html 写在前面 这不是教程,分享而已,也欢迎园友们多 ...
 - StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)
		
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...
 - Python(Redis 中 String/List/Hash 类型数据操作)
		
1.下载 redis 模块 pip install redis 2.redis 数据库两种连接方式 简单连接 decode_responses=True,写入和读取的键值对中的 value 为 str ...
 - python字典转化成json格式。JSONEncoder和JSONDecoder两个类来实现Json字符串和dict类型数据的互相转换
		
遇到问题:进行Webservice接口测试时,对接口入参数据进行了处理,变成了dict格式,去进行接口请求报错. 需要转成成json格式,双引号去扩. 如下: 更改代码: # 在Python标准库的j ...
 - StackExchange.Redis 异步超时解决方案
		
Timeout awaiting response (outbound=0KiB, inbound=45417KiB, 5891ms elapsed, timeout is 5000ms), comm ...
 - Redis散列(Hash)的相关命令
		
散列 就像一个减配的Redis 内部及其类似Java的Map 内容就是key:value结构 hash类型在面向对象编程的运用中及其适合,因为它可以直接保存编程语言中的实体类关系 增 hset hse ...
 - Redis常用命令入门2:散列类型
		
散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...
 - Redis自学笔记:3.3入门-散列类型
		
3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...
 - Redis学习笔记(五)散列进阶
		
HEXISTS key_name key(检查键key是否存在) HKEYS key_name(获得散列的所有键) HVALS key_name(获得散列的所有值) HINCRBY key_name ...
 
随机推荐
- .net 分布式架构之配置中心
			
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ConfigManager ...
 - 微信小程序开发—快速掌握组件及API的方法
			
微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...
 - AlloyTouch实战--60行代码搞定QQ看点资料卡
			
原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先验货 访问DEMO你也可以点击这里 源代码可以点击这里 如你体验所见,流程的滚动的 ...
 - 港真,到底应该选择OA还是BPM?
			
越来越多企业意识到流程管理的重要性,但是,选择OA还是BPM,却让他们产生了选择困难症. 一方面,企业皆注重流程的高效运转,最好内外部的业务都能用一个系统来解决.所有流程一天就能上线什么的,那就更好啦 ...
 - Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决
			
在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...
 - unity3d导出到IOS程序下 集成unity3dAR功能
			
转载自: 来自AR学院(www.arvrschool.com),原文地址为:http://www.arvrschool.com/index.php?c=post&a=modify&ti ...
 - 嵌入式&iOS:回调函数(C)与block(OC)回调对比
			
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
 - 设置Hyper-V和VMware多个服务之间共存
			
这个方法是解决多个服务之间不能共存,下面相当于是以Hyper-V和VMware做例子,其他的也适用. 今天准备安装VMware Workstation 10,然后玩玩MAC OS. 没想到,淡定的我双 ...
 - CentOS:Yum源的配置
			
# cd /etc/yum.repos.d/ # mv CentOS-Base.repo CentOS-Base.repo.bak # wget http://mirrors.163.com/.hel ...
 - 基于token的多平台身份认证架构设计
			
基于token的多平台身份认证架构设计 1 概述 在存在账号体系的信息系统中,对身份的鉴定是非常重要的事情. 随着移动互联网时代到来,客户端的类型越来越多, 逐渐出现了 一个服务器,N个客户端的格 ...