0

0

详解StackExchange.Redis通用封装类分享

高洛峰

高洛峰

发布时间:2017-02-08 09:30:17

|

1957人浏览过

|

来源于php中文网

原创

前两天朋友问我,有没有使用过stackexchange.redis,问我要个封装类,由于之前都是使用servicestack.redis,由于servicestack.redis v4版本后是收费版的,所以现在也很有公司都在使用stackexchange.redis而抛弃servicestack.redis了。其实个人觉得,两个驱动都不错,只是由于servicestack.redis收费导致目前很多公司都是基于v3版本的使用,也有人说v3版本有很多bug,没有维护和升级,不过至少目前我是没发现bug。

不过ServiceStack.Redis同StackExchange.Redis比较,抛开收费的来说,确认比StackExchange.Redis 更有优势。StackExchange.Redis文档很少,更不要说国内的文档了,连github上面对应的介绍文档都是很片面,这点我真的觉得StackExchange.Redis的作者至少要完善下文档,很多都是要看源码的例子才有。网上对StackExchange.Redis的使用例子也比ServiceStack.Redis少得多,不是说没人用,只是我查来查去,大部分都是基于String类型的数据进行使用的封装类,对于List,SortedSet,Hash的封装操作都很少,基本都是东写一点,西写一点,很难找到完整的。在参考了一些文章和源码后,这里提供一个自己封装的类,基本提供对于各种类型的使用封装,提供给大家学习使用,如果有哪里写的不好的,大家也可以互相交流。

ConnectionMultiplexer 封装

首先是 ConnectionMultiplexer 的封装,ConnectionMultiplexer对象是StackExchange.Redis最中枢的对象。这个类的实例需要被整个应用程序域共享和重用的,所以不需要在每个操作中不停的创建该对象的实例,一般都是使用单例来创建和存放这个对象,这个在官网上也有说明。

/// 
 /// ConnectionMultiplexer对象管理帮助类
 /// 
 public static class RedisConnectionHelp
 {
  //系统自定义Key前缀
  public static readonly string SysCustomKey = ConfigurationManager.AppSettings["redisKey"] ?? "";
 
  //"127.0.0.1:6379,allowadmin=true
  private static readonly string RedisConnectionString = ConfigurationManager.ConnectionStrings["RedisExchangeHosts"].ConnectionString;
 
  private static readonly object Locker = new object();
  private static ConnectionMultiplexer _instance;
  private static readonly ConcurrentDictionary ConnectionCache = new ConcurrentDictionary();
 
  /// 
  /// 单例获取
  /// 
  public static ConnectionMultiplexer Instance
  {
   get
   {
    if (_instance == null)
    {
     lock (Locker)
     {
      if (_instance == null || !_instance.IsConnected)
      {
       _instance = GetManager();
      }
     }
    }
    return _instance;
   }
  }
 
  /// 
  /// 缓存获取
  /// 
  /// 
  /// 
  public static ConnectionMultiplexer GetConnectionMultiplexer(string connectionString)
  {
   if (!ConnectionCache.ContainsKey(connectionString))
   {
    ConnectionCache[connectionString] = GetManager(connectionString);
   }
   return ConnectionCache[connectionString];
  }
 
  private static ConnectionMultiplexer GetManager(string connectionString = null)
  {
   connectionString = connectionString ?? RedisConnectionString;
   var connect = ConnectionMultiplexer.Connect(connectionString);
 
   //注册如下事件
   connect.ConnectionFailed += MuxerConnectionFailed;
   connect.ConnectionRestored += MuxerConnectionRestored;
   connect.ErrorMessage += MuxerErrorMessage;
   connect.ConfigurationChanged += MuxerConfigurationChanged;
   connect.HashSlotMoved += MuxerHashSlotMoved;
   connect.InternalError += MuxerInternalError;
 
   return connect;
  }
 
  #region 事件
 
  /// 
  /// 配置更改时
  /// 
  /// 
  /// 
  private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e)
  {
   Console.WriteLine("Configuration changed: " + e.EndPoint);
  }
 
  /// 
  /// 发生错误时
  /// 
  /// 
  /// 
  private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e)
  {
   Console.WriteLine("ErrorMessage: " + e.Message);
  }
 
  /// 
  /// 重新建立连接之前的错误
  /// 
  /// 
  /// 
  private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e)
  {
   Console.WriteLine("ConnectionRestored: " + e.EndPoint);
  }
 
  /// 
  /// 连接失败 , 如果重新连接成功你将不会收到这个通知
  /// 
  /// 
  /// 
  private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)
  {
   Console.WriteLine("重新连接:Endpoint failed: " + e.EndPoint + ", " + e.FailureType + (e.Exception == null ? "" : (", " + e.Exception.Message)));
  }
 
  /// 
  /// 更改集群
  /// 
  /// 
  /// 
  private static void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)
  {
   Console.WriteLine("HashSlotMoved:NewEndPoint" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint);
  }
 
  /// 
  /// redis类库错误
  /// 
  /// 
  /// 
  private static void MuxerInternalError(object sender, InternalErrorEventArgs e)
  {
   Console.WriteLine("InternalError:Message" + e.Exception.Message);
  }
 
  #endregion 事件
 }

