概念
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
命令查看
http://www.redis.cn/commands.html#generic
代码案列(常见API)
using (RedisClient client = new RedisClient("127.0.0.1", 6379))
{
#region 添加数据 key ,key/value 更加适合存储对象
var key = "listid";
//client.SetEntryInHash(key, "id", "001");
//client.SetEntryInHash(key, "name", "牛逼");
//client.SetEntryInHash(key, "class", "班级");
//client.SetEntryInHash(key, "school", "学校");
#endregion
#region 批量新增
//client.SetRangeInHash(key, new Dictionary<string, string> { { "country", "中国" },{ "earth","地球"} });
#endregion
#region 根据key 和数据key 获取value 返回集合
// var value=client.GetValuesFromHash(key, "id", "name");
#endregion
#region 如果key 里面存在key/value 返回false,不存在直接添加,返回true
//Console.WriteLine(client.SetEntryInHashIfNotExists(key, "city", "上海"));
#endregion
#region 存储对象
//var user1 = new User() { id = "2", name = "李" }; //按照对象类型存储 只要key 不变 继续添加就是修改
//client.StoreAsHash<User>(user1);
//var id=client.GetFromHash<User>(2).id; //获取对象直接可以获取属性值,括号里面的数字代表第几个对象
#endregion
#region 获取所有key 的集合
//var list = client.GetAllEntriesFromHash(key);
#endregion
#region 获取所有key 的总数
// var count = client.GetHashCount(key);
#endregion
#region 获取所有key 的集合
//var listKey = client.GetHashKeys(key);
#endregion
#region 获取所有value 的集合
//var listValue = client.GetHashValues(key);
#endregion
#region 获取所有key 和数据key移除数据
//var status=client.RemoveEntryFromHash(key, "id");//成功返回true
#endregion
#region 获取所有key 和数据key判断数据是否存在
//var statusId=client.HashContainsEntry(key, "id");//没有返回false
//var statusName = client.HashContainsEntry(key, "name");//成功返回true
#endregion
#region 获取所有key 和数据key判断数据是否存在
//var statusId=client.HashContainsEntry(key, "id");//没有返回false
//var statusName = client.HashContainsEntry(key, "name");//成功返回true
#endregion
#
#region 给 key 指定的数据key 加上步长, 数据类型必须是数字
client.IncrementValueInHash(key, "id", 2);
#endregion
}
数据结构
ZipList和hashTable,
(1) ziplist :上图可以看出 ziplist就是 list的压缩, 查找复杂度是O(N),所以有性能问题,字段小于512或者值并且值64 字节的时候用 ziplist
(2)hash 查找复杂度是O(1),
使用场景
常用作存储结构化数据、比如论坛系统中可以用来存储用户的Id、昵称、头像、积分等信息。如果需要修改其中的信息,只需要通过Key取出Value进行反序列化修改某一项的值,再序列化存储到Redis中,Hash结构存储,由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在String结构里是不存在的。