1.简介
Redis hash 是一个键值(key=>value)对集合,格式为:
一个hashid-{key:value;key:value;key:value;},类似dictionary。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
2.使用场景
我们需要灵活的保存一些信息,特别适合保存对象的信息,比如用户信息、配置信息等。
3.hash数据结构示意图
hash类型在存储数据时,是以hashid-Lish<KeyValuePair>格式存储的,如下图所示:
下面这张图可以很好区别Redis中的string类型和hash类型:
在数据库中有如下两条信息:
用hash类型存储这两条数据就变成如下格式:
如下是对hash封装后的api方法,RedisHashService.cs,代码如下:
using MyRedis.Redis.Interface;
using System.Collections.Generic;
namespace MyRedis.Redis.Service
{
public class RedisHashService : RedisBase
{
#region 添加
/// <summary>
/// 向hashid集合中添加key/value
/// </summary>
/// <param name="hashid"></param>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool SetEntryInHash(string hashid, string key, string value)
{
return base.iClient.SetEntryInHash(hashid, key, value);
}
/// <summary>
/// 如果hashid集合中存在key/value则不添加,返回false
/// 如果不存在则添加key/value,返回true
/// </summary>
/// <param name="hashid"></param>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool SetEntryInHashIfNotExists(string hashid, string key, string value)
{
return base.iClient.SetEntryInHashIfNotExists(hashid, key, value);
}
/// <summary>
/// 存储对象T t到hash集合中
/// 需要包含id,然后用id获取
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
public void StoreAsHash<T>(T t)
{
base.iClient.StoreAsHash<T>(t);
}
#endregion
#region 获取
/// <summary>
/// 获取对象T中ID为id的数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
public T GetFromHash<T>(object id)
{
return base.iClient.GetFromHash<T>(id);
}
/// <summary>
/// 获取所有hashid数据集的key/value数据集合
/// </summary>
/// <param name="hashid"></param>
/// <returns></returns>
public Dictionary<string, string> GetAllEntriesFromHash(string hashid)
{
return base.iClient.GetAllEntriesFromHash(hashid);
}
/// <summary>
/// 获取hashid数据集中的数据总数
/// </summary>
/// <param name="hashid"></param>
/// <returns></returns>
public long GetHashCount(string hashid)
{
return base.iClient.GetHashCount(hashid);
}
/// <summary>
/// 获取hashid数据集中书友key的集合
/// </summary>
/// <param name="hashid"></param>
/// <returns></returns>
public List<string> GetHashKeys(string hashid)
{
return base.iClient.GetHashKeys(hashid);
}
/// <summary>
/// 获取hashid数据集中书友value的集合
/// </summary>
/// <param name="hashid"></param>
/// <returns></returns>
public List<string> GetHashValues(string hashid)
{
return base.iClient.GetHashValues(hashid);
}
/// <summary>
/// 获取hashid数据集中key的value值
/// </summary>
/// <param name="hashid"></param>
/// <returns></returns>
public string GetValueFromHash(string hashid, string key)
{
return base.iClient.GetValueFromHash(hashid, key);
}
/// <summary>
/// 获取hashid数据集中多个key的value值
/// </summary>
/// <param name="hashid"></param>
/// <returns></returns>
public List<string> GetValuesFromHash(string hashid, string[] keys)
{
return base.iClient.GetValuesFromHash(hashid, keys);
}
#endregion
#region 删除
/// <summary>
/// 删除hashid数据集中对应key的数据
/// </summary>
/// <param name="hashid"></param>
/// <param name="key"></param>
/// <returns></returns>
public bool RemoveEntryFromHash(string hashid, string key)
{
return base.iClient.RemoveEntryFromHash(hashid, key);
}
#endregion
#region 其它
/// <summary>
/// 判断hashid数据集中是否存在key的数据
/// </summary>
/// <param name="hashid"></param>
/// <param name="key"></param>
/// <returns></returns>
public bool HashContainsEntry(string hashid, string key)
{
return base.iClient.HashContainsEntry(hashid, key);
}
/// <summary>
/// 给hashid数据集key的value加countby,返回相加后的值
/// </summary>
/// <param name="hashid"></param>
/// <param name="key"></param>
/// <param name="countBy"></param>
/// <returns></returns>
public double IncrementValueInHash(string hashid, string key, double countBy)
{
return base.iClient.IncrementValueInHash(hashid, key, countBy);
}
#endregion
}
}
上面的代码创建完成后,项目的基础就构建完成了,下面开始学习hash数据类型常用api的使用。
在控制台应用程序中的ServiceStackTest.cs类中,调用Redis的api方法。代码如下:
using MyRedis.Redis.Service;
using System;
using System.Collections.Generic;
using System.Threading;
namespace MyRedis
{
/// <summary>
/// ServiceStackTest api 封装测试
/// </summary>
public class ServiceStackTest
{
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public string Remark { get; set; }
public int Age { get; set; }
}
public static void Show()
{
Student student1 = new Student()
{
Id = 11,
Name = "张三",
Remark = "测试备注张三信息",
Age = 20
};
Student student2 = new Student()
{
Id = 22,
Name = "李四",
Remark = "测试备注李四信息",
Age = 30
};
#region RedisHashService
using (RedisHashService hashService = new RedisHashService())
{
hashService.FlushAll();
//添加
hashService.SetEntryInHash($"userinfo_{student1.Id}", "Name", student1.Name);
hashService.SetEntryInHash($"userinfo_{student1.Id}", "Remark", student1.Remark);
hashService.SetEntryInHash($"userinfo_{student1.Id}", "Age", student1.Age.ToString());
//修改
hashService.SetEntryInHash($"userinfo_{student1.Id}", "Name", "我是修改后的名称");
Dictionary<string, string> dic = hashService.GetAllEntriesFromHash("userinfo_11");
foreach (KeyValuePair<string, string> keyValuePair in dic)
{
Console.WriteLine($"{keyValuePair.Key}:{keyValuePair.Value}");
}
//下面必须是实体含ID属性的才可以怎么使用
hashService.StoreAsHash<Student>(student2);
Student s2 = hashService.GetFromHash<Student>(student2.Id);
Console.WriteLine(s2.Name);
Console.WriteLine(s2.Remark);
Console.WriteLine(s2.Age);
}
#endregion
}
}
}
执行结果:
上面代码执行过程中可以看具体方法的执行情况,这里就不一一调试了,执行后可以从可视化工具看到Redis中存储的数据信息:
hash数据类型适合存储对象这样的信息,查询和更新都非常方便。
更多hash的用法,参考文章:https://www.cnblogs.com/hunternet/p/12651530.html