RedisHelper 通用操作类封  

public class RedisHelper
 {
  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);
  }
 
#region 辅助方法
 
  private string AddSysCustomKey(string oldKey)
  {
   var prefixKey = CustomKey ?? RedisConnectionHelp.SysCustomKey;
   return prefixKey + oldKey;
  }
 
  private T Do(Func func)
  {
   var database = _conn.GetDatabase(DbNum);
   return func(database);
  }
 
  private string ConvertJson(T value)
  {
   string result = value is string ? value.ToString() : JsonConvert.SerializeObject(value);
   return result;
  }
 
  private T ConvertObj(RedisValue value)
  {
   return JsonConvert.DeserializeObject(value);
  }
 
  private List ConvetList(RedisValue[] values)
  {
   List result = new List();
   foreach (var item in values)
   {
    var model = ConvertObj(item);
    result.Add(model);
   }
   return result;
  }
 
  private RedisKey[] ConvertRedisKeys(List redisKeys)
  {
   return redisKeys.Select(redisKey => (RedisKey)redisKey).ToArray();
  }
 
  #endregion 辅助方法
 
  #endregion 构造函数
}

其中CustomKey用来表示系统前缀,AddSysCustomKey方法对每个key都进行前缀的添加处理,这里推荐大家在命名redis的key的时候最好的加上前缀,并且使用 :来分割前缀 ,这里在使用可视化工具查看的时候就比较好区分,比如我的的前缀是 Demo:test:(一般是  系统名:业务名:),然后你查看的时候你会发现整齐,好区分了很多

详解StackExchange.Redis通用封装类分享

String类型的封装

