Redis分布式缓存学习总结3(hash数据类型)

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类型: 

Redis-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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值