.NET操作Redis Hash对象

一、Hash对象概述

哈希在很多编程语言中都有着很广泛的应用,而在Redis中也是如此,在redis中,哈希类型是指Redis键值对中的值本身又是一个键值对结构,形如value=[{field1,value1},...{fieldN,valueN}]。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。

二、使用场景

Redis哈希对象常常用来缓存一些对象信息,如用户信息、商品信息、配置信息等。

三、.NET 操作

1、基本操作

string hashid = "kgxk";
client.SetEntryInHash(hashid, "id", "001");
Console.WriteLine(client.GetValuesFromHash(hashid, "id").FirstOrDefault());
Console.WriteLine(client.GetValuesFromHash(hashid, "name").FirstOrDefault());
client.SetEntryInHash(hashid, "socre", "100");
Console.WriteLine(client.GetValuesFromHash(hashid, "socre").FirstOrDefault());

2、批量新增key的值

Dictionary<string, string> pairs = new Dictionary<string, string>();
pairs.Add("id", "001");
pairs.Add("name", "kgxk");
client.SetRangeInHash(hashid, pairs);
//获取当前key的值
Console.WriteLine(client.GetValueFromHash(hashid, "id"));
Console.WriteLine(client.GetValueFromHash(hashid, "name"));
//一次性的获取所有想要获取的小key(属性的)值  如果key不存在,则返回空,不抛出异常
var list = client.GetValuesFromHash(hashid, "id", "name", "abc");
Console.WriteLine("*********");
foreach (var item in list)
{
   Console.WriteLine(item);
}

3、如果hashid集合中存在key/value则不添加返回false,如果不存在在添加key/value,返回true

Console.WriteLine(client.SetEntryInHashIfNotExists(hashid, "name", "你好美"));
Console.WriteLine(client.SetEntryInHashIfNotExists(hashid, "name", "你好美 哈哈哈"));
Console.WriteLine(client.GetValuesFromHash(hashid, "name").FirstOrDefault());

4、存储对象T t到hash集合中

//urn: 类名: id的值 、、如果使用对象操作,一定要有id
client.StoreAsHash<UserInfo>(new UserInfo() { Id = 1, Name = "KGXK", Number = 0 });
client.StoreAsHash<UserInfo>(new UserInfo() { Id = 2, Name = "SXY", Number = 1 });
var olduserinfo = client.GetFromHash<UserInfo>(2);
Console.WriteLine(olduserinfo.Id);
//如果id存在的话,则覆盖之前相同的id 他帮助我们序列化或者反射了一些事儿
client.StoreAsHash<UserInfo>(new UserInfo() { Id = 2, Name = "KGXK2" });
//获取对象T中ID为id的数据。 必须要有属性id,不区分大小写
Console.WriteLine(client.GetFromHash<UserInfo>(1).Name);
var olduserinfo = client.GetFromHash<UserInfo>(1);
olduserinfo.Number = 4;
client.StoreAsHash<UserInfo>(olduserinfo);
Console.WriteLine("最后的结果" + client.GetFromHash<UserInfo>(1).Number);
UserInfo lisi = new UserInfo() { Id = 1, Name = "李四", Number = 0 };
client.StoreAsHash<UserInfo>(lisi);
Console.WriteLine(client.GetFromHash<UserInfo>(1).Number);
//做个自增
var oldzhang = client.GetFromHash<UserInfo>(1);
oldzhang.Number++;
client.StoreAsHash<UserInfo>(oldzhang);

5、获取hashid数据集中的数据总数

Dictionary<string, string> pairs = new Dictionary<string, string>();
pairs.Add("id", "001");
pairs.Add("name", "kgxk");
client.SetRangeInHash(hashid, pairs);
//获取数据总数
Console.WriteLine(client.GetHashCount(hashid));

6、获取hashid数据集中所有key或value的集合

Dictionary<string, string> pairs = new Dictionary<string, string>();
pairs.Add("id", "001");
pairs.Add("name", "kgxk");
client.SetRangeInHash(hashid, pairs);
var keys = client.GetHashKeys(hashid);//key
//var values = client.GetHashValues(hashid); //value
foreach (var item in keys)
{
   Console.WriteLine(item);
}

7、删除hashid数据集中的key数据

Dictionary<string, string> pairs = new Dictionary<string, string>();
pairs.Add("id", "001");
pairs.Add("name", "kgxk");
client.SetRangeInHash(hashid, pairs);
client.RemoveEntryFromHash(hashid, "id");
var values = client.GetHashValues(hashid);
foreach (var item in values)
{
   Console.WriteLine(item);
}

8、判断hashid数据集中是否存在key

Dictionary<string, string> pairs = new Dictionary<string, string>();
pairs.Add("id", "001");
pairs.Add("name", "kgxk");
client.SetRangeInHash(hashid, pairs);
Console.WriteLine(client.HashContainsEntry(hashid, "id")); //T  F
Console.WriteLine(client.HashContainsEntry(hashid, "number"));// T F

9、给hashid数据集key的value加countby,返回相加后的数据

Dictionary<string, string> pairs = new Dictionary<string, string>();
pairs.Add("id", "001");
pairs.Add("name", "kgxk");
pairs.Add("number", "2");
client.SetRangeInHash(hashid, pairs);
Console.WriteLine(client.IncrementValueInHash(hashid, "number", 2));
//注意,存的值必须是数字类型,否则抛出异常

10、泛型封装

public static class HashHelper
    {
		public static void StoreAsHash<T>(T model,RedisClient client) where T : class, new()
		{
			//获取当前类型的所有字段
			Type type = model.GetType();
			var fields = type.GetProperties();
			// urn: 类名: id的值
			var hashid = type.FullName;
			Dictionary<string, string> pairs = new Dictionary<string, string>();
			var IdValue = string.Empty;
			for (int i = 0; i < fields.Length; i++)
			{
				if (fields[i].Name.ToLower() == "id")
				{
					//如果你真的把两个相同的id的对象存进去,我可能只改其中一个
					//不可能,如果有两个相同的id的对象存进去,则后面的会把前面的替换掉
					IdValue = fields[i].GetValue(model).ToString();
				}
				else
				{
					// 获取字段的值
					pairs.Add(fields[i].Name, fields[i].GetValue(model).ToString());
				}

			}
			if (IdValue == string.Empty)
			{
				IdValue = DateTime.Now.ToString("yyyyMMdd");
			}
			
			client.SetRangeInHash(hashid + IdValue, pairs);
		}

		public static T GetFromHash<T>(object id, RedisClient client) where T : class, new()
		{
			//获取当前类型的所有字段
			Type type = typeof(T);
			// urn: 类名: id的值
			var hashid = type.FullName;
			
			var dics = client.GetAllEntriesFromHash(hashid + id.ToString());
			if (dics.Count == 0)
			{
				return new T();
			}
			else
			{
				var model = Activator.CreateInstance(type);
				var fields = type.GetProperties();
				foreach (var item in fields)
				{
					if (item.Name.ToLower() == "id")
					{
						item.SetValue(model, id);
					}
					if (dics.ContainsKey(item.Name))
					{
						item.SetValue(model, dics[item.Name]);
					}
				}
				return (T)model;
			}


		}
	}

调用

HashHelper.StoreAsHash<UserInfoTwo>(new UserInfoTwo() { Id = "10001", Name = "MMM" }, client);
var user = HashHelper.GetFromHash<UserInfoTwo>("10001", client);
Console.WriteLine(user.Name);
Console.WriteLine(user.Id);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值