#region String
 
  #region 同步方法
 
  /// 
  /// 保存单个key value
  /// 
  /// Redis Key
  /// 保存的值
  /// 过期时间
  /// 
  public bool StringSet(string key, string value, TimeSpan? expiry = default(TimeSpan?))
  {
   key = AddSysCustomKey(key);
   return Do(db => db.StringSet(key, value, expiry));
  }
 
  /// 
  /// 保存多个key value
  /// 
  /// 键值对
  /// 
  public bool StringSet(List> keyValues)
  {
   List> newkeyValues =
    keyValues.Select(p => new KeyValuePair(AddSysCustomKey(p.Key), p.Value)).ToList();
   return Do(db => db.StringSet(newkeyValues.ToArray()));
  }
 
  /// 
  /// 保存一个对象
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public bool StringSet(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
  {
   key = AddSysCustomKey(key);
   string json = ConvertJson(obj);
   return Do(db => db.StringSet(key, json, expiry));
  }
 
  /// 
  /// 获取单个key的值
  /// 
  /// Redis Key
  /// 
  public string StringGet(string key)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.StringGet(key));
  }
 
  /// 
  /// 获取多个Key
  /// 
  /// Redis Key集合
  /// 
  public RedisValue[] StringGet(List listKey)
  {
   List newKeys = listKey.Select(AddSysCustomKey).ToList();
   return Do(db => db.StringGet(ConvertRedisKeys(newKeys)));
  }
 
  /// 
  /// 获取一个key的对象
  /// 
  /// 
  /// 
  /// 
  public T StringGet(string key)
  {
   key = AddSysCustomKey(key);
   return Do(db => ConvertObj(db.StringGet(key)));
  }
 
  /// 
  /// 为数字增长val
  /// 
  /// 
  /// 可以为负
  /// 增长后的值
  public double StringIncrement(string key, double val = 1)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.StringIncrement(key, val));
  }
 
  /// 
  /// 为数字减少val
  /// 
  /// 
  /// 可以为负
  /// 减少后的值
  public double StringDecrement(string key, double val = 1)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.StringDecrement(key, val));
  }
 
  #endregion 同步方法
 
  #region 异步方法
 
  /// 
  /// 保存单个key value
  /// 
  /// Redis Key
  /// 保存的值
  /// 过期时间
  /// 
  public async Task StringSetAsync(string key, string value, TimeSpan? expiry = default(TimeSpan?))
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.StringSetAsync(key, value, expiry));
  }
 
  /// 
  /// 保存多个key value
  /// 
  /// 键值对
  /// 
  public async Task StringSetAsync(List> keyValues)
  {
   List> newkeyValues =
    keyValues.Select(p => new KeyValuePair(AddSysCustomKey(p.Key), p.Value)).ToList();
   return await Do(db => db.StringSetAsync(newkeyValues.ToArray()));
  }
 
  /// 
  /// 保存一个对象
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public async Task StringSetAsync(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
  {
   key = AddSysCustomKey(key);
   string json = ConvertJson(obj);
   return await Do(db => db.StringSetAsync(key, json, expiry));
  }
 
  /// 
  /// 获取单个key的值
  /// 
  /// Redis Key
  /// 
  public async Task StringGetAsync(string key)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.StringGetAsync(key));
  }
 
  /// 
  /// 获取多个Key
  /// 
  /// Redis Key集合
  /// 
  public async Task StringGetAsync(List listKey)
  {
   List newKeys = listKey.Select(AddSysCustomKey).ToList();
   return await Do(db => db.StringGetAsync(ConvertRedisKeys(newKeys)));
  }
 
  /// 
  /// 获取一个key的对象
  /// 
  /// 
  /// 
  /// 
  public async Task StringGetAsync(string key)
  {
   key = AddSysCustomKey(key);
   string result = await Do(db => db.StringGetAsync(key));
   return ConvertObj(result);
  }
 
  /// 
  /// 为数字增长val
  /// 
  /// 
  /// 可以为负
  /// 增长后的值
  public async Task StringIncrementAsync(string key, double val = 1)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.StringIncrementAsync(key, val));
  }
 
  /// 
  /// 为数字减少val
  /// 
  /// 
  /// 可以为负
  /// 减少后的值
  public async Task StringDecrementAsync(string key, double val = 1)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.StringDecrementAsync(key, val));
  }
 
  #endregion 异步方法
 
  #endregion String

这里说一下,StackExchange.Redis 中对对象的存储是不自带序列化和反序列化的方法,所以在ConvertJson和ConvertObj里面我是使用了JsonConvert来操作,如果需要换成其他的序列化和序列化,直接修改这两个方面就好了,另外,StackExchange.Redis 相对于ServiceStack.Redis 来说提供了异步的方法,所以这里也同样封装了异步和同步的方法。

List类型的封装

#region List
 
  #region 同步方法
 
  /// 
  /// 移除指定ListId的内部List的值
  /// 
  /// 
  /// 
  public void ListRemove(string key, T value)
  {
   key = AddSysCustomKey(key);
   Do(db => db.ListRemove(key, ConvertJson(value)));
  }
 
  /// 
  /// 获取指定key的List
  /// 
  /// 
  /// 
  public List ListRange(string key)
  {
   key = AddSysCustomKey(key);
   return Do(redis =>
   {
    var values = redis.ListRange(key);
    return ConvetList(values);
   });
  }
 
  /// 
  /// 入队
  /// 
  /// 
  /// 
  public void ListRightPush(string key, T value)
  {
   key = AddSysCustomKey(key);
   Do(db => db.ListRightPush(key, ConvertJson(value)));
  }
 
  /// 
  /// 出队
  /// 
  /// 
  /// 
  /// 
  public T ListRightPop(string key)
  {
   key = AddSysCustomKey(key);
   return Do(db =>
    {
     var value = db.ListRightPop(key);
     return ConvertObj(value);
    });
  }
 
  /// 
  /// 入栈
  /// 
  /// 
  /// 
  /// 
  public void ListLeftPush(string key, T value)
  {
   key = AddSysCustomKey(key);
   Do(db => db.ListLeftPush(key, ConvertJson(value)));
  }
 
  /// 
  /// 出栈
  /// 
  /// 
  /// 
  /// 
  public T ListLeftPop(string key)
  {
   key = AddSysCustomKey(key);
   return Do(db =>
   {
    var value = db.ListLeftPop(key);
    return ConvertObj(value);
   });
  }
 
  /// 
  /// 获取集合中的数量
  /// 
  /// 
  /// 
  public long ListLength(string key)
  {
   key = AddSysCustomKey(key);
   return Do(redis => redis.ListLength(key));
  }
 
  #endregion 同步方法
 
  #region 异步方法
 
  /// 
  /// 移除指定ListId的内部List的值
  /// 
  /// 
  /// 
  public async Task ListRemoveAsync(string key, T value)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.ListRemoveAsync(key, ConvertJson(value)));
  }
 
  /// 
  /// 获取指定key的List
  /// 
  /// 
  /// 
  public async Task> ListRangeAsync(string key)
  {
   key = AddSysCustomKey(key);
   var values = await Do(redis => redis.ListRangeAsync(key));
   return ConvetList(values);
  }
 
  /// 
  /// 入队
  /// 
  /// 
  /// 
  public async Task ListRightPushAsync(string key, T value)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.ListRightPushAsync(key, ConvertJson(value)));
  }
 
  /// 
  /// 出队
  /// 
  /// 
  /// 
  /// 
  public async Task ListRightPopAsync(string key)
  {
   key = AddSysCustomKey(key);
   var value = await Do(db => db.ListRightPopAsync(key));
   return ConvertObj(value);
  }
 
  /// 
  /// 入栈
  /// 
  /// 
  /// 
  /// 
  public async Task ListLeftPushAsync(string key, T value)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.ListLeftPushAsync(key, ConvertJson(value)));
  }
 
  /// 
  /// 出栈
  /// 
  /// 
  /// 
  /// 
  public async Task ListLeftPopAsync(string key)
  {
   key = AddSysCustomKey(key);
   var value = await Do(db => db.ListLeftPopAsync(key));
   return ConvertObj(value);
  }
 
  /// 
  /// 获取集合中的数量
  /// 
  /// 
  /// 
  public async Task ListLengthAsync(string key)
  {
   key = AddSysCustomKey(key);
   return await Do(redis => redis.ListLengthAsync(key));
  }
 
  #endregion 异步方法
 
  #endregion List

Hash类型的封装

Glarity
Glarity

Glarity是一款免费开源的AI浏览器扩展,提供YouTube视频总结、网页摘要、写作工具等功能,支持免费的镜像翻译,电子邮件写作辅助,AI问答等功能。

下载
#region Hash
 
  #region 同步方法
 
  /// 
  /// 判断某个数据是否已经被缓存
  /// 
  /// 
  /// 
  /// 
  public bool HashExists(string key, string dataKey)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.HashExists(key, dataKey));
  }
 
  /// 
  /// 存储数据到hash表
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public bool HashSet(string key, string dataKey, T t)
  {
   key = AddSysCustomKey(key);
   return Do(db =>
   {
    string json = ConvertJson(t);
    return db.HashSet(key, dataKey, json);
   });
  }
 
  /// 
  /// 移除hash中的某值
  /// 
  /// 
  /// 
  /// 
  public bool HashDelete(string key, string dataKey)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.HashDelete(key, dataKey));
  }
 
  /// 
  /// 移除hash中的多个值
  /// 
  /// 
  /// 
  /// 
  public long HashDelete(string key, List dataKeys)
  {
   key = AddSysCustomKey(key);
   //List dataKeys1 = new List() {"1","2"};
   return Do(db => db.HashDelete(key, dataKeys.ToArray()));
  }
 
  /// 
  /// 从hash表获取数据
  /// 
  /// 
  /// 
  /// 
  /// 
  public T HashGet(string key, string dataKey)
  {
   key = AddSysCustomKey(key);
   return Do(db =>
   {
    string value = db.HashGet(key, dataKey);
    return ConvertObj(value);
   });
  }
 
  /// 
  /// 为数字增长val
  /// 
  /// 
  /// 
  /// 可以为负
  /// 增长后的值
  public double HashIncrement(string key, string dataKey, double val = 1)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.HashIncrement(key, dataKey, val));
  }
 
  /// 
  /// 为数字减少val
  /// 
  /// 
  /// 
  /// 可以为负
  /// 减少后的值
  public double HashDecrement(string key, string dataKey, double val = 1)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.HashDecrement(key, dataKey, val));
  }
 
  /// 
  /// 获取hashkey所有Redis key
  /// 
  /// 
  /// 
  /// 
  public List HashKeys(string key)
  {
   key = AddSysCustomKey(key);
   return Do(db =>
   {
    RedisValue[] values = db.HashKeys(key);
    return ConvetList(values);
   });
  }
 
  #endregion 同步方法
 
  #region 异步方法
 
  /// 
  /// 判断某个数据是否已经被缓存
  /// 
  /// 
  /// 
  /// 
  public async Task HashExistsAsync(string key, string dataKey)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.HashExistsAsync(key, dataKey));
  }
 
  /// 
  /// 存储数据到hash表
  /// 
  /// 
  /// 
  /// 
  /// 
  /// 
  public async Task HashSetAsync(string key, string dataKey, T t)
  {
   key = AddSysCustomKey(key);
   return await Do(db =>
   {
    string json = ConvertJson(t);
    return db.HashSetAsync(key, dataKey, json);
   });
  }
 
  /// 
  /// 移除hash中的某值
  /// 
  /// 
  /// 
  /// 
  public async Task HashDeleteAsync(string key, string dataKey)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.HashDeleteAsync(key, dataKey));
  }
 
  /// 
  /// 移除hash中的多个值
  /// 
  /// 
  /// 
  /// 
  public async Task HashDeleteAsync(string key, List dataKeys)
  {
   key = AddSysCustomKey(key);
   //List dataKeys1 = new List() {"1","2"};
   return await Do(db => db.HashDeleteAsync(key, dataKeys.ToArray()));
  }
 
  /// 
  /// 从hash表获取数据
  /// 
  /// 
  /// 
  /// 
  /// 
  public async Task HashGeAsync(string key, string dataKey)
  {
   key = AddSysCustomKey(key);
   string value = await Do(db => db.HashGetAsync(key, dataKey));
   return ConvertObj(value);
  }
 
  /// 
  /// 为数字增长val
  /// 
  /// 
  /// 
  /// 可以为负
  /// 增长后的值
  public async Task HashIncrementAsync(string key, string dataKey, double val = 1)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.HashIncrementAsync(key, dataKey, val));
  }
 
  /// 
  /// 为数字减少val
  /// 
  /// 
  /// 
  /// 可以为负
  /// 减少后的值
  public async Task HashDecrementAsync(string key, string dataKey, double val = 1)
  {
   key = AddSysCustomKey(key);
   return await Do(db => db.HashDecrementAsync(key, dataKey, val));
  }
 
  /// 
  /// 获取hashkey所有Redis key
  /// 
  /// 
  /// 
  /// 
  public async Task> HashKeysAsync(string key)
  {
   key = AddSysCustomKey(key);
   RedisValue[] values = await Do(db => db.HashKeysAsync(key));
   return ConvetList(values);
  }
 
  #endregion 异步方法
 
  #endregion Hash

SortedSet 类型的封装

#region SortedSet 有序集合
 
  #region 同步方法
 
  /// 
  /// 添加
  /// 
  /// 
  /// 
  /// 
  public bool SortedSetAdd(string key, T value, double score)
  {
   key = AddSysCustomKey(key);
   return Do(redis => redis.SortedSetAdd(key, ConvertJson(value), score));
  }
 
  /// 
  /// 删除
  /// 
  /// 
  /// 
  public bool SortedSetRemove(string key, T value)
  {
   key = AddSysCustomKey(key);
   return Do(redis => redis.SortedSetRemove(key, ConvertJson(value)));
  }
 
  /// 
  /// 获取全部
  /// 
  /// 
  /// 
  public List SortedSetRangeByRank(string key)
  {
   key = AddSysCustomKey(key);
   return Do(redis =>
   {
    var values = redis.SortedSetRangeByRank(key);
    return ConvetList(values);
   });
  }
 
  /// 
  /// 获取集合中的数量
  /// 
  /// 
  /// 
  public long SortedSetLength(string key)
  {
   key = AddSysCustomKey(key);
   return Do(redis => redis.SortedSetLength(key));
  }
 
  #endregion 同步方法
 
  #region 异步方法
 
  /// 
  /// 添加
  /// 
  /// 
  /// 
  /// 
  public async Task SortedSetAddAsync(string key, T value, double score)
  {
   key = AddSysCustomKey(key);
   return await Do(redis => redis.SortedSetAddAsync(key, ConvertJson(value), score));
  }
 
  /// 
  /// 删除
  /// 
  /// 
  /// 
  public async Task SortedSetRemoveAsync(string key, T value)
  {
   key = AddSysCustomKey(key);
   return await Do(redis => redis.SortedSetRemoveAsync(key, ConvertJson(value)));
  }
 
  /// 
  /// 获取全部
  /// 
  /// 
  /// 
  public async Task> SortedSetRangeByRankAsync(string key)
  {
   key = AddSysCustomKey(key);
   var values = await Do(redis => redis.SortedSetRangeByRankAsync(key));
   return ConvetList(values);
  }
 
  /// 
  /// 获取集合中的数量
  /// 
  /// 
  /// 
  public async Task SortedSetLengthAsync(string key)
  {
   key = AddSysCustomKey(key);
   return await Do(redis => redis.SortedSetLengthAsync(key));
  }
 
  #endregion 异步方法
 
  #endregion SortedSet 有序集合

key的管理

#region key
 
  /// 
  /// 删除单个key
  /// 
  /// redis key
  /// 是否删除成功
  public bool KeyDelete(string key)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.KeyDelete(key));
  }
 
  /// 
  /// 删除多个key
  /// 
  /// rediskey
  /// 成功删除的个数
  public long KeyDelete(List keys)
  {
   List newKeys = keys.Select(AddSysCustomKey).ToList();
   return Do(db => db.KeyDelete(ConvertRedisKeys(newKeys)));
  }
 
  /// 
  /// 判断key是否存储
  /// 
  /// redis key
  /// 
  public bool KeyExists(string key)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.KeyExists(key));
  }
 
  /// 
  /// 重新命名key
  /// 
  /// 就的redis key
  /// 新的redis key
  /// 
  public bool KeyRename(string key, string newKey)
  {
   key = AddSysCustomKey(key);
   return Do(db => db.KeyRename(key, newKey));
  }
 
  /// 
  /// 设置Key的时间
  /// 
  /// redis key
  /// 
  /// 
  public bool KeyExpire(string key, TimeSpan? expiry = default(TimeSpan?))
  {
   key = AddSysCustomKey(key);
   return Do(db => db.KeyExpire(key, expiry));
  }
 
  #endregion key

发布和订阅

#region 发布订阅
 
  /// 
  /// Redis发布订阅 订阅
  /// 
  /// 
  /// 
  public void Subscribe(string subChannel, Action handler = null)
  {
   ISubscriber sub = _conn.GetSubscriber();
   sub.Subscribe(subChannel, (channel, message) =>
   {
    if (handler == null)
    {
     Console.WriteLine(subChannel + " 订阅收到消息:" + message);
    }
    else
    {
     handler(channel, message);
    }
   });
  }
 
  /// 
  /// Redis发布订阅 发布
  /// 
  /// 
  /// 
  /// 
  /// 
  public long Publish(string channel, T msg)
  {
   ISubscriber sub = _conn.GetSubscriber();
   return sub.Publish(channel, ConvertJson(msg));
  }
 
  /// 
  /// Redis发布订阅 取消订阅
  /// 
  /// 
  public void Unsubscribe(string channel)
  {
   ISubscriber sub = _conn.GetSubscriber();
   sub.Unsubscribe(channel);
  }
 
  /// 
  /// Redis发布订阅 取消全部订阅
  /// 
  public void UnsubscribeAll()
  {
   ISubscriber sub = _conn.GetSubscriber();
   sub.UnsubscribeAll();
  }
 
  #endregion 发布订阅

其他

#region 其他
 
  public ITransaction CreateTransaction()
  {
   return GetDatabase().CreateTransaction();
  }
 
  public IDatabase GetDatabase()
  {
   return _conn.GetDatabase(DbNum);
  }
 
  public IServer GetServer(string hostAndPort)
  {
   return _conn.GetServer(hostAndPort);
  }
 
  /// 
  /// 设置前缀
  /// 
  /// 
  public void SetSysCustomKey(string customKey)
  {
   CustomKey = customKey;
  }
 
  #endregion 其他

以上就是对StackExchange.Redis基本操作的通用封装,提供给大家学习参考,如果有哪里写错的,也希望能一起交流。

问题:

StackExchange.Redis没有提供Redis分布式锁的操作么?ServiceStack.Redis 提供了AcquireLock 的方法来操作,StackExchange.Redis 源码中只找到了LockTake的方法,并没有找到其他的方法了,如果有人使用过,还希望能提供下。

更多详解StackExchange.Redis通用封装类分享相关文章请关注PHP中文网!

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

91

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

27

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

5

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

27

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号