2020年11月17日星期二

Redis分布式缓存系列(三)

本系列将和大家分享Redis分布式缓存,本章主要简单介绍下Redis中的Hash类型。

本系列将和大家分享Redis分布式缓存,本章主要简单介绍下Redis中的Hash类型。

散列Hash:类似dictionary,通过索引快速定位到指定元素的,耗时均等,跟string的区别在于不用反序列化,直接修改某个字段。

存储形式: hashId-{key:value;key:value;key:value;}

在正式开始介绍Hash类型之前,我们先来思考一个问题,如何使用我们上一篇介绍的String类型来缓存和修改一个学生对象信息。大家能想到的可能有以下两种方案:

方案1:查询-反序列化-修改-序列化-存储。

方案2:多个key-value。

/// <summary>/// 学生类/// </summary>public class Student{ public int Id { get; set; } public string Name { get; set; } public string Remark { get; set; } public string Description { get; set; }}
/// <summary>/// 散列Hash:类似dictionary,通过索引快速定位到指定元素的,耗时均等,跟string的区别在于不用反序列化,直接修改某个字段/// 存储形式: hashId-{key:value;key:value;key:value;}/// 可以一次性查找实体,也可以单个查找,还可以单个修改/// </summary>public static void ShowHash(){ var student = new Student() {  Id = 10000,  Name = "TianYa",  Description = "一年级",  Remark = "优秀" }; //使用String类型缓存学生对象信息 using (RedisStringService service = new RedisStringService()) {  //方案1  //查询-反序列化-修改-序列化-存储  //该方案修改很不方便  service.Set("student", student);  var stu = service.Get<Student>("student");  stu.Remark = "很优秀";  service.Set("student", stu);  //方案2  //多个key-value  //string类型的value最小值是512byte,即使只保存一个1,也是要占用512byte空间的  //该方案修改方便,但是数据项会很多,浪费空间  service.Set($"student_{student.Id}_Name", student.Name);  service.Set($"student_{student.Id}_Description", student.Description);  service.Set($"student_{student.Id}_Remark", student.Remark);  service.Set($"student_{student.Id}_Remark", "很优秀"); //修改方便 }}

从上面的代码中你会发现这2种方案都不是很合适,方案1修改起来很不方便,而方案2虽然修改起来方便了,但是缺点就是浪费空间,效率也不高。

那有没有更好的解决方案呢?答案:肯定是有的,那就是接下来我们要讲的Hash类型。

首先先给大家Show一波Redis中与Hash类型相关的API:

using System.Collections.Generic;namespace TianYa.Redis.Service{ /// <summary> /// 散列Hash:类似dictionary,通过索引快速定位到指定元素的,耗时均等,跟string的区别在于不用反序列化,直接修改某个字段 /// 存储形式: hashId-{key:value;key:value;key:value;} /// 可以一次性查找实体,也可以单个查找,还可以单个修改 /// </summary> public class RedisHashService : RedisBase {  #region 添加  /// <summary>  /// 向hashId集合中添加key/value  /// </summary>    public bool SetEntryInHash(string hashId, string key, string value)  {   return base._redisClient.SetEntryInHash(hashId, key, value);  }  /// <summary>  /// 如果hashId集合中存在key则不添加,返回false,  /// 如果不存在则添加key/value,返回true  /// </summary>  public bool SetEntryInHashIfNotExists(string hashId, string key, string value)  {   return base._redisClient.SetEntryInHashIfNotExists(hashId, key, value);  }  /// <summary>  /// 存储对象T t到hash集合中  /// 需要包含Id,然后用Id获取  /// </summary>  public void StoreAsHash<T>(T t)  {   base._redisClient.StoreAsHash<T>(t);  }  

没有评论:

发表评论