序言
本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习。
Redis官方推荐的.NET驱动类库为Service.Stack.Redis。然而网上对这个类库的中文文档不是很全面与合理,这篇文章主要就对这个类库做注释展现。不足遗漏之处还望见谅,海涵。
.Net使用Redis是非常方便与快捷与简单的,下面就让我展示下吧。
这里有必要说一下,如果你对Redis 中的基本对象数据类型还不了解,建议你看下我的前几篇Redis文章,保证要到病除。点击:
项目中安装下载Service.Stack.Redis类库
右击项目->管理NuGet程序包->在联机中输入Reis就能出现这个类库,然后添加引入就行啦。
.Net链接Redis数据库,支持读写分离
1、配置文件
public sealed class RedisConfig : ConfigurationSection { public static RedisConfig GetConfig() { RedisConfig section = GetConfig("RedisConfig"); return section; } public static RedisConfig GetConfig(string sectionName) { RedisConfig section = (RedisConfig)ConfigurationManager.GetSection(sectionName); if (section == null) throw new ConfigurationErrorsException("Section " + sectionName + " is not found."); return section; } ////// 可写的Redis链接地址 /// [ConfigurationProperty("WriteServerConStr", IsRequired = false)] public string WriteServerConStr { get { return (string)base["WriteServerConStr"]; } set { base["WriteServerConStr"] = value; } } ////// 可读的Redis链接地址 /// [ConfigurationProperty("ReadServerConStr", IsRequired = false)] public string ReadServerConStr { get { return (string)base["ReadServerConStr"]; } set { base["ReadServerConStr"] = value; } } ////// 最大写链接数 /// [ConfigurationProperty("MaxWritePoolSize", IsRequired = false, DefaultValue = 5)] public int MaxWritePoolSize { get { int _maxWritePoolSize = (int)base["MaxWritePoolSize"]; return _maxWritePoolSize > 0 ? _maxWritePoolSize : 5; } set { base["MaxWritePoolSize"] = value; } } ////// 最大读链接数 /// [ConfigurationProperty("MaxReadPoolSize", IsRequired = false, DefaultValue = 5)] public int MaxReadPoolSize { get { int _maxReadPoolSize = (int)base["MaxReadPoolSize"]; return _maxReadPoolSize > 0 ? _maxReadPoolSize : 5; } set { base["MaxReadPoolSize"] = value; } } ////// 自动重启 /// [ConfigurationProperty("AutoStart", IsRequired = false, DefaultValue = true)] public bool AutoStart { get { return (bool)base["AutoStart"]; } set { base["AutoStart"] = value; } } ////// 本地缓存到期时间,单位:秒 /// [ConfigurationProperty("LocalCacheTime", IsRequired = false, DefaultValue = 36000)] public int LocalCacheTime { get { return (int)base["LocalCacheTime"]; } set { base["LocalCacheTime"] = value; } } ////// 是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项 /// [ConfigurationProperty("RecordeLog", IsRequired = false, DefaultValue = false)] public bool RecordeLog { get { return (bool)base["RecordeLog"]; } set { base["RecordeLog"] = value; } } }
2、配置Redis链接
public class RedisManager { ////// redis配置文件信息 /// private static RedisConfig RedisConfig = RedisConfig.GetConfig(); private static PooledRedisClientManager prcm; ////// 静态构造方法,初始化链接池管理对象 /// static RedisManager() { CreateManager(); } ////// 创建链接池管理对象 /// private static void CreateManager() { string[] WriteServerConStr = SplitString(RedisConfig.WriteServerConStr, ","); string[] ReadServerConStr = SplitString(RedisConfig.ReadServerConStr, ","); prcm = new PooledRedisClientManager(ReadServerConStr, WriteServerConStr, new RedisClientManagerConfig { MaxWritePoolSize = RedisConfig.MaxWritePoolSize, MaxReadPoolSize = RedisConfig.MaxReadPoolSize, AutoStart = RedisConfig.AutoStart, }); } private static string[] SplitString(string strSource, string split) { return strSource.Split(split.ToArray()); } ////// 客户端缓存操作对象 /// public static IRedisClient GetClient() { if (prcm == null) CreateManager(); return prcm.GetClient(); } }
3、IRedisClient为操作Redis的接口,是.Net操作Redis的主要类库,这里我们把它接入
////// RedisBase类,是redis操作的基类,继承自IDisposable接口,主要用于释放内存 /// public abstract class RedisBase : IDisposable { public static IRedisClient Core { get; private set; } private bool _disposed = false; static RedisBase() { Core = RedisManager.GetClient(); } protected virtual void Dispose(bool disposing) { if (!this._disposed) { if (disposing) { Core.Dispose(); Core = null; } } this._disposed = true; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } ////// 保存数据DB文件到硬盘 /// public void Save() { Core.Save(); } ////// 异步保存数据DB文件到硬盘 /// public void SaveAsync() { Core.SaveAsync(); } }
.Net操作Redis数据类型String
public class DoRedisString : DoRedisBase { #region 赋值 ////// 设置key的value /// public bool Set(string key, string value) { return RedisBase.Core.Set(key, value); } /// /// 设置key的value并设置过期时间 /// public bool Set(string key, string value, DateTime dt) { return RedisBase.Core.Set(key, value, dt); } /// /// 设置key的value并设置过期时间 /// public bool Set(string key, string value, TimeSpan sp) { return RedisBase.Core.Set(key, value, sp); } /// /// 设置多个key/value /// public void Set(Dictionarydic) { RedisBase.Core.SetAll(dic); } #endregion #region 追加 /// /// 在原有key的value值之后追加value /// public long Append(string key, string value) { return RedisBase.Core.AppendToValue(key, value); } #endregion #region 获取值 ////// 获取key的value值 /// public string Get(string key) { return RedisBase.Core.GetValue(key); } ////// 获取多个key的value值 /// public ListGet(List keys) { return RedisBase.Core.GetValues(keys); } /// /// 获取多个key的value值 /// public ListGet (List keys) { return RedisBase.Core.GetValues (keys); } #endregion #region 获取旧值赋上新值 /// /// 获取旧值赋上新值 /// public string GetAndSetValue(string key, string value) { return RedisBase.Core.GetAndSetValue(key, value); } #endregion #region 辅助方法 ////// 获取值的长度 /// public long GetCount(string key) { return RedisBase.Core.GetStringCount(key); } ////// 自增1,返回自增后的值 /// public long Incr(string key) { return RedisBase.Core.IncrementValue(key); } ////// 自增count,返回自增后的值 /// public double IncrBy(string key, double count) { return RedisBase.Core.IncrementValueBy(key, count); } ////// 自减1,返回自减后的值 /// public long Decr(string key) { return RedisBase.Core.DecrementValue(key); } ////// 自减count ,返回自减后的值 /// /// /// ///public long DecrBy(string key, int count) { return RedisBase.Core.DecrementValueBy(key, count); } #endregion }
.Net操作Redis数据类型List
public class DoRedisList:DoRedisBase { #region 赋值 ////// 从左侧向list中添加值 /// public void LPush(string key,string value) { RedisBase.Core.PushItemToList(key,value); } ////// 从左侧向list中添加值,并设置过期时间 /// public void LPush(string key, string value,DateTime dt) { RedisBase.Core.PushItemToList(key, value); RedisBase.Core.ExpireEntryAt(key,dt); } ////// 从左侧向list中添加值,设置过期时间 /// public void LPush(string key, string value, TimeSpan sp) { RedisBase.Core.PushItemToList(key, value); RedisBase.Core.ExpireEntryIn(key, sp); } ////// 从左侧向list中添加值 /// public void RPush(string key, string value) { RedisBase.Core.PrependItemToList(key,value); } ////// 从右侧向list中添加值,并设置过期时间 /// public void RPush(string key, string value, DateTime dt) { RedisBase.Core.PrependItemToList(key, value); RedisBase.Core.ExpireEntryAt(key, dt); } ////// 从右侧向list中添加值,并设置过期时间 /// public void RPush(string key, string value, TimeSpan sp) { RedisBase.Core.PrependItemToList(key, value); RedisBase.Core.ExpireEntryIn(key, sp); } ////// 添加key/value /// public void Add(string key, string value) { RedisBase.Core.AddItemToList(key,value); } ////// 添加key/value ,并设置过期时间 /// public void Add(string key, string value,DateTime dt) { RedisBase.Core.AddItemToList(key, value); RedisBase.Core.ExpireEntryAt(key,dt); } ////// 添加key/value。并添加过期时间 /// public void Add(string key, string value,TimeSpan sp) { RedisBase.Core.AddItemToList(key, value); RedisBase.Core.ExpireEntryIn(key,sp); } ////// 为key添加多个值 /// public void Add(string key, Listvalues) { RedisBase.Core.AddRangeToList(key,values); } /// /// 为key添加多个值,并设置过期时间 /// public void Add(string key, Listvalues,DateTime dt) { RedisBase.Core.AddRangeToList(key, values); RedisBase.Core.ExpireEntryAt(key,dt); } /// /// 为key添加多个值,并设置过期时间 /// public void Add(string key, Listvalues,TimeSpan sp) { RedisBase.Core.AddRangeToList(key, values); RedisBase.Core.ExpireEntryIn(key,sp); } #endregion #region 获取值 /// /// 获取list中key包含的数据数量 /// public long Count(string key) { return RedisBase.Core.GetListCount(key); } ////// 获取key包含的所有数据集合 /// public ListGet(string key) { return RedisBase.Core.GetAllItemsFromList(key); } /// /// 获取key中下标为star到end的值集合 /// public ListGet(string key,int star,int end) { return RedisBase.Core.GetRangeFromList(key,star,end); } #endregion #region 阻塞命令 /// /// 阻塞命令:从list中keys的尾部移除一个值,并返回移除的值,阻塞时间为sp /// public string BlockingPopItemFromList(string key,TimeSpan? sp) { return RedisBase.Core.BlockingDequeueItemFromList(key,sp); } ////// 阻塞命令:从list中keys的尾部移除一个值,并返回移除的值,阻塞时间为sp /// public ItemRef BlockingPopItemFromLists(string[] keys, TimeSpan? sp) { return RedisBase.Core.BlockingPopItemFromLists(keys, sp); } ////// 阻塞命令:从list中keys的尾部移除一个值,并返回移除的值,阻塞时间为sp /// public string BlockingDequeueItemFromList(string key, TimeSpan? sp) { return RedisBase.Core.BlockingDequeueItemFromList(key, sp); } ////// 阻塞命令:从list中keys的尾部移除一个值,并返回移除的值,阻塞时间为sp /// public ItemRef BlockingDequeueItemFromLists(string[] keys, TimeSpan? sp) { return RedisBase.Core.BlockingDequeueItemFromLists(keys, sp); } ////// 阻塞命令:从list中key的头部移除一个值,并返回移除的值,阻塞时间为sp /// public string BlockingRemoveStartFromList(string keys, TimeSpan? sp) { return RedisBase.Core.BlockingRemoveStartFromList(keys, sp); } ////// 阻塞命令:从list中key的头部移除一个值,并返回移除的值,阻塞时间为sp /// public ItemRef BlockingRemoveStartFromLists(string[] keys, TimeSpan? sp) { return RedisBase.Core.BlockingRemoveStartFromLists(keys, sp); } ////// 阻塞命令:从list中一个fromkey的尾部移除一个值,添加到另外一个tokey的头部,并返回移除的值,阻塞时间为sp /// public string BlockingPopAndPushItemBetweenLists(string fromkey, string tokey, TimeSpan? sp) { return RedisBase.Core.BlockingPopAndPushItemBetweenLists(fromkey, tokey, sp); } #endregion #region 删除 ////// 从尾部移除数据,返回移除的数据 /// public string PopItemFromList(string key) { return RedisBase.Core.PopItemFromList(key); } ////// 移除list中,key/value,与参数相同的值,并返回移除的数量 /// public long RemoveItemFromList(string key,string value) { return RedisBase.Core.RemoveItemFromList(key,value); } ////// 从list的尾部移除一个数据,返回移除的数据 /// public string RemoveEndFromList(string key) { return RedisBase.Core.RemoveEndFromList(key); } ////// 从list的头部移除一个数据,返回移除的值 /// public string RemoveStartFromList(string key) { return RedisBase.Core.RemoveStartFromList(key); } #endregion #region 其它 ////// 从一个list的尾部移除一个数据,添加到另外一个list的头部,并返回移动的值 /// public string PopAndPushItemBetweenLists(string fromKey, string toKey) { return RedisBase.Core.PopAndPushItemBetweenLists(fromKey,toKey); } #endregion }
展现List的阻塞功能,类似一个简单的消息队列功能
static void Main(string[] args) { string key = "zlh"; //清空数据库 DoRedisBase.Core.FlushAll(); //给list赋值 DoRedisBase.Core.PushItemToList(key, "1"); DoRedisBase.Core.PushItemToList(key, "2"); DoRedisBase.Core.AddItemToList(key, "3"); DoRedisBase.Core.PrependItemToList(key, "0"); DoRedisBase.Core.AddRangeToList(key, new List() { "4", "5", "6" }); #region 阻塞 //启用一个线程来处理阻塞的数据集合 new Thread(new ThreadStart(RunBlock)).Start(); #endregion Console.ReadKey(); } public static void RunBlock() { while (true) { //如果key为zlh的list集合中有数据,则读出,如果没有则等待2个小时,2个小时中只要有数据进入这里就可以给打印出来,类似一个简易的消息队列功能。 Console.WriteLine(DoRedisBase.Core.BlockingPopItemFromList("zlh", TimeSpan.FromHours(2))); } }
.Net操作Redis数据类型Set
public class DoRedisSet:DoRedisBase { #region 添加 ////// key集合中添加value值 /// public void Add(string key, string value) { RedisBase.Core.AddItemToSet(key,value); } ////// key集合中添加list集合 /// public void Add(string key, Listlist) { RedisBase.Core.AddRangeToSet(key, list); } #endregion #region 获取 /// /// 随机获取key集合中的一个值 /// public string GetRandomItemFromSet(string key) { return RedisBase.Core.GetRandomItemFromSet(key); } ////// 获取key集合值的数量 /// public long GetCount(string key) { return RedisBase.Core.GetSetCount(key); } ////// 获取所有key集合的值 /// public HashSetGetAllItemsFromSet(string key) { return RedisBase.Core.GetAllItemsFromSet(key); } #endregion #region 删除 /// /// 随机删除key集合中的一个值 /// public string PopItemFromSet(string key) { return RedisBase.Core.PopItemFromSet(key); } ////// 删除key集合中的value /// public void RemoveItemFromSet(string key, string value) { RedisBase.Core.RemoveItemFromSet(key,value); } #endregion #region 其它 ////// 从fromkey集合中移除值为value的值,并把value添加到tokey集合中 /// public void MoveBetweenSets(string fromkey,string tokey,string value) { RedisBase.Core.MoveBetweenSets(fromkey,tokey,value); } ////// 返回keys多个集合中的并集,返还hashset /// public HashSetGetUnionFromSets(string[] keys) { return RedisBase.Core.GetUnionFromSets(keys); } /// /// keys多个集合中的并集,放入newkey集合中 /// public void StoreUnionFromSets(string newkey, string[] keys) { RedisBase.Core.StoreUnionFromSets(newkey,keys); } ////// 把fromkey集合中的数据与keys集合中的数据对比,fromkey集合中不存在keys集合中,则把这些不存在的数据放入newkey集合中 /// public void StoreDifferencesFromSet(string newkey, string fromkey, string[] keys) { RedisBase.Core.StoreDifferencesFromSet(newkey,fromkey,keys); } #endregion }
.Net操作Redis数据类型有序集合Zset
public class DoRedisZSet : DoRedisBase { #region 添加 ////// 添加key/value,默认分数是从1.多*10的9次方以此递增的,自带自增效果 /// public bool AddItemToSortedSet(string key, string value) { return RedisBase.Core.AddItemToSortedSet(key, value); } ////// 添加key/value,并设置value的分数 /// public bool AddItemToSortedSet(string key, string value, double score) { return RedisBase.Core.AddItemToSortedSet(key, value, score); } ////// 为key添加values集合,values集合中每个value的分数设置为score /// public bool AddRangeToSortedSet(string key,Listvalues,double score) { return RedisBase.Core.AddRangeToSortedSet(key, values, score); } /// /// 为key添加values集合,values集合中每个value的分数设置为score /// public bool AddRangeToSortedSet(string key, Listvalues, long score) { return RedisBase.Core.AddRangeToSortedSet(key, values, score); } #endregion #region 获取 /// /// 获取key的所有集合 /// public ListGetAllItemsFromSortedSet(string key) { return RedisBase.Core.GetAllItemsFromSortedSet(key); } /// /// 获取key的所有集合,倒叙输出 /// public ListGetAllItemsFromSortedSetDesc(string key) { return RedisBase.Core.GetAllItemsFromSortedSetDesc(key); } /// /// 获取可以的说有集合,带分数 /// public IDictionaryGetAllWithScoresFromSortedSet(string key) { return RedisBase.Core.GetAllWithScoresFromSortedSet(key); } /// /// 获取key为value的下标值 /// public long GetItemIndexInSortedSet(string key, string value) { return RedisBase.Core.GetItemIndexInSortedSet(key, value); } ////// 倒叙排列获取key为value的下标值 /// public long GetItemIndexInSortedSetDesc(string key, string value) { return RedisBase.Core.GetItemIndexInSortedSetDesc(key, value); } ////// 获取key为value的分数 /// public double GetItemScoreInSortedSet(string key,string value) { return RedisBase.Core.GetItemScoreInSortedSet(key,value); } ////// 获取key所有集合的数据总数 /// public long GetSortedSetCount(string key) { return RedisBase.Core.GetSortedSetCount(key); } ////// key集合数据从分数为fromscore到分数为toscore的数据总数 /// public long GetSortedSetCount(string key,double fromScore,double toScore) { return RedisBase.Core.GetSortedSetCount(key,fromScore,toScore); } ////// 获取key集合从高分到低分排序数据,分数从fromscore到分数为toscore的数据 /// public ListGetRangeFromSortedSetByHighestScore(string key, double fromscore, double toscore) { return RedisBase.Core.GetRangeFromSortedSetByHighestScore(key, fromscore, toscore); } /// /// 获取key集合从低分到高分排序数据,分数从fromscore到分数为toscore的数据 /// public ListGetRangeFromSortedSetByLowestScore(string key, double fromscore, double toscore) { return RedisBase.Core.GetRangeFromSortedSetByLowestScore(key, fromscore, toscore); } /// /// 获取key集合从高分到低分排序数据,分数从fromscore到分数为toscore的数据,带分数 /// public IDictionaryGetRangeWithScoresFromSortedSetByHighestScore(string key, double fromscore, double toscore) { return RedisBase.Core.GetRangeWithScoresFromSortedSetByHighestScore(key, fromscore, toscore); } /// /// 获取key集合从低分到高分排序数据,分数从fromscore到分数为toscore的数据,带分数 /// public IDictionaryGetRangeWithScoresFromSortedSetByLowestScore(string key, double fromscore, double toscore) { return RedisBase.Core.GetRangeWithScoresFromSortedSetByLowestScore(key, fromscore, toscore); } /// /// 获取key集合数据,下标从fromRank到分数为toRank的数据 /// public ListGetRangeFromSortedSet(string key, int fromRank, int toRank) { return RedisBase.Core.GetRangeFromSortedSet(key, fromRank, toRank); } /// /// 获取key集合倒叙排列数据,下标从fromRank到分数为toRank的数据 /// public ListGetRangeFromSortedSetDesc(string key, int fromRank, int toRank) { return RedisBase.Core.GetRangeFromSortedSetDesc(key, fromRank, toRank); } /// /// 获取key集合数据,下标从fromRank到分数为toRank的数据,带分数 /// public IDictionaryGetRangeWithScoresFromSortedSet(string key, int fromRank, int toRank) { return RedisBase.Core.GetRangeWithScoresFromSortedSet(key, fromRank, toRank); } /// /// 获取key集合倒叙排列数据,下标从fromRank到分数为toRank的数据,带分数 /// public IDictionaryGetRangeWithScoresFromSortedSetDesc(string key, int fromRank, int toRank) { return RedisBase.Core.GetRangeWithScoresFromSortedSetDesc(key, fromRank, toRank); } #endregion #region 删除 /// /// 删除key为value的数据 /// public bool RemoveItemFromSortedSet(string key,string value) { return RedisBase.Core.RemoveItemFromSortedSet(key, value); } ////// 删除下标从minRank到maxRank的key集合数据 /// public long RemoveRangeFromSortedSet(string key,int minRank,int maxRank) { return RedisBase.Core.RemoveRangeFromSortedSet(key,minRank,maxRank); } ////// 删除分数从fromscore到toscore的key集合数据 /// public long RemoveRangeFromSortedSetByScore(string key, double fromscore, double toscore) { return RedisBase.Core.RemoveRangeFromSortedSetByScore(key, fromscore, toscore); } ////// 删除key集合中分数最大的数据 /// public string PopItemWithHighestScoreFromSortedSet(string key) { return RedisBase.Core.PopItemWithHighestScoreFromSortedSet(key); } ////// 删除key集合中分数最小的数据 /// public string PopItemWithLowestScoreFromSortedSet(string key) { return RedisBase.Core.PopItemWithLowestScoreFromSortedSet(key); } #endregion #region 其它 ////// 判断key集合中是否存在value数据 /// public bool SortedSetContainsItem(string key, string value) { return RedisBase.Core.SortedSetContainsItem(key,value); } ////// 为key集合值为value的数据,分数加scoreby,返回相加后的分数 /// public double IncrementItemInSortedSet(string key,string value,double scoreBy) { return RedisBase.Core.IncrementItemInSortedSet(key,value,scoreBy); } ////// 获取keys多个集合的交集,并把交集添加的newkey集合中,返回交集数据的总数 /// public long StoreIntersectFromSortedSets(string newkey, string[] keys) { return RedisBase.Core.StoreIntersectFromSortedSets(newkey,keys); } ////// 获取keys多个集合的并集,并把并集数据添加到newkey集合中,返回并集数据的总数 /// public long StoreUnionFromSortedSets(string newkey, string[] keys) { return RedisBase.Core.StoreUnionFromSortedSets(newkey, keys); } #endregion }
.Net操作Redis数据类型哈希Hash
public class DoRedisHash :DoRedisBase { #region 添加 ////// 向hashid集合中添加key/value /// public bool SetEntryInHash(string hashid, string key, string value) { return RedisBase.Core.SetEntryInHash(hashid,key,value); } ////// 如果hashid集合中存在key/value则不添加返回false,如果不存在在添加key/value,返回true /// public bool SetEntryInHashIfNotExists(string hashid, string key, string value) { return RedisBase.Core.SetEntryInHashIfNotExists(hashid, key, value); } ////// 存储对象T t到hash集合中 /// public void StoreAsHash(T t) { RedisBase.Core.StoreAsHash (t); } #endregion #region 获取 /// /// 获取对象T中ID为id的数据。 /// public T GetFromHash(object id) { return RedisBase.Core.GetFromHash (id); } /// /// 获取所有hashid数据集的key/value数据集合 /// public DictionaryGetAllEntriesFromHash(string hashid) { return RedisBase.Core.GetAllEntriesFromHash(hashid); } /// /// 获取hashid数据集中的数据总数 /// public long GetHashCount(string hashid) { return RedisBase.Core.GetHashCount(hashid); } ////// 获取hashid数据集中所有key的集合 /// public ListGetHashKeys(string hashid) { return RedisBase.Core.GetHashKeys(hashid); } /// /// 获取hashid数据集中的所有value集合 /// public ListGetHashValues(string hashid) { return RedisBase.Core.GetHashValues(hashid); } /// /// 获取hashid数据集中,key的value数据 /// public string GetValueFromHash(string hashid, string key) { return RedisBase.Core.GetValueFromHash(hashid, key); } ////// 获取hashid数据集中,多个keys的value集合 /// public ListGetValuesFromHash(string hashid, string[] keys) { return RedisBase.Core.GetValuesFromHash(hashid, keys); } #endregion #region 删除 #endregion /// /// 删除hashid数据集中的key数据 /// public bool RemoveEntryFromHash(string hashid, string key) { return RedisBase.Core.RemoveEntryFromHash(hashid, key); } #region 其它 ////// 判断hashid数据集中是否存在key的数据 /// public bool HashContainsEntry(string hashid, string key) { return RedisBase.Core.HashContainsEntry(hashid,key); } ////// 给hashid数据集key的value加countby,返回相加后的数据 /// public double IncrementValueInHash(string hashid, string key, double countBy) { return RedisBase.Core.IncrementValueInHash(hashid, key, countBy); } #endregion }
.Net操作Redis中的事务与锁
static void Main(string[] args) { //清空数据库 DoRedisBase.Core.FlushAll(); //声明事务 using (var tran = RedisManager.GetClient().CreateTransaction()) { try { tran.QueueCommand(p => { //操作redis数据命令 DoRedisBase.Core.Set ("name", 30); long i = DoRedisBase.Core.IncrementValueBy("name", 1); }); //提交事务 tran.Commit(); } catch { //回滚事务 tran.Rollback(); } ////操作redis数据命令 //RedisManager.GetClient().Set ("zlh", 30); ////声明锁,网页程序可获得锁效果 //using (RedisManager.GetClient().AcquireLock("zlh")) //{ // RedisManager.GetClient().Set ("zlh", 31); // Thread.Sleep(10000); //} } Console.ReadKey(); }
小结
此文是作为我自己的ServiceStack.Redis文档观看,如果你有什么疑问,或者想一起交流学习,欢迎加入左上角的群。