首页 > 代码库 > StackExchange.Redis通用封装类分享
StackExchange.Redis通用封装类分享
前两天朋友问我,有没有使用过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对象是StackExchange.Redis最中枢的对象。这个类的实例需要被整个应用程序域共享和重用的,所以不需要在每个操作中不停的创建该对象的实例,一般都是使用单例来创建和存放这个对象,这个在官网上也有说明。
ConnectionMultiplexer 封装
1 /// <summary> 2 /// ConnectionMultiplexer对象管理帮助类 3 /// </summary> 4 public static class RedisConnectionHelp 5 { 6 //系统自定义Key前缀 7 public static readonly string SysCustomKey = ConfigurationManager.AppSettings["redisKey"] ?? ""; 8 9 //"127.0.0.1:6379,allowadmin=true 10 private static readonly string RedisConnectionString = ConfigurationManager.ConnectionStrings["RedisExchangeHosts"].ConnectionString; 11 12 private static readonly object Locker = new object(); 13 private static ConnectionMultiplexer _instance; 14 private static readonly ConcurrentDictionary<string, ConnectionMultiplexer> ConnectionCache = new ConcurrentDictionary<string, ConnectionMultiplexer>(); 15 16 /// <summary> 17 /// 单例获取 18 /// </summary> 19 public static ConnectionMultiplexer Instance 20 { 21 get 22 { 23 if (_instance == null) 24 { 25 lock (Locker) 26 { 27 if (_instance == null || !_instance.IsConnected) 28 { 29 _instance = GetManager(); 30 } 31 } 32 } 33 return _instance; 34 } 35 } 36 37 /// <summary> 38 /// 缓存获取 39 /// </summary> 40 /// <param name="connectionString"></param> 41 /// <returns></returns> 42 public static ConnectionMultiplexer GetConnectionMultiplexer(string connectionString) 43 { 44 if (!ConnectionCache.ContainsKey(connectionString)) 45 { 46 ConnectionCache[connectionString] = GetManager(connectionString); 47 } 48 return ConnectionCache[connectionString]; 49 } 50 51 private static ConnectionMultiplexer GetManager(string connectionString = null) 52 { 53 connectionString = connectionString ?? RedisConnectionString; 54 var connect = ConnectionMultiplexer.Connect(connectionString); 55 56 //注册如下事件 57 connect.ConnectionFailed += MuxerConnectionFailed; 58 connect.ConnectionRestored += MuxerConnectionRestored; 59 connect.ErrorMessage += MuxerErrorMessage; 60 connect.ConfigurationChanged += MuxerConfigurationChanged; 61 connect.HashSlotMoved += MuxerHashSlotMoved; 62 connect.InternalError += MuxerInternalError; 63 64 return connect; 65 } 66 67 #region 事件 68 69 /// <summary> 70 /// 配置更改时 71 /// </summary> 72 /// <param name="sender"></param> 73 /// <param name="e"></param> 74 private static void MuxerConfigurationChanged(object sender, EndPointEventArgs e) 75 { 76 Console.WriteLine("Configuration changed: " + e.EndPoint); 77 } 78 79 /// <summary> 80 /// 发生错误时 81 /// </summary> 82 /// <param name="sender"></param> 83 /// <param name="e"></param> 84 private static void MuxerErrorMessage(object sender, RedisErrorEventArgs e) 85 { 86 Console.WriteLine("ErrorMessage: " + e.Message); 87 } 88 89 /// <summary> 90 /// 重新建立连接之前的错误 91 /// </summary> 92 /// <param name="sender"></param> 93 /// <param name="e"></param> 94 private static void MuxerConnectionRestored(object sender, ConnectionFailedEventArgs e) 95 { 96 Console.WriteLine("ConnectionRestored: " + e.EndPoint); 97 } 98 99 /// <summary>100 /// 连接失败 , 如果重新连接成功你将不会收到这个通知101 /// </summary>102 /// <param name="sender"></param>103 /// <param name="e"></param>104 private static void MuxerConnectionFailed(object sender, ConnectionFailedEventArgs e)105 {106 Console.WriteLine("重新连接:Endpoint failed: " + e.EndPoint + ", " + e.FailureType + (e.Exception == null ? "" : (", " + e.Exception.Message)));107 }108 109 /// <summary>110 /// 更改集群111 /// </summary>112 /// <param name="sender"></param>113 /// <param name="e"></param>114 private static void MuxerHashSlotMoved(object sender, HashSlotMovedEventArgs e)115 {116 Console.WriteLine("HashSlotMoved:NewEndPoint" + e.NewEndPoint + ", OldEndPoint" + e.OldEndPoint);117 }118 119 /// <summary>120 /// redis类库错误121 /// </summary>122 /// <param name="sender"></param>123 /// <param name="e"></param>124 private static void MuxerInternalError(object sender, InternalErrorEventArgs e)125 {126 Console.WriteLine("InternalError:Message" + e.Exception.Message);127 }128 129 #endregion 事件130 }
RedisHelper 通用操作类封装
1 public class RedisHelper 2 { 3 private int DbNum { get; } 4 private readonly ConnectionMultiplexer _conn; 5 public string CustomKey; 6 7 #region 构造函数 8 9 public RedisHelper(int dbNum = 0)10 : this(dbNum, null)11 {12 }13 14 public RedisHelper(int dbNum, string readWriteHosts)15 {16 DbNum = dbNum;17 _conn =18 string.IsNullOrWhiteSpace(readWriteHosts) ?19 RedisConnectionHelp.Instance :20 RedisConnectionHelp.GetConnectionMultiplexer(readWriteHosts);21 }22 23 private string AddSysCustomKey(string oldKey)24 {25 var prefixKey = CustomKey ?? RedisConnectionHelp.SysCustomKey;26 return prefixKey + oldKey;27 }28 29 private T Do<T>(Func<IDatabase, T> func)30 {31 var database = _conn.GetDatabase(DbNum);32 return func(database);33 }34 }
其中CustomKey用来表示系统前缀,AddSysCustomKey方法对每个key都进行前缀的添加处理,这里推荐大家在命名redis的key的时候最好的加上前缀,并且使用 :来分割前缀 ,这里在使用可视化工具查看的时候就比较好区分,比如我的的前缀是 Demo:test:(一般是 系统名:业务名:),然后你查看的时候你会发现整齐,好区分了很多
String类型的封装
1 #region String 2 3 #region 同步方法 4 5 /// <summary> 6 /// 保存单个key value 7 /// </summary> 8 /// <param name="key">Redis Key</param> 9 /// <param name="value">保存的值</param> 10 /// <param name="expiry">过期时间</param> 11 /// <returns></returns> 12 public bool StringSet(string key, string value, TimeSpan? expiry = default(TimeSpan?)) 13 { 14 key = AddSysCustomKey(key); 15 return Do(db => db.StringSet(key, value, expiry)); 16 } 17 18 /// <summary> 19 /// 保存多个key value 20 /// </summary> 21 /// <param name="keyValues">键值对</param> 22 /// <returns></returns> 23 public bool StringSet(List<KeyValuePair<RedisKey, RedisValue>> keyValues) 24 { 25 List<KeyValuePair<RedisKey, RedisValue>> newkeyValues = 26 keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(AddSysCustomKey(p.Key), p.Value)).ToList(); 27 return Do(db => db.StringSet(newkeyValues.ToArray())); 28 } 29 30 /// <summary> 31 /// 保存一个对象 32 /// </summary> 33 /// <typeparam name="T"></typeparam> 34 /// <param name="key"></param> 35 /// <param name="obj"></param> 36 /// <param name="expiry"></param> 37 /// <returns></returns> 38 public bool StringSet<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?)) 39 { 40 key = AddSysCustomKey(key); 41 string json = ConvertJson(obj); 42 return Do(db => db.StringSet(key, json, expiry)); 43 } 44 45 /// <summary> 46 /// 获取单个key的值 47 /// </summary> 48 /// <param name="key">Redis Key</param> 49 /// <returns></returns> 50 public string StringGet(string key) 51 { 52 key = AddSysCustomKey(key); 53 return Do(db => db.StringGet(key)); 54 } 55 56 /// <summary> 57 /// 获取多个Key 58 /// </summary> 59 /// <param name="listKey">Redis Key集合</param> 60 /// <returns></returns> 61 public RedisValue[] StringGet(List<string> listKey) 62 { 63 List<string> newKeys = listKey.Select(AddSysCustomKey).ToList(); 64 return Do(db => db.StringGet(ConvertRedisKeys(newKeys))); 65 } 66 67 /// <summary> 68 /// 获取一个key的对象 69 /// </summary> 70 /// <typeparam name="T"></typeparam> 71 /// <param name="key"></param> 72 /// <returns></returns> 73 public T StringGet<T>(string key) 74 { 75 key = AddSysCustomKey(key); 76 return Do(db => ConvertObj<T>(db.StringGet(key))); 77 } 78 79 /// <summary> 80 /// 为数字增长val 81 /// </summary> 82 /// <param name="key"></param> 83 /// <param name="val">可以为负</param> 84 /// <returns>增长后的值</returns> 85 public double StringIncrement(string key, double val = 1) 86 { 87 key = AddSysCustomKey(key); 88 return Do(db => db.StringIncrement(key, val)); 89 } 90 91 /// <summary> 92 /// 为数字减少val 93 /// </summary> 94 /// <param name="key"></param> 95 /// <param name="val">可以为负</param> 96 /// <returns>减少后的值</returns> 97 public double StringDecrement(string key, double val = 1) 98 { 99 key = AddSysCustomKey(key);100 return Do(db => db.StringDecrement(key, val));101 }102 103 #endregion 同步方法104 105 #region 异步方法106 107 /// <summary>108 /// 保存单个key value109 /// </summary>110 /// <param name="key">Redis Key</param>111 /// <param name="value">保存的值</param>112 /// <param name="expiry">过期时间</param>113 /// <returns></returns>114 public async Task<bool> StringSetAsync(string key, string value, TimeSpan? expiry = default(TimeSpan?))115 {116 key = AddSysCustomKey(key);117 return await Do(db => db.StringSetAsync(key, value, expiry));118 }119 120 /// <summary>121 /// 保存多个key value122 /// </summary>123 /// <param name="keyValues">键值对</param>124 /// <returns></returns>125 public async Task<bool> StringSetAsync(List<KeyValuePair<RedisKey, RedisValue>> keyValues)126 {127 List<KeyValuePair<RedisKey, RedisValue>> newkeyValues =128 keyValues.Select(p => new KeyValuePair<RedisKey, RedisValue>(AddSysCustomKey(p.Key), p.Value)).ToList();129 return await Do(db => db.StringSetAsync(newkeyValues.ToArray()));130 }131 132 /// <summary>133 /// 保存一个对象134 /// </summary>135 /// <typeparam name="T"></typeparam>136 /// <param name="key"></param>137 /// <param name="obj"></param>138 /// <param name="expiry"></param>139 /// <returns></returns>140 public async Task<bool> StringSetAsync<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))141 {142 key = AddSysCustomKey(key);143 string json = ConvertJson(obj);144 return await Do(db => db.StringSetAsync(key, json, expiry));145 }146 147 /// <summary>148 /// 获取单个key的值149 /// </summary>150 /// <param name="key">Redis Key</param>151 /// <returns></returns>152 public async Task<string> StringGetAsync(string key)153 {154 key = AddSysCustomKey(key);155 return await Do(db => db.StringGetAsync(key));156 }157 158 /// <summary>159 /// 获取多个Key160 /// </summary>161 /// <param name="listKey">Redis Key集合</param>162 /// <returns></returns>163 public async Task<RedisValue[]> StringGetAsync(List<string> listKey)164 {165 List<string> newKeys = listKey.Select(AddSysCustomKey).ToList();166 return await Do(db => db.StringGetAsync(ConvertRedisKeys(newKeys)));167 }168 169 /// <summary>170 /// 获取一个key的对象171 /// </summary>172 /// <typeparam name="T"></typeparam>173 /// <param name="key"></param>174 /// <returns></returns>175 public async Task<T> StringGetAsync<T>(string key)176 {177 key = AddSysCustomKey(key);178 string result = await Do(db => db.StringGetAsync(key));179 return ConvertObj<T>(result);180 }181 182 /// <summary>183 /// 为数字增长val184 /// </summary>185 /// <param name="key"></param>186 /// <param name="val">可以为负</param>187 /// <returns>增长后的值</returns>188 public async Task<double> StringIncrementAsync(string key, double val = 1)189 {190 key = AddSysCustomKey(key);191 return await Do(db => db.StringIncrementAsync(key, val));192 }193 194 /// <summary>195 /// 为数字减少val196 /// </summary>197 /// <param name="key"></param>198 /// <param name="val">可以为负</param>199 /// <returns>减少后的值</returns>200 public async Task<double> StringDecrementAsync(string key, double val = 1)201 {202 key = AddSysCustomKey(key);203 return await Do(db => db.StringDecrementAsync(key, val));204 }205 206 #endregion 异步方法207 208 #endregion String
这里说一下,StackExchange.Redis 中对对象的存储是不自带序列化和反序列化的方法,所以在ConvertJson和ConvertObj里面我是使用了JsonConvert来操作,如果需要换成其他的序列化和序列化,直接修改这两个方面就好了,另外,StackExchange.Redis 相对于ServiceStack.Redis 来说提供了异步的方法,所以这里也同样封装了异步和同步的方法。
Hash类型的封装
1 #region Hash 2 3 #region 同步方法 4 5 /// <summary> 6 /// 判断某个数据是否已经被缓存 7 /// </summary> 8 /// <param name="key"></param> 9 /// <param name="dataKey"></param> 10 /// <returns></returns> 11 public bool HashExists(string key, string dataKey) 12 { 13 key = AddSysCustomKey(key); 14 return Do(db => db.HashExists(key, dataKey)); 15 } 16 17 /// <summary> 18 /// 存储数据到hash表 19 /// </summary> 20 /// <typeparam name="T"></typeparam> 21 /// <param name="key"></param> 22 /// <param name="dataKey"></param> 23 /// <param name="t"></param> 24 /// <returns></returns> 25 public bool HashSet<T>(string key, string dataKey, T t) 26 { 27 key = AddSysCustomKey(key); 28 return Do(db => 29 { 30 string json = ConvertJson(t); 31 return db.HashSet(key, dataKey, json); 32 }); 33 } 34 35 /// <summary> 36 /// 移除hash中的某值 37 /// </summary> 38 /// <param name="key"></param> 39 /// <param name="dataKey"></param> 40 /// <returns></returns> 41 public bool HashDelete(string key, string dataKey) 42 { 43 key = AddSysCustomKey(key); 44 return Do(db => db.HashDelete(key, dataKey)); 45 } 46 47 /// <summary> 48 /// 移除hash中的多个值 49 /// </summary> 50 /// <param name="key"></param> 51 /// <param name="dataKeys"></param> 52 /// <returns></returns> 53 public long HashDelete(string key, List<RedisValue> dataKeys) 54 { 55 key = AddSysCustomKey(key); 56 //List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"}; 57 return Do(db => db.HashDelete(key, dataKeys.ToArray())); 58 } 59 60 /// <summary> 61 /// 从hash表获取数据 62 /// </summary> 63 /// <typeparam name="T"></typeparam> 64 /// <param name="key"></param> 65 /// <param name="dataKey"></param> 66 /// <returns></returns> 67 public T HashGet<T>(string key, string dataKey) 68 { 69 key = AddSysCustomKey(key); 70 return Do(db => 71 { 72 string value =http://www.mamicode.com/ db.HashGet(key, dataKey); 73 return ConvertObj<T>(value); 74 }); 75 } 76 77 /// <summary> 78 /// 为数字增长val 79 /// </summary> 80 /// <param name="key"></param> 81 /// <param name="dataKey"></param> 82 /// <param name="val">可以为负</param> 83 /// <returns>增长后的值</returns> 84 public double HashIncrement(string key, string dataKey, double val = 1) 85 { 86 key = AddSysCustomKey(key); 87 return Do(db => db.HashIncrement(key, dataKey, val)); 88 } 89 90 /// <summary> 91 /// 为数字减少val 92 /// </summary> 93 /// <param name="key"></param> 94 /// <param name="dataKey"></param> 95 /// <param name="val">可以为负</param> 96 /// <returns>减少后的值</returns> 97 public double HashDecrement(string key, string dataKey, double val = 1) 98 { 99 key = AddSysCustomKey(key);100 return Do(db => db.HashDecrement(key, dataKey, val));101 }102 103 /// <summary>104 /// 获取hashkey所有Redis key105 /// </summary>106 /// <typeparam name="T"></typeparam>107 /// <param name="key"></param>108 /// <returns></returns>109 public List<T> HashKeys<T>(string key)110 {111 key = AddSysCustomKey(key);112 return Do(db =>113 {114 RedisValue[] values = db.HashKeys(key);115 return ConvetList<T>(values);116 });117 }118 119 #endregion 同步方法120 121 #region 异步方法122 123 /// <summary>124 /// 判断某个数据是否已经被缓存125 /// </summary>126 /// <param name="key"></param>127 /// <param name="dataKey"></param>128 /// <returns></returns>129 public async Task<bool> HashExistsAsync(string key, string dataKey)130 {131 key = AddSysCustomKey(key);132 return await Do(db => db.HashExistsAsync(key, dataKey));133 }134 135 /// <summary>136 /// 存储数据到hash表137 /// </summary>138 /// <typeparam name="T"></typeparam>139 /// <param name="key"></param>140 /// <param name="dataKey"></param>141 /// <param name="t"></param>142 /// <returns></returns>143 public async Task<bool> HashSetAsync<T>(string key, string dataKey, T t)144 {145 key = AddSysCustomKey(key);146 return await Do(db =>147 {148 string json = ConvertJson(t);149 return db.HashSetAsync(key, dataKey, json);150 });151 }152 153 /// <summary>154 /// 移除hash中的某值155 /// </summary>156 /// <param name="key"></param>157 /// <param name="dataKey"></param>158 /// <returns></returns>159 public async Task<bool> HashDeleteAsync(string key, string dataKey)160 {161 key = AddSysCustomKey(key);162 return await Do(db => db.HashDeleteAsync(key, dataKey));163 }164 165 /// <summary>166 /// 移除hash中的多个值167 /// </summary>168 /// <param name="key"></param>169 /// <param name="dataKeys"></param>170 /// <returns></returns>171 public async Task<long> HashDeleteAsync(string key, List<RedisValue> dataKeys)172 {173 key = AddSysCustomKey(key);174 //List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};175 return await Do(db => db.HashDeleteAsync(key, dataKeys.ToArray()));176 }177 178 /// <summary>179 /// 从hash表获取数据180 /// </summary>181 /// <typeparam name="T"></typeparam>182 /// <param name="key"></param>183 /// <param name="dataKey"></param>184 /// <returns></returns>185 public async Task<T> HashGeAsync<T>(string key, string dataKey)186 {187 key = AddSysCustomKey(key);188 string value = http://www.mamicode.com/await Do(db => db.HashGetAsync(key, dataKey));189 return ConvertObj<T>(value);190 }191 192 /// <summary>193 /// 为数字增长val194 /// </summary>195 /// <param name="key"></param>196 /// <param name="dataKey"></param>197 /// <param name="val">可以为负</param>198 /// <returns>增长后的值</returns>199 public async Task<double> HashIncrementAsync(string key, string dataKey, double val = 1)200 {201 key = AddSysCustomKey(key);202 return await Do(db => db.HashIncrementAsync(key, dataKey, val));203 }204 205 /// <summary>206 /// 为数字减少val207 /// </summary>208 /// <param name="key"></param>209 /// <param name="dataKey"></param>210 /// <param name="val">可以为负</param>211 /// <returns>减少后的值</returns>212 public async Task<double> HashDecrementAsync(string key, string dataKey, double val = 1)213 {214 key = AddSysCustomKey(key);215 return await Do(db => db.HashDecrementAsync(key, dataKey, val));216 }217 218 /// <summary>219 /// 获取hashkey所有Redis key220 /// </summary>221 /// <typeparam name="T"></typeparam>222 /// <param name="key"></param>223 /// <returns></returns>224 public async Task<List<T>> HashKeysAsync<T>(string key)225 {226 key = AddSysCustomKey(key);227 RedisValue[] values = await Do(db => db.HashKeysAsync(key));228 return ConvetList<T>(values);229 }230 231 #endregion 异步方法232 233 #endregion Hash
List类型的封装
1 #region List 2 3 #region 同步方法 4 5 /// <summary> 6 /// 移除指定ListId的内部List的值 7 /// </summary> 8 /// <param name="key"></param> 9 /// <param name="value"></param> 10 public void ListRemove<T>(string key, T value) 11 { 12 key = AddSysCustomKey(key); 13 Do(db => db.ListRemove(key, ConvertJson(value))); 14 } 15 16 /// <summary> 17 /// 获取指定key的List 18 /// </summary> 19 /// <param name="key"></param> 20 /// <returns></returns> 21 public List<T> ListRange<T>(string key) 22 { 23 key = AddSysCustomKey(key); 24 return Do(redis => 25 { 26 var values = redis.ListRange(key); 27 return ConvetList<T>(values); 28 }); 29 } 30 31 /// <summary> 32 /// 入队 33 /// </summary> 34 /// <param name="key"></param> 35 /// <param name="value"></param> 36 public void ListRightPush<T>(string key, T value) 37 { 38 key = AddSysCustomKey(key); 39 Do(db => db.ListRightPush(key, ConvertJson(value))); 40 } 41 42 /// <summary> 43 /// 出队 44 /// </summary> 45 /// <typeparam name="T"></typeparam> 46 /// <param name="key"></param> 47 /// <returns></returns> 48 public T ListRightPop<T>(string key) 49 { 50 key = AddSysCustomKey(key); 51 return Do(db => 52 { 53 var value =http://www.mamicode.com/ db.ListRightPop(key); 54 return ConvertObj<T>(value); 55 }); 56 } 57 58 /// <summary> 59 /// 入栈 60 /// </summary> 61 /// <typeparam name="T"></typeparam> 62 /// <param name="key"></param> 63 /// <param name="value"></param> 64 public void ListLeftPush<T>(string key, T value) 65 { 66 key = AddSysCustomKey(key); 67 Do(db => db.ListLeftPush(key, ConvertJson(value))); 68 } 69 70 /// <summary> 71 /// 出栈 72 /// </summary> 73 /// <typeparam name="T"></typeparam> 74 /// <param name="key"></param> 75 /// <returns></returns> 76 public T ListLeftPop<T>(string key) 77 { 78 key = AddSysCustomKey(key); 79 return Do(db => 80 { 81 var value =http://www.mamicode.com/ db.ListLeftPop(key); 82 return ConvertObj<T>(value); 83 }); 84 } 85 86 /// <summary> 87 /// 获取集合中的数量 88 /// </summary> 89 /// <param name="key"></param> 90 /// <returns></returns> 91 public long ListLength(string key) 92 { 93 key = AddSysCustomKey(key); 94 return Do(redis => redis.ListLength(key)); 95 } 96 97 #endregion 同步方法 98 99 #region 异步方法100 101 /// <summary>102 /// 移除指定ListId的内部List的值103 /// </summary>104 /// <param name="key"></param>105 /// <param name="value"></param>106 public async Task<long> ListRemoveAsync<T>(string key, T value)107 {108 key = AddSysCustomKey(key);109 return await Do(db => db.ListRemoveAsync(key, ConvertJson(value)));110 }111 112 /// <summary>113 /// 获取指定key的List114 /// </summary>115 /// <param name="key"></param>116 /// <returns></returns>117 public async Task<List<T>> ListRangeAsync<T>(string key)118 {119 key = AddSysCustomKey(key);120 var values = await Do(redis => redis.ListRangeAsync(key));121 return ConvetList<T>(values);122 }123 124 /// <summary>125 /// 入队126 /// </summary>127 /// <param name="key"></param>128 /// <param name="value"></param>129 public async Task<long> ListRightPushAsync<T>(string key, T value)130 {131 key = AddSysCustomKey(key);132 return await Do(db => db.ListRightPushAsync(key, ConvertJson(value)));133 }134 135 /// <summary>136 /// 出队137 /// </summary>138 /// <typeparam name="T"></typeparam>139 /// <param name="key"></param>140 /// <returns></returns>141 public async Task<T> ListRightPopAsync<T>(string key)142 {143 key = AddSysCustomKey(key);144 var value = http://www.mamicode.com/await Do(db => db.ListRightPopAsync(key));145 return ConvertObj<T>(value);146 }147 148 /// <summary>149 /// 入栈150 /// </summary>151 /// <typeparam name="T"></typeparam>152 /// <param name="key"></param>153 /// <param name="value"></param>154 public async Task<long> ListLeftPushAsync<T>(string key, T value)155 {156 key = AddSysCustomKey(key);157 return await Do(db => db.ListLeftPushAsync(key, ConvertJson(value)));158 }159 160 /// <summary>161 /// 出栈162 /// </summary>163 /// <typeparam name="T"></typeparam>164 /// <param name="key"></param>165 /// <returns></returns>166 public async Task<T> ListLeftPopAsync<T>(string key)167 {168 key = AddSysCustomKey(key);169 var value = http://www.mamicode.com/await Do(db => db.ListLeftPopAsync(key));170 return ConvertObj<T>(value);171 }172 173 /// <summary>174 /// 获取集合中的数量175 /// </summary>176 /// <param name="key"></param>177 /// <returns></returns>178 public async Task<long> ListLengthAsync(string key)179 {180 key = AddSysCustomKey(key);181 return await Do(redis => redis.ListLengthAsync(key));182 }183 184 #endregion 异步方法185 186 #endregion List
SortedSet 类型的封装
1 #region SortedSet 有序集合 2 3 #region 同步方法 4 5 /// <summary> 6 /// 添加 7 /// </summary> 8 /// <param name="key"></param> 9 /// <param name="value"></param> 10 /// <param name="score"></param> 11 public bool SortedSetAdd<T>(string key, T value, double score) 12 { 13 key = AddSysCustomKey(key); 14 return Do(redis => redis.SortedSetAdd(key, ConvertJson<T>(value), score)); 15 } 16 17 /// <summary> 18 /// 删除 19 /// </summary> 20 /// <param name="key"></param> 21 /// <param name="value"></param> 22 public bool SortedSetRemove<T>(string key, T value) 23 { 24 key = AddSysCustomKey(key); 25 return Do(redis => redis.SortedSetRemove(key, ConvertJson(value))); 26 } 27 28 /// <summary> 29 /// 获取全部 30 /// </summary> 31 /// <param name="key"></param> 32 /// <returns></returns> 33 public List<T> SortedSetRangeByRank<T>(string key) 34 { 35 key = AddSysCustomKey(key); 36 return Do(redis => 37 { 38 var values = redis.SortedSetRangeByRank(key); 39 return ConvetList<T>(values); 40 }); 41 } 42 43 /// <summary> 44 /// 获取集合中的数量 45 /// </summary> 46 /// <param name="key"></param> 47 /// <returns></returns> 48 public long SortedSetLength(string key) 49 { 50 key = AddSysCustomKey(key); 51 return Do(redis => redis.SortedSetLength(key)); 52 } 53 54 #endregion 同步方法 55 56 #region 异步方法 57 58 /// <summary> 59 /// 添加 60 /// </summary> 61 /// <param name="key"></param> 62 /// <param name="value"></param> 63 /// <param name="score"></param> 64 public async Task<bool> SortedSetAddAsync<T>(string key, T value, double score) 65 { 66 key = AddSysCustomKey(key); 67 return await Do(redis => redis.SortedSetAddAsync(key, ConvertJson<T>(value), score)); 68 } 69 70 /// <summary> 71 /// 删除 72 /// </summary> 73 /// <param name="key"></param> 74 /// <param name="value"></param> 75 public async Task<bool> SortedSetRemoveAsync<T>(string key, T value) 76 { 77 key = AddSysCustomKey(key); 78 return await Do(redis => redis.SortedSetRemoveAsync(key, ConvertJson(value))); 79 } 80 81 /// <summary> 82 /// 获取全部 83 /// </summary> 84 /// <param name="key"></param> 85 /// <returns></returns> 86 public async Task<List<T>> SortedSetRangeByRankAsync<T>(string key) 87 { 88 key = AddSysCustomKey(key); 89 var values = await Do(redis => redis.SortedSetRangeByRankAsync(key)); 90 return ConvetList<T>(values); 91 } 92 93 /// <summary> 94 /// 获取集合中的数量 95 /// </summary> 96 /// <param name="key"></param> 97 /// <returns></returns> 98 public async Task<long> SortedSetLengthAsync(string key) 99 {100 key = AddSysCustomKey(key);101 return await Do(redis => redis.SortedSetLengthAsync(key));102 }103 104 #endregion 异步方法105 106 #endregion SortedSet 有序集合
key的管理
1 #region key 2 3 /// <summary> 4 /// 删除单个key 5 /// </summary> 6 /// <param name="key">redis key</param> 7 /// <returns>是否删除成功</returns> 8 public bool KeyDelete(string key) 9 {10 key = AddSysCustomKey(key);11 return Do(db => db.KeyDelete(key));12 }13 14 /// <summary>15 /// 删除多个key16 /// </summary>17 /// <param name="keys">rediskey</param>18 /// <returns>成功删除的个数</returns>19 public long KeyDelete(List<string> keys)20 {21 List<string> newKeys = keys.Select(AddSysCustomKey).ToList();22 return Do(db => db.KeyDelete(ConvertRedisKeys(newKeys)));23 }24 25 /// <summary>26 /// 判断key是否存储27 /// </summary>28 /// <param name="key">redis key</param>29 /// <returns></returns>30 public bool KeyExists(string key)31 {32 key = AddSysCustomKey(key);33 return Do(db => db.KeyExists(key));34 }35 36 /// <summary>37 /// 重新命名key38 /// </summary>39 /// <param name="key">就的redis key</param>40 /// <param name="newKey">新的redis key</param>41 /// <returns></returns>42 public bool KeyRename(string key, string newKey)43 {44 key = AddSysCustomKey(key);45 return Do(db => db.KeyRename(key, newKey));46 }47 48 /// <summary>49 /// 设置Key的时间50 /// </summary>51 /// <param name="key">redis key</param>52 /// <param name="expiry"></param>53 /// <returns></returns>54 public bool KeyExpire(string key, TimeSpan? expiry = default(TimeSpan?))55 {56 key = AddSysCustomKey(key);57 return Do(db => db.KeyExpire(key, expiry));58 }59 60 #endregion key
发布和订阅
1 #region 发布订阅 2 3 /// <summary> 4 /// Redis发布订阅 订阅 5 /// </summary> 6 /// <param name="subChannel"></param> 7 /// <param name="handler"></param> 8 public void Subscribe(string subChannel, Action<RedisChannel, RedisValue> handler = null) 9 {10 ISubscriber sub = _conn.GetSubscriber();11 sub.Subscribe(subChannel, (channel, message) =>12 {13 if (handler == null)14 {15 Console.WriteLine(subChannel + " 订阅收到消息:" + message);16 }17 else18 {19 handler(channel, message);20 }21 });22 }23 24 /// <summary>25 /// Redis发布订阅 发布26 /// </summary>27 /// <typeparam name="T"></typeparam>28 /// <param name="channel"></param>29 /// <param name="msg"></param>30 /// <returns></returns>31 public long Publish<T>(string channel, T msg)32 {33 ISubscriber sub = _conn.GetSubscriber();34 return sub.Publish(channel, ConvertJson(msg));35 }36 37 /// <summary>38 /// Redis发布订阅 取消订阅39 /// </summary>40 /// <param name="channel"></param>41 public void Unsubscribe(string channel)42 {43 ISubscriber sub = _conn.GetSubscriber();44 sub.Unsubscribe(channel);45 }46 47 /// <summary>48 /// Redis发布订阅 取消全部订阅49 /// </summary>50 public void UnsubscribeAll()51 {52 ISubscriber sub = _conn.GetSubscriber();53 sub.UnsubscribeAll();54 }55 56 #endregion 发布订阅
其他
1 #region 其他 2 3 public ITransaction CreateTransaction() 4 { 5 return GetDatabase().CreateTransaction(); 6 } 7 8 public IDatabase GetDatabase() 9 {10 return _conn.GetDatabase(DbNum);11 }12 13 public IServer GetServer(string hostAndPort)14 {15 return _conn.GetServer(hostAndPort);16 }17 18 /// <summary>19 /// 设置前缀20 /// </summary>21 /// <param name="customKey"></param>22 public void SetSysCustomKey(string customKey)23 {24 CustomKey = customKey;25 }26 27 #endregion 其他
以上就是对StackExchange.Redis基本操作的通用封装,提供给大家学习参考,如果有哪里写错的,也希望能一起交流。
问题:
StackExchange.Redis没有提供Redis分布式锁的操作么?ServiceStack.Redis 提供了AcquireLock 的方法来操作,StackExchange.Redis 源码中只找到了LockTake的方法,并没有找到其他的方法了,如果有人使用过,还希望能提供下。
最后,附上源码地址:https://github.com/qq1206676756/RedisHelp
StackExchange.Redis通用封装类分享