初探Redis-基础类型Hash

目录

Redis存在五种基础类型:字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)。本次列举出Hash的常用操作。

Redis官网:https://redis.io/ 

 

哈希(Hash)介绍

哈希(Hash)是Redis 中基本的类型,一个 key 对应着一个集合,其中集合中以field-value形式组成一个字典。可以理解为一个字典中,单项值部分又是一个字典。每个哈希(Hash)可以存储2^32-1个键值对。数据序列化成json格式为{key:{field1:value1,field2:value2……fieldN:valueN}}。

  • 内部用zipmap结构存储,以节约空间

  • 更新方便,只需更新field对应value值即可更新。

161959945_477aacd6-0cab-48e9-88f8-43316dbbac0c  

哈希(Hash)常用Api

设置field-value

162001254_f85795d5-1cdd-4a37-8b43-de029ee87595 162002487_fc59af6e-58fc-4d0d-9555-3cd8ce565519

设置初次添加的field-value

162003690_b91a8830-b1fe-46c5-87d6-3640bddf3295

获取值

162005232_ffa787dd-3df2-46cd-8ae0-8221182ece3d 

162006327_71a7342d-552c-4e0b-9ae2-019cba270a52 

批量设置值

162007498_71c4e3c7-6a98-4689-a315-781d334151ac 162008678_c0320c32-8137-4d7c-98a9-b5b75d16ddee

批量获取值

162009834_dd2644ab-1c22-4ff2-9432-ea57e591c18d 

162010970_d011da8e-3083-43ab-88c9-3f52c4a0ae65

获取key下集合信息

162012304_4ad2c682-2a98-4b37-82ba-1f6be39cabb9 162013688_48237035-35a9-4ebd-ae87-5529f3cecea8 

获取key下所有field

162014856_e3ad5033-d46e-4cf4-a1e1-90851bbe40b8 162016140_4ef52644-30bb-4a14-ae92-e41799932655

获取key下所有value

162017331_47d097ee-ced2-4551-8ed6-5c3b58c5e605 162018481_2cd29e9c-ddea-40f6-b8bf-d5fe91dcc629 

删除key下的field

162019607_9199de11-9569-4724-a148-e3063a63386d 162020784_8519a311-4cf3-4db8-a6b9-c40148b8e5b9  

哈希(Hash)不常用Api

查询key下field是否存在

162021939_e0f1f39a-e47d-4291-8ecf-e519bc975977 

162023091_e69400bb-2706-44dd-9135-72dd5cc5afd7

递增key下field映射值(△n)

162024218_720fbf6b-a962-4850-8733-f51e7e967fdb 162025409_4e95728d-b626-4ff5-89dd-ae0450ce372d

递增key下field映射值(△n 浮点数)

162026505_cc7965df-4705-4c3a-acf1-d3cd0bce187b 162027631_f98645e8-2f11-469a-bc56-b074f71ca479

获取key下field数量

162028753_13aae06b-870e-4284-9ec1-5c8f2ecdd618 

162029907_652916eb-0ed8-4fd1-883b-1b47bd440589

获取key下field映射值的长度

162031070_f3519524-3998-430e-addb-2e0a338e7159 162032218_083bb51e-aa6e-4d63-be47-92f96b7bde2f

迭代哈希表中的键值对

162033490_0917d8ca-10e8-46c4-b8e2-24b953088cdd 数量有限,返回游标仍然是0。

162034590_29be5f7c-606d-4b99-8065-f85b9da60ad3  

哈希(Hash)简单应用场景

模拟文章概要信息的Hash存储并快速获取,场景如下,网站首页分页展示文章概要信息,定义为热区文章,如某文章更改内容,则先判定是否该文章id属于热区,如属于则更改Hash中field对应的值。

  1. 模拟文章数据,设置一堆种子
var blogOutlineInfoList = new List<BlogOutlineInfo>()
{
    new BlogOutlineInfo()
    {
        Id = "9527",
        Title = "CSharp",
        Author = "微笑刺客",
        CreateTime = DateTime.Now,
        Content = "CSharp从入门到升仙",
        CommentCount =0,
        ReadCount = 0,
        RecommendCount = 0
    },
    new BlogOutlineInfo()
    {
        Id = "9528",
        Title = "Mysql",
        Author = "微笑刺客",
        CreateTime = DateTime.Now,
        Content = "Mysql从入门到遁地",
        CommentCount =0,
        ReadCount = 0,
        RecommendCount = 0
    },
    new BlogOutlineInfo()
    {
        Id = "9529",
        Title = "Docker",
        Author = "微笑刺客",
        CreateTime = DateTime.Now,
        Content = "Docker从入门到转行",
        CommentCount =0,
        ReadCount = 0,
        RecommendCount = 0
    },
    ...
};
  1. 将种子数据加入到Redis中(缓存预热)
foreach (var blogOutlineInfo in blogOutlineInfoList)
{
    //设置Redis_key
    var blogOutlineInfoKey = $"blogOutlineInfo_{blogOutlineInfo.Id}";


    //初始化属性值
    service.HashSet(blogOutlineInfoKey, nameof(BlogOutlineInfo.Title), blogOutlineInfo.Title);
    service.HashSet(blogOutlineInfoKey, nameof(BlogOutlineInfo.Content), blogOutlineInfo.Content);
    service.HashSet(blogOutlineInfoKey, nameof(BlogOutlineInfo.Author), blogOutlineInfo.Author);
    service.HashSet(blogOutlineInfoKey, nameof(BlogOutlineInfo.CreateTime), blogOutlineInfo.CreateTime);
    service.HashSet(blogOutlineInfoKey, nameof(BlogOutlineInfo.CommentCount), blogOutlineInfo.CommentCount);
    service.HashSet(blogOutlineInfoKey, nameof(BlogOutlineInfo.ReadCount), blogOutlineInfo.ReadCount);
    service.HashSet(blogOutlineInfoKey, nameof(BlogOutlineInfo.RecommendCount), blogOutlineInfo.RecommendCount);
}
  1. 网站中对于某页需要的数据,根据当前页面,先从Redis的List中获取相关文章Id,然后再从Hash中获取文章概要信息。

162035711_b38c0758-5174-4b4b-ac60-a5acb3f1555a

  1. 模拟某文章增加推荐、评论或是访问量。
#region 增加推荐数量
service.HashIncrement("blogOutlineInfo_9527", "RecommendCount", 1);
#endregion


#region 更改简介内容
service.HashSet("blogOutlineInfo_9530", "Content", "k8s从入门到失业");
#endregion


#region 增加阅读量
service.HashIncrement("blogOutlineInfo_9528", "ReadCount", 1);
#endregion
  1. 运行效果,对于第一篇的推荐数量和第二篇的阅读数量可直接进行更改。

162037504_e3709101-1bac-4b21-a3ca-b4541006281f

  

仓库地址:https://gitee.com/530521314/Partner.TreasureChest/tree/master/RedisOperate

2020-05-13,望技术有成后能回来看见自己的脚步