您好,欢迎访问一九零五行业门户网

详解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 的封装,connectionmultiplexer对象是stackexchange.redis最中枢的对象。这个类的实例需要被整个应用程序域共享和重用的,所以不需要在每个操作中不停的创建该对象的实例,一般都是使用单例来创建和存放这个对象,这个在官网上也有说明。
/// <summary> /// connectionmultiplexer对象管理帮助类 /// </summary> 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<string, connectionmultiplexer> connectioncache = new concurrentdictionary<string, connectionmultiplexer>(); /// <summary> /// 单例获取 /// </summary> public static connectionmultiplexer instance { get { if (_instance == null) { lock (locker) { if (_instance == null || !_instance.isconnected) { _instance = getmanager(); } } } return _instance; } } /// <summary> /// 缓存获取 /// </summary> /// <param name="connectionstring"></param> /// <returns></returns> 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 事件 /// <summary> /// 配置更改时 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void muxerconfigurationchanged(object sender, endpointeventargs e) { console.writeline("configuration changed: " + e.endpoint); } /// <summary> /// 发生错误时 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void muxererrormessage(object sender, rediserroreventargs e) { console.writeline("errormessage: " + e.message); } /// <summary> /// 重新建立连接之前的错误 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void muxerconnectionrestored(object sender, connectionfailedeventargs e) { console.writeline("connectionrestored: " + e.endpoint); } /// <summary> /// 连接失败 , 如果重新连接成功你将不会收到这个通知 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void muxerconnectionfailed(object sender, connectionfailedeventargs e) { console.writeline("重新连接:endpoint failed: " + e.endpoint + ", " + e.failuretype + (e.exception == null ? "" : (", " + e.exception.message))); } /// <summary> /// 更改集群 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void muxerhashslotmoved(object sender, hashslotmovedeventargs e) { console.writeline("hashslotmoved:newendpoint" + e.newendpoint + ", oldendpoint" + e.oldendpoint); } /// <summary> /// redis类库错误 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> 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<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(); } #endregion 辅助方法 #endregion 构造函数 }
其中customkey用来表示系统前缀,addsyscustomkey方法对每个key都进行前缀的添加处理,这里推荐大家在命名redis的key的时候最好的加上前缀,并且使用 :来分割前缀 ,这里在使用可视化工具查看的时候就比较好区分,比如我的的前缀是 demo:test:(一般是 系统名:业务名:),然后你查看的时候你会发现整齐,好区分了很多
string类型的封装
#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
这里说一下,stackexchange.redis 中对对象的存储是不自带序列化和反序列化的方法,所以在convertjson和convertobj里面我是使用了jsonconvert来操作,如果需要换成其他的序列化和序列化,直接修改这两个方面就好了,另外,stackexchange.redis 相对于servicestack.redis 来说提供了异步的方法,所以这里也同样封装了异步和同步的方法。
list类型的封装
#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
hash类型的封装
#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); }); } /// <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); }); } /// <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
sortedset 类型的封装
#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 有序集合
key的管理
#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 idatabase getdatabase() { 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 其他
以上就是对stackexchange.redis基本操作的通用封装,提供给大家学习参考,如果有哪里写错的,也希望能一起交流。
问题:
stackexchange.redis没有提供redis分布式锁的操作么?servicestack.redis 提供了acquirelock 的方法来操作,stackexchange.redis 源码中只找到了locktake的方法,并没有找到其他的方法了,如果有人使用过,还希望能提供下。
更多详解stackexchange.redis通用封装类分享。
其它类似信息

推荐信息