本文是对ServiceStack.Redis的使用总结. ServiceStack.Redis是.NET平台下非常流行的Redis客户端,遗憾的是它在版本4之后开始收费,本文将以3.9.71版本为基础总结Redis使用操作。 完整代码参见Github-ServiceStack.Redis.Utility NuGet PackagesNuget-RedisUtility 配置客户端管理器 using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; namespace ServiceStack.Redis.Utility { public class RedisClientManager { private static PooledRedisClientManager _defaultManager; private static readonly Dictionary<string, PooledRedisClientManager> ManagerDictionary; static RedisClientManager() { _defaultManager = CreateDefaultManager(); ManagerDictionary = new Dictionary<string, PooledRedisClientManager>(); } private static string[] SplitString(string strSource, string split) { return strSource.Split(split.ToArray(), StringSplitOptions.RemoveEmptyEntries); } private static PooledRedisClientManager CreateDefaultManager() { string defaultRedisServer = ConfigurationManager.AppSettings["DefaultRedisServer"]; string defaultReadRedisServer = ConfigurationManager.AppSettings["DefaultReadRedisServer"]; string defaultWriteRedisServer = ConfigurationManager.AppSettings["DefaultWriteRedisServer"]; if (string.IsNullOrEmpty(defaultReadRedisServer)) { defaultReadRedisServer = defaultRedisServer; } if (string.IsNullOrEmpty(defaultWriteRedisServer)) { defaultWriteRedisServer = defaultRedisServer; } string[] writeServerList = SplitString(defaultWriteRedisServer, ","); string[] readServerList = SplitString(defaultReadRedisServer, ","); return new PooledRedisClientManager(readServerList, writeServerList, new RedisClientManagerConfig() { AutoStart = true, MaxWritePoolSize = 100, MaxReadPoolSize = 100 }); } /// <summary> /// 创建redis应用程序池 /// </summary> /// <param name="connectStr"></param> /// <returns></returns> private static PooledRedisClientManager CreateManager(string connectStr) { string[] arrStr = connectStr.Split(':'); string host = arrStr.Length > 0 ? arrStr[0] : ""; int port = 6379; if (arrStr.Length > 1) { int.TryParse(arrStr[1], out port); } long db = 0; if (arrStr.Length > 2) { long.TryParse(arrStr[2], out db); } RedisClientManagerConfig config = new RedisClientManagerConfig { MaxReadPoolSize = 100, MaxWritePoolSize = 100, AutoStart = true }; return new PooledRedisClientManager(new[] { host + ":" + port }, new[] { host + ":" + port }, config, db, null, null); } public static IRedisClient GetClient(string connectStr = null) { if (string.IsNullOrEmpty(connectStr)) { if (_defaultManager == null) { _defaultManager = CreateDefaultManager(); } return _defaultManager.GetClient(); } connectStr = connectStr.Trim(); var manager = ManagerDictionary[connectStr]; if (manager == null) { manager = CreateManager(connectStr); ManagerDictionary[connectStr] = manager; } return manager.GetClient(); } } } Redis操作类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using NLogUtility; using ServiceStack.Text; namespace ServiceStack.Redis.Utility { public class Redis { #region hash /// <summary> /// hashid key value的递增 /// </summary> /// <param name="hashId"></param> /// <param name="key"></param> /// <param name="incrementBy"></param> /// <param name="connectStr"></param> public static long IncreameValue(string hashId, string key, int incrementBy,string connectStr=null) { long res = 0; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { res = redisClient.IncrementValueInHash(hashId, key, incrementBy); } } catch (Exception ex) { Logger.Error(ex, "hashId:{0},key:{1},incrementBy:{2},connectStr:{3}", hashId, key, incrementBy,connectStr); } return res; } /// <summary> /// 通过hasId删除缓存 /// </summary> /// <param name="hashId"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool RemoveHashRedisValueByHashId(string hashId,string connectStr=null) { bool result = true; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { List<string> keyList = redisClient.GetHashKeys(hashId); foreach (string key in keyList) { var removed = redisClient.RemoveEntryFromHash(hashId, key); result = result && removed; } } } catch (Exception ex) { Logger.Error(ex, "hashId:{0},connectStr:{1}", hashId, connectStr); result = false; } return result; } /// <summary> /// 通过hashId和key删除缓存 /// </summary> /// <param name="hash"></param> /// <param name="key"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool RemoveHasRedisValueByHasdIdAndKey(string hash, string key, string connectStr = null) { bool result = false; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { if (redisClient.HashContainsEntry(hash, key)) { result = redisClient.RemoveEntryFromHash(hash, key); } else { result = true; } } } catch (Exception ex) { Logger.Error(ex, "hashId:{0},key:{1},connectStr:{2}", hash, key, connectStr); } return result; } /// <summary> /// 设置HashRedis /// </summary> /// <param name="hash"></param> /// <param name="key"></param> /// <param name="value"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool SetHashRedisValue(string hash, string key, string value, string connectStr = null) { bool result = false; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { result = redisClient.SetEntryInHash(hash, key, value); } } catch (Exception ex) { Logger.Error(ex, "hashId:{0},key:{1},value:{2},connectStr:{3}", hash, key, value, connectStr); } return result; } /// <summary> /// 获取HashId下的所有Keys /// </summary> /// <param name="hash"></param> /// <param name="connectStr"></param> /// <returns></returns> public static List<string> GetHashKeys(string hash, string connectStr = null) { List<string> value = null; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { value = redisClient.GetHashKeys(hash); } } catch (Exception ex) { Logger.Error(ex, "hashId:{0},connectStr:{1}", hash, connectStr); } return value ?? new List<string>(); } /// <summary> /// 获取Hashredis /// </summary> /// <param name="hash"></param> /// <param name="key"></param> /// <param name="connectStr"></param> /// <returns></returns> public static string GetHashRedisValue(string hash, string key, string connectStr = null) { string value = null; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { value = redisClient.GetValueFromHash(hash, key); } } catch (Exception ex) { Logger.Error(ex, "hashId:{0},key:{1},connectStr:{2}", hash, key, connectStr); } return value; } /// <summary> /// 判断hashid是否存在 /// </summary> /// <param name="hash"></param> /// <param name="key"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool HashContainsEntry(string hash, string key, string connectStr = null) { bool exist = false; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { exist = redisClient.HashContainsEntry(hash, key); } } catch (Exception ex) { Logger.Error(ex, "hashId:{0},key:{1},connectStr:{2}", hash, key, connectStr); } return exist; } #endregion /// <summary> /// 通过keytype删除缓存 /// </summary> /// <param name="keyType"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool RemoveRedisValueByKeyType(string keyType, string connectStr = null) { bool result = true; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { List<string> keyList = redisClient.SearchKeys(keyType + "*"); foreach (string key in keyList) { if (key.StartsWith(keyType, StringComparison.OrdinalIgnoreCase)) { var removed = redisClient.Remove(key); result = result && removed; } } } } catch (Exception ex) { result = false; Logger.Error(ex, "keyType:{0},connectStr:{1}", keyType, connectStr); } return result; } /// <summary> /// 通过key,删除redis /// </summary> /// <param name="key"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool RemoveRedisValueByKey(string key, string connectStr = null) { bool result = false; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { result = redisClient.Remove(key); } } catch (Exception ex) { Logger.Error(ex, "key:{0},connectStr:{1}", key, connectStr); } return result; } /// <summary> /// 获取redis /// </summary> /// <param name="key"></param> /// <param name="connectStr"></param> /// <returns></returns> public static string GetRedisValue(string key, string connectStr = null) { string value = null; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { value = redisClient.GetValue(key); } } catch (Exception ex) { Logger.Error(ex, "key:{0},connectStr:{1}", key, connectStr); } return value; } /// <summary> /// 获取redis /// </summary> /// <param name="key"></param> /// <param name="connectStr"></param> /// <returns></returns> public static object GetRedisObjectValue(string key, string connectStr = null) { object value = null; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { value = redisClient.Get<object>(key); } } catch (Exception ex) { Logger.Error(ex, "key:{0},connectStr:{1}", key, connectStr); } return value; } /// <summary> /// 获取redis /// </summary> /// <param name="key"></param> /// <param name="connectStr"></param> /// <returns></returns> public static T GetRedisValue<T>(string key, string connectStr = null) { T value = default(T); try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { value = redisClient.Get<T>(key); } } catch (Exception ex) { Logger.Error(ex, "key:{0},connectStr:{1}", key, connectStr); } return value; } /// <summary> /// 过期时间 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="value"></param> /// <param name="expiresAt"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool SetRedisValue<T>(string key, T value, DateTime expiresAt, string connectStr = null) { try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { return redisClient.Set(key, value, expiresAt); } } catch (Exception ex) { Logger.Error(ex, "key:{0},value:{1},connectStr:{2}", key, JsonSerializer.SerializeToString(value), connectStr); return false; } } /// <summary> /// 设置缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="value"></param> /// <param name="expiresAt"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool SetRedisValue<T>(string key, T value, TimeSpan expiresAt, string connectStr = null) { try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { return redisClient.Set(key, value, expiresAt); } } catch (Exception ex) { Logger.Error(ex, "key:{0},value:{1},connectStr:{2}", key, JsonSerializer.SerializeToString(value), connectStr); return false; } } /// <summary> /// 设置无过期时间缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="value"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool SetRedisValue<T>(string key, T value, string connectStr = null) { try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { return redisClient.Set(key, value); } } catch (Exception ex) { Logger.Error(ex, "key:{0},value:{1},connectStr:{2}", key, JsonSerializer.SerializeToString(value), connectStr); return false; } } #region list /// <summary> /// 入列 /// </summary> /// <param name="listId"></param> /// <param name="value"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool Enqueue(string listId, string value, string connectStr = null) { bool result = false; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { redisClient.EnqueueItemOnList(listId, value); result = true; } } catch (Exception ex) { Logger.Error(ex, "listId:{0},value:{1},connectStr:{2}", listId, value, connectStr); } return result; } /// <summary> /// 入列 /// </summary> /// <param name="listId"></param> /// <param name="value"></param> /// <param name="connectStr"></param> /// <returns></returns> public static bool Enqueue<T>(string listId, T value, string connectStr = null) { bool result = false; try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { redisClient.EnqueueItemOnList(listId, JsonSerializer.SerializeToString(value)); result = true; } } catch (Exception ex) { Logger.Error(ex, "listId:{0},value:{1},connectStr:{2}", listId, value, connectStr); } return result; } /// <summary> /// 出列 /// </summary> /// <param name="listId"></param> /// <param name="connectStr"></param> /// <returns></returns> public static T Dequeue<T>(string listId, string connectStr = null) { T value = default(T); try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { var item = redisClient.DequeueItemFromList(listId); if (item != null) { value = JsonSerializer.DeserializeFromString<T>(item); } } } catch (Exception ex) { Logger.Error(ex, "listId:{0},connectStr:{1}", listId, connectStr); } return value; } /// <summary> /// 队列数量 /// </summary> /// <param name="listId"></param> /// <param name="connectStr"></param> /// <returns></returns> public static long QueueCount(string listId, string connectStr = null) { try { using (var redisClient = RedisClientManager.GetClient(connectStr)) { return redisClient.GetListCount(listId); } } catch (Exception ex) { Logger.Error(ex, "listId:{0},connectStr:{1}", listId, connectStr); return 0; } } #endregion } } 简单说明 配置Redis服务器地址,在App.config或Web.config中添加配置节DefaultRedisServer 如果Redis读写服务器地址不一致,需要分别设置配置节DefaultReadRedisServer,DefaultWriteRedisServer 如果你的代码中需要连接多个Redis服务器,可以在直接调用Redis操作方法时传入相关地址,如果未传入地址信息,则使用配置节中配置的默认地址 Redis提供的功能十分强大,本文提供的Redis操作方法只是Redis操作的冰山一角,抛砖引玉,读者后续可以根据需要增加更多的Redis操作方法