前两天朋友问我,有没有使用过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的方法,并没有找到其他的方法了,如果有人使用过,还希望能提供下。
最后,附上源码地址: demo
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/qtqq/p/5951201.html
dy("nrwz");
查看更多关于详解StackExchange.Redis通用封装类分享的详细内容...