首页 技术交流 C# StackExchange.Redis Sdk源码,运用hash表详解 正文

C# StackExchange.Redis Sdk源码,运用hash表详解

发布日期:2019年06月28日 11:43        阅读次数:1809

首先,需要在项目中Nuget包中安装StackExchange.Redis类库。

1.新建单例Redis连接类ConnectionSingleton,这个就有点类似ado.net的sqlconection的数据库连接对象,这里我用单例模式保证全局只有一个对象。

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GMS.Core.Redis
{
  public sealed  class ConnectionSingleton
    {
        private static object _lock = new object();
        private static ConnectionMultiplexer connection;
        public static ConnectionMultiplexer GetConnection()
        {
            if (connection == null)
            {
                lock (_lock)
                {
                    connection = ConnectionMultiplexer.Connect(ConfigurationManager.AppSettings["redis"]);
                }
            }
            return connection;
        }
    }
}

 2. 新建RedisCachingService操作类

internal class RedisCachingService 
    {

        private IDatabase db;
        public RedisCachingService(ConnectionMultiplexer connection)
        {
            db = connection.GetDatabase(Convert.ToInt32(ConfigurationManager.AppSettings["dbNum"]));//暂时先配置到索引为0的库

        }
        /// <summary>
        /// 根据key值获取某个object对象
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public object Get(string key)
        {
            return db.StringGet(key);
        }
        /// <summary>
        /// 根据key值获取泛型对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T Get<T>(string key)
        {
            var result = db.StringGet(key);
            if (result.IsNull)
                return default(T);
            return JsonHelper.jsonDes<T>(result);
        }
        public T GetLitJsonObj<T>(string key)
        {
            var result = db.StringGet(key);
            if (result.IsNull)
                return default(T);
            return JsonHelper.LitJsonToObject<T>(result);
        }
       
        public T Get<T>(string key, Func<T> func)
        {

            var result = Get<T>(key);
            if (result == null)
            {
                var computed = func();
                if (computed == null)
                    return default(T);
                Put(key, computed);
                return computed;
            }
            return result;

        }
        public void Put<T>(string key, T value)
        {
            var jsonndata = JsonHelper.json<T>(value);
            db.StringSet(key, jsonndata);
        }

        public void Put<T>(string key, T value, TimeSpan timeSpan)
        {
            var jsonndata = JsonHelper.json<T>(value);
            db.StringSet(key, jsonndata, timeSpan);
        }

        public void Put<T>(string key, T value, DateTime dateTime)
        {
            var jsonndata = JsonHelper.json<T>(value);
            var timeSpan = dateTime - DateTime.Now;
            db.StringSet(key, jsonndata, timeSpan);
        }
        public long AppendToValue(string key, string value)
        {
            return db.StringAppend(key, value);
        }

        public void Remove(string key)
        {
            db.KeyDelete(key);
        }
       
        /// <summary>
        /// 设置hash值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hashId">Redis的存储key值</param>
        /// <param name="key">该hash表中的key值</param>
        /// <param name="t">对象</param>
        /// <returns></returns>
        public bool HashSet<T>(string hashId, string key, T t)
        {
            var jsonndata = JsonHelper.LitToJson<T>(t);
            return db.HashSet(hashId, key, jsonndata);
        }
        /// <summary>
        /// 删除hash表中某个key值
        /// </summary>
        /// <param name="hashId"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool HashDelete(string hashId, string key)
        {
            return db.HashDelete(hashId, key);
        }
        /// <summary>
        /// 获取hash中某个key的值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hashId"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public T HashGet<T>(string hashId, string key)
        {
            var result = db.HashGet(hashId, key);
            if (result.IsNull)
                return default(T);
            return JsonHelper.LitJsonToObject<T>(result);
        }
        /// <summary>
        /// 获取该hashid(对应的就是存储Redis对象的key)所有列表值
        /// </summary>
        /// <param name="hashId"></param>
        /// <returns></returns>
        public HashEntry[] HashGetAll(string hashId)
        {
            var list = db.HashGetAll(hashId);
            return list;
        }
    }


这里我粘贴出了部分代码,正常的获取对象,设置对象存储到Redis这个其实没有什么可以多说的,主要就是介绍一下hash的操作。

我这里做了添加和删除操作,以及获取对象操作,Redis保存的格式如下图所示:

而正常存储对象格式,对象格式需要先转为json,然后再存储到Redis服务缓存,如下图:


通过判断,可以发现,hash存储的格式和对象存储格式完全不同,对象在Redis中缓存就相当于是一个key:value的形式,这个value就是这个对象转换的json字符串。而hash,其实也是key:value的形式,不过value类似我们C#中字典格式,value存储的是一行行的字典文件(key:value表现形式)。而且我们再存储数量很大的情况下,用hash存储可以大大的提升性能,如果我们知道key,可以直接根据hashid和key值轻松的取到hash表(可以认为是一个hash表)的对应key的value。代码 稍后我会在底部贴出。

最后我们看下Redis的连接字符串:

<!--redis服务器连接字符串-->
  <add key="redis" value="xx.xxx.com:6480,password=123456" />
  <!--操作哪个库,默认0最大15-->
  <add key="dbNum" value="0"/>

 对了,这里需要强调的是,Redis服务安装好之后有15个库,我们可以选择需要用到的库,通过索引去设置即可。


如果有需要源码的童鞋,可以下面留言。




评论:

共 0 页 0 条记录,当前为第 1 页