设为首页 收藏本站
查看: 528|回复: 0

[经验分享] 用redis来实现Session保存的一个简单Demo

[复制链接]

尚未签到

发表于 2017-12-21 16:18:24 | 显示全部楼层 |阅读模式
/// <summary>  /// Redis操作
  /// </summary>

  public>  {
  private int DbNum { get; }
  private readonly ConnectionMultiplexer _conn;
  public string CustomKey;
  

  #region 构造函数
  

  public RedisHelper(int dbNum = 0)
  : this(dbNum, null)
  {
  }
  

  public RedisHelper(int dbNum, string readWriteHosts)
  {
  DbNum = dbNum;
  _conn =
  string.IsNullOrWhiteSpace(readWriteHosts) ?
  RedisConnectionHelp.Instance :
  RedisConnectionHelp.GetConnectionMultiplexer(readWriteHosts);
  }
  

  #endregion 构造函数
  

  #region String
  

  #region 同步方法
  

  /// <summary>
  /// 保存单个key value
  /// </summary>
  /// <param name="key">Redis Key</param>
  /// <param name="value">保存的值</param>
  /// <param name="expiry">过期时间</param>
  /// <returns></returns>
  public bool StringSet(string key, string value, TimeSpan? expiry = default(TimeSpan?))
  {
  key = AddSysCustomKey(key);
  return Do(db => db.StringSet(key, value, expiry));
  }
  

  /// <summary>
  /// 保存多个key value
  /// </summary>
  /// <param name="keyValues">键值对</param>
  /// <returns></returns>
  public bool StringSet(List<KeyValuePair<RedisKey, RedisValue>> keyValues)
  {
  List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =
  keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(AddSysCustomKey(p.Key), p.Value)).ToList();
  return Do(db => db.StringSet(newkeyValues.ToArray()));
  }
  

  /// <summary>
  /// 保存一个对象
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <param name="obj"></param>
  /// <param name="expiry"></param>
  /// <returns></returns>
  public bool StringSet<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
  {
  key = AddSysCustomKey(key);
  string json = ConvertJson(obj);
  return Do(db => db.StringSet(key, json, expiry));
  }
  

  /// <summary>
  /// 获取单个key的值
  /// </summary>
  /// <param name="key">Redis Key</param>
  /// <returns></returns>
  public string StringGet(string key)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.StringGet(key));
  }
  

  /// <summary>
  /// 获取多个Key
  /// </summary>
  /// <param name="listKey">Redis Key集合</param>
  /// <returns></returns>
  public RedisValue[] StringGet(List<string> listKey)
  {
  List<string> newKeys = listKey.Select(AddSysCustomKey).ToList();
  return Do(db => db.StringGet(ConvertRedisKeys(newKeys)));
  }
  

  /// <summary>
  /// 获取一个key的对象
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public T StringGet<T>(string key)
  {
  key = AddSysCustomKey(key);
  return Do(db => ConvertObj<T>(db.StringGet(key)));
  }
  

  /// <summary>
  /// 为数字增长val
  /// </summary>
  /// <param name="key"></param>
  /// <param name="val">可以为负</param>
  /// <returns>增长后的值</returns>
  public double StringIncrement(string key, double val = 1)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.StringIncrement(key, val));
  }
  

  /// <summary>
  /// 为数字减少val
  /// </summary>
  /// <param name="key"></param>
  /// <param name="val">可以为负</param>
  /// <returns>减少后的值</returns>
  public double StringDecrement(string key, double val = 1)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.StringDecrement(key, val));
  }
  

  #endregion 同步方法
  

  #region 异步方法
  

  /// <summary>
  /// 保存单个key value
  /// </summary>
  /// <param name="key">Redis Key</param>
  /// <param name="value">保存的值</param>
  /// <param name="expiry">过期时间</param>
  /// <returns></returns>
  public async Task<bool> StringSetAsync(string key, string value, TimeSpan? expiry = default(TimeSpan?))
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.StringSetAsync(key, value, expiry));
  }
  

  /// <summary>
  /// 保存多个key value
  /// </summary>
  /// <param name="keyValues">键值对</param>
  /// <returns></returns>
  public async Task<bool> StringSetAsync(List<KeyValuePair<RedisKey, RedisValue>> keyValues)
  {
  List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =
  keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(AddSysCustomKey(p.Key), p.Value)).ToList();
  return await Do(db => db.StringSetAsync(newkeyValues.ToArray()));
  }
  

  /// <summary>
  /// 保存一个对象
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <param name="obj"></param>
  /// <param name="expiry"></param>
  /// <returns></returns>
  public async Task<bool> StringSetAsync<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
  {
  key = AddSysCustomKey(key);
  string json = ConvertJson(obj);
  return await Do(db => db.StringSetAsync(key, json, expiry));
  }
  

  /// <summary>
  /// 获取单个key的值
  /// </summary>
  /// <param name="key">Redis Key</param>
  /// <returns></returns>
  public async Task<string> StringGetAsync(string key)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.StringGetAsync(key));
  }
  

  /// <summary>
  /// 获取多个Key
  /// </summary>
  /// <param name="listKey">Redis Key集合</param>
  /// <returns></returns>
  public async Task<RedisValue[]> StringGetAsync(List<string> listKey)
  {
  List<string> newKeys = listKey.Select(AddSysCustomKey).ToList();
  return await Do(db => db.StringGetAsync(ConvertRedisKeys(newKeys)));
  }
  

  /// <summary>
  /// 获取一个key的对象
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public async Task<T> StringGetAsync<T>(string key)
  {
  key = AddSysCustomKey(key);
  string result = await Do(db => db.StringGetAsync(key));
  return ConvertObj<T>(result);
  }
  

  /// <summary>
  /// 为数字增长val
  /// </summary>
  /// <param name="key"></param>
  /// <param name="val">可以为负</param>
  /// <returns>增长后的值</returns>
  public async Task<double> StringIncrementAsync(string key, double val = 1)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.StringIncrementAsync(key, val));
  }
  

  /// <summary>
  /// 为数字减少val
  /// </summary>
  /// <param name="key"></param>
  /// <param name="val">可以为负</param>
  /// <returns>减少后的值</returns>
  public async Task<double> StringDecrementAsync(string key, double val = 1)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.StringDecrementAsync(key, val));
  }
  

  #endregion 异步方法
  

  #endregion String
  

  #region Hash
  

  #region 同步方法
  

  /// <summary>
  /// 判断某个数据是否已经被缓存
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <returns></returns>
  public bool HashExists(string key, string dataKey)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.HashExists(key, dataKey));
  }
  

  /// <summary>
  /// 存储数据到hash表
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <param name="t"></param>
  /// <returns></returns>
  public bool HashSet<T>(string key, string dataKey, T t)
  {
  key = AddSysCustomKey(key);
  return Do(db =>
  {
  string json = ConvertJson(t);
  return db.HashSet(key, dataKey, json);
  });
  }
  

  public bool HashSet<T>(string key, T t)
  {
  key = AddSysCustomKey(key);
  return Do(db =>
  {
  var val = ToHash<T>(t);
  db.HashSet(key, val);
  return true;
  });
  }
  /// <summary>
  /// 移除hash中的某值
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <returns></returns>
  public bool HashDelete(string key, string dataKey)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.HashDelete(key, dataKey));
  }
  

  /// <summary>
  /// 移除hash中的多个值
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKeys"></param>
  /// <returns></returns>
  public long HashDelete(string key, List<RedisValue> dataKeys)
  {
  key = AddSysCustomKey(key);
  //List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};
  return Do(db => db.HashDelete(key, dataKeys.ToArray()));
  }
  

  /// <summary>
  /// 从hash表获取数据
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <returns></returns>
  public T HashGet<T>(string key, string dataKey)
  {
  key = AddSysCustomKey(key);
  return Do(db =>
  {
  string value = db.HashGet(key, dataKey);
  return ConvertObj<T>(value);
  });
  }
  

  public T HashGet<T>(string key)
  {
  key = AddSysCustomKey(key);
  return Do(db =>
  {
  var value = db.HashGetAll(key);
  return ToEntity<T>(value);
  });
  }
  /// <summary>
  /// 为数字增长val
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <param name="val">可以为负</param>
  /// <returns>增长后的值</returns>
  public double HashIncrement(string key, string dataKey, double val = 1)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.HashIncrement(key, dataKey, val));
  }
  

  /// <summary>
  /// 为数字减少val
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <param name="val">可以为负</param>
  /// <returns>减少后的值</returns>
  public double HashDecrement(string key, string dataKey, double val = 1)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.HashDecrement(key, dataKey, val));
  }
  

  /// <summary>
  /// 获取hashkey所有Redis key
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public List<T> HashKeys<T>(string key)
  {
  key = AddSysCustomKey(key);
  return Do(db =>
  {
  RedisValue[] values = db.HashKeys(key);
  return ConvetList<T>(values);
  });
  }
  

  #endregion 同步方法
  

  #region 异步方法
  

  /// <summary>
  /// 判断某个数据是否已经被缓存
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <returns></returns>
  public async Task<bool> HashExistsAsync(string key, string dataKey)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.HashExistsAsync(key, dataKey));
  }
  

  /// <summary>
  /// 存储数据到hash表
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <param name="t"></param>
  /// <returns></returns>
  public async Task<bool> HashSetAsync<T>(string key, string dataKey, T t)
  {
  key = AddSysCustomKey(key);
  return await Do(db =>
  {
  string json = ConvertJson(t);
  return db.HashSetAsync(key, dataKey, json);
  });
  }
  

  /// <summary>
  /// 移除hash中的某值
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <returns></returns>
  public async Task<bool> HashDeleteAsync(string key, string dataKey)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.HashDeleteAsync(key, dataKey));
  }
  

  /// <summary>
  /// 移除hash中的多个值
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKeys"></param>
  /// <returns></returns>
  public async Task<long> HashDeleteAsync(string key, List<RedisValue> dataKeys)
  {
  key = AddSysCustomKey(key);
  //List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};
  return await Do(db => db.HashDeleteAsync(key, dataKeys.ToArray()));
  }
  

  /// <summary>
  /// 从hash表获取数据
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <returns></returns>
  public async Task<T> HashGeAsync<T>(string key, string dataKey)
  {
  key = AddSysCustomKey(key);
  string value = await Do(db => db.HashGetAsync(key, dataKey));
  return ConvertObj<T>(value);
  }
  

  /// <summary>
  /// 为数字增长val
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <param name="val">可以为负</param>
  /// <returns>增长后的值</returns>
  public async Task<double> HashIncrementAsync(string key, string dataKey, double val = 1)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.HashIncrementAsync(key, dataKey, val));
  }
  

  /// <summary>
  /// 为数字减少val
  /// </summary>
  /// <param name="key"></param>
  /// <param name="dataKey"></param>
  /// <param name="val">可以为负</param>
  /// <returns>减少后的值</returns>
  public async Task<double> HashDecrementAsync(string key, string dataKey, double val = 1)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.HashDecrementAsync(key, dataKey, val));
  }
  

  /// <summary>
  /// 获取hashkey所有Redis key
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public async Task<List<T>> HashKeysAsync<T>(string key)
  {
  key = AddSysCustomKey(key);
  RedisValue[] values = await Do(db => db.HashKeysAsync(key));
  return ConvetList<T>(values);
  }
  

  #endregion 异步方法
  

  #endregion Hash
  

  #region List
  

  #region 同步方法
  

  /// <summary>
  /// 移除指定ListId的内部List的值
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public void ListRemove<T>(string key, T value)
  {
  key = AddSysCustomKey(key);
  Do(db => db.ListRemove(key, ConvertJson(value)));
  }
  

  /// <summary>
  /// 获取指定key的List
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public List<T> ListRange<T>(string key)
  {
  key = AddSysCustomKey(key);
  return Do(redis =>
  {
  var values = redis.ListRange(key);
  return ConvetList<T>(values);
  });
  }
  

  /// <summary>
  /// 入队
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public void ListRightPush<T>(string key, T value)
  {
  key = AddSysCustomKey(key);
  Do(db => db.ListRightPush(key, ConvertJson(value)));
  }
  

  /// <summary>
  /// 出队
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public T ListRightPop<T>(string key)
  {
  key = AddSysCustomKey(key);
  return Do(db =>
  {
  var value = db.ListRightPop(key);
  return ConvertObj<T>(value);
  });
  }
  

  /// <summary>
  /// 入栈
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public void ListLeftPush<T>(string key, T value)
  {
  key = AddSysCustomKey(key);
  Do(db => db.ListLeftPush(key, ConvertJson(value)));
  }
  

  /// <summary>
  /// 出栈
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public T ListLeftPop<T>(string key)
  {
  key = AddSysCustomKey(key);
  return Do(db =>
  {
  var value = db.ListLeftPop(key);
  return ConvertObj<T>(value);
  });
  }
  

  /// <summary>
  /// 获取集合中的数量
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public long ListLength(string key)
  {
  key = AddSysCustomKey(key);
  return Do(redis => redis.ListLength(key));
  }
  

  #endregion 同步方法
  

  #region 异步方法
  

  /// <summary>
  /// 移除指定ListId的内部List的值
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public async Task<long> ListRemoveAsync<T>(string key, T value)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.ListRemoveAsync(key, ConvertJson(value)));
  }
  

  /// <summary>
  /// 获取指定key的List
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public async Task<List<T>> ListRangeAsync<T>(string key)
  {
  key = AddSysCustomKey(key);
  var values = await Do(redis => redis.ListRangeAsync(key));
  return ConvetList<T>(values);
  }
  

  /// <summary>
  /// 入队
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public async Task<long> ListRightPushAsync<T>(string key, T value)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.ListRightPushAsync(key, ConvertJson(value)));
  }
  

  /// <summary>
  /// 出队
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public async Task<T> ListRightPopAsync<T>(string key)
  {
  key = AddSysCustomKey(key);
  var value = await Do(db => db.ListRightPopAsync(key));
  return ConvertObj<T>(value);
  }
  

  /// <summary>
  /// 入栈
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public async Task<long> ListLeftPushAsync<T>(string key, T value)
  {
  key = AddSysCustomKey(key);
  return await Do(db => db.ListLeftPushAsync(key, ConvertJson(value)));
  }
  

  /// <summary>
  /// 出栈
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="key"></param>
  /// <returns></returns>
  public async Task<T> ListLeftPopAsync<T>(string key)
  {
  key = AddSysCustomKey(key);
  var value = await Do(db => db.ListLeftPopAsync(key));
  return ConvertObj<T>(value);
  }
  

  /// <summary>
  /// 获取集合中的数量
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public async Task<long> ListLengthAsync(string key)
  {
  key = AddSysCustomKey(key);
  return await Do(redis => redis.ListLengthAsync(key));
  }
  

  #endregion 异步方法
  

  #endregion List
  

  #region SortedSet 有序集合
  

  #region 同步方法
  

  /// <summary>
  /// 添加
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  /// <param name="score"></param>
  public bool SortedSetAdd<T>(string key, T value, double score)
  {
  key = AddSysCustomKey(key);
  return Do(redis => redis.SortedSetAdd(key, ConvertJson<T>(value), score));
  }
  

  /// <summary>
  /// 删除
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public bool SortedSetRemove<T>(string key, T value)
  {
  key = AddSysCustomKey(key);
  return Do(redis => redis.SortedSetRemove(key, ConvertJson(value)));
  }
  

  /// <summary>
  /// 获取全部
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public List<T> SortedSetRangeByRank<T>(string key)
  {
  key = AddSysCustomKey(key);
  return Do(redis =>
  {
  var values = redis.SortedSetRangeByRank(key);
  return ConvetList<T>(values);
  });
  }
  

  /// <summary>
  /// 获取集合中的数量
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public long SortedSetLength(string key)
  {
  key = AddSysCustomKey(key);
  return Do(redis => redis.SortedSetLength(key));
  }
  

  #endregion 同步方法
  

  #region 异步方法
  

  /// <summary>
  /// 添加
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  /// <param name="score"></param>
  public async Task<bool> SortedSetAddAsync<T>(string key, T value, double score)
  {
  key = AddSysCustomKey(key);
  return await Do(redis => redis.SortedSetAddAsync(key, ConvertJson<T>(value), score));
  }
  

  /// <summary>
  /// 删除
  /// </summary>
  /// <param name="key"></param>
  /// <param name="value"></param>
  public async Task<bool> SortedSetRemoveAsync<T>(string key, T value)
  {
  key = AddSysCustomKey(key);
  return await Do(redis => redis.SortedSetRemoveAsync(key, ConvertJson(value)));
  }
  

  /// <summary>
  /// 获取全部
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public async Task<List<T>> SortedSetRangeByRankAsync<T>(string key)
  {
  key = AddSysCustomKey(key);
  var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
  return ConvetList<T>(values);
  }
  

  /// <summary>
  /// 获取集合中的数量
  /// </summary>
  /// <param name="key"></param>
  /// <returns></returns>
  public async Task<long> SortedSetLengthAsync(string key)
  {
  key = AddSysCustomKey(key);
  return await Do(redis => redis.SortedSetLengthAsync(key));
  }
  

  #endregion 异步方法
  

  #endregion SortedSet 有序集合
  

  #region key
  

  /// <summary>
  /// 删除单个key
  /// </summary>
  /// <param name="key">redis key</param>
  /// <returns>是否删除成功</returns>
  public bool KeyDelete(string key)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.KeyDelete(key));
  }
  

  /// <summary>
  /// 删除多个key
  /// </summary>
  /// <param name="keys">rediskey</param>
  /// <returns>成功删除的个数</returns>
  public long KeyDelete(List<string> keys)
  {
  List<string> newKeys = keys.Select(AddSysCustomKey).ToList();
  return Do(db => db.KeyDelete(ConvertRedisKeys(newKeys)));
  }
  

  /// <summary>
  /// 判断key是否存储
  /// </summary>
  /// <param name="key">redis key</param>
  /// <returns></returns>
  public bool KeyExists(string key)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.KeyExists(key));
  }
  

  /// <summary>
  /// 重新命名key
  /// </summary>
  /// <param name="key">就的redis key</param>
  /// <param name="newKey">新的redis key</param>
  /// <returns></returns>
  public bool KeyRename(string key, string newKey)
  {
  key = AddSysCustomKey(key);
  return Do(db => db.KeyRename(key, newKey));
  }
  

  /// <summary>
  /// 设置Key的时间
  /// </summary>
  /// <param name="key">redis key</param>
  /// <param name="expiry"></param>
  /// <returns></returns>
  public bool KeyExpire(string key, TimeSpan? expiry = default(TimeSpan?))
  {
  key = AddSysCustomKey(key);
  return Do(db => db.KeyExpire(key, expiry));
  }
  

  #endregion key
  

  #region 发布订阅
  

  /// <summary>
  /// Redis发布订阅  订阅
  /// </summary>
  /// <param name="subChannel"></param>
  /// <param name="handler"></param>
  public void Subscribe(string subChannel, Action<RedisChannel, RedisValue> handler = null)
  {
  ISubscriber sub = _conn.GetSubscriber();
  sub.Subscribe(subChannel, (channel, message) =>
  {
  if (handler == null)
  {
  Console.WriteLine(subChannel + " 订阅收到消息:" + message);
  }
  else
  {
  handler(channel, message);
  }
  });
  }
  

  /// <summary>
  /// Redis发布订阅  发布
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="channel"></param>
  /// <param name="msg"></param>
  /// <returns></returns>
  public long Publish<T>(string channel, T msg)
  {
  ISubscriber sub = _conn.GetSubscriber();
  return sub.Publish(channel, ConvertJson(msg));
  }
  

  /// <summary>
  /// Redis发布订阅  取消订阅
  /// </summary>
  /// <param name="channel"></param>
  public void Unsubscribe(string channel)
  {
  ISubscriber sub = _conn.GetSubscriber();
  sub.Unsubscribe(channel);
  }
  

  /// <summary>
  /// Redis发布订阅  取消全部订阅
  /// </summary>
  public void UnsubscribeAll()
  {
  ISubscriber sub = _conn.GetSubscriber();
  sub.UnsubscribeAll();
  }
  

  #endregion 发布订阅
  

  #region 其他
  

  public ITransaction CreateTransaction()
  {
  return GetDatabase().CreateTransaction();
  }
  


  public>  {
  return _conn.GetDatabase(DbNum);
  }
  

  public IServer GetServer(string hostAndPort)
  {
  return _conn.GetServer(hostAndPort);
  }
  

  /// <summary>
  /// 设置前缀
  /// </summary>
  /// <param name="customKey"></param>
  public void SetSysCustomKey(string customKey)
  {
  CustomKey = customKey;
  }
  

  #endregion 其他
  

  #region 辅助方法
  

  private string AddSysCustomKey(string oldKey)
  {
  var prefixKey = CustomKey ?? RedisConnectionHelp.SysCustomKey;
  return prefixKey + oldKey;
  }
  

  private T Do<T>(Func<IDatabase, T> func)
  {
  var database = _conn.GetDatabase(DbNum);
  return func(database);
  }
  

  private string ConvertJson<T>(T value)
  {
  string result = value is string ? value.ToString() : JsonConvert.SerializeObject(value);
  return result;
  }
  

  private T ConvertObj<T>(RedisValue value)
  {
  return JsonConvert.DeserializeObject<T>(value);
  }
  

  private List<T> ConvetList<T>(RedisValue[] values)
  {
  List<T> result = new List<T>();
  foreach (var item in values)
  {
  var model = ConvertObj<T>(item);
  result.Add(model);
  }
  return result;
  }
  

  private RedisKey[] ConvertRedisKeys(List<string> redisKeys)
  {
  return redisKeys.Select(redisKey => (RedisKey)redisKey).ToArray();
  }
  static HashEntry[] ToHash<T>(T obj, bool isIncludNull = false)
  {
  PropertyInfo[] properties = obj.GetType().GetProperties();
  

  return isIncludNull
  ? properties.Select(x =>
  {
  var tempValue = x.GetValue(obj);
  return new HashEntry(x.Name, tempValue == null ? string.Empty : tempValue.ToString());
  }).ToArray()
  : properties.Where(x => x.GetValue(obj) != null).Select(x => new HashEntry(x.Name, x.GetValue(obj).ToString())).ToArray();
  }
  

  static T ToEntity<T>(HashEntry[] hashEntries)
  {
  Type t = typeof(T);
  PropertyInfo[] properties = t.GetProperties();
  var obj = Activator.CreateInstance(typeof(T));
  foreach (var property in properties)
  {
  HashEntry entry = hashEntries.FirstOrDefault(g => g.Name.ToString().Equals(property.Name));
  if (entry.Equals(new HashEntry())) continue;
  

  object value = null;
  if (!property.PropertyType.IsGenericType)
  {
  value = Convert.ChangeType(entry.Value.ToString(), property.PropertyType);
  }
  else
  {
  Type genericTypeDefinition = property.PropertyType.GetGenericTypeDefinition();
  if (genericTypeDefinition == typeof(Nullable<>))
  {
  if (entry.Value.HasValue)
  {
  value = Convert.ChangeType(entry.Value.ToString(), Nullable.GetUnderlyingType(property.PropertyType));
  }
  }
  }
  

  property.SetValue(obj, value);
  }
  return (T)obj;
  }
  

  #endregion 辅助方法
  }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426533-1-1.html 上篇帖子: Redis + keepalived 主从设置与搭建 下篇帖子: PHP电商订单自动确认收货redis队列
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表