在c#中使用servicestackredis操作redis的实例代码
程序员文章站
2023-12-10 23:56:52
声明一个客户端对象:
复制代码 代码如下:
protected redisclient redis = new redisclient("127.0.0...
声明一个客户端对象:
复制代码 代码如下:
protected redisclient redis = new redisclient("127.0.0.1", 6379);//redis服务ip和端口
一 .基本key/value键值对操作:
1. 添加/获取:
list<string> storemembers = new list<string>(); storemembers.foreach(x => redis.additemtolist("test", x)); //注:也可直接使用addrangetolist方法将一组数据装入如: redis.addrangetolist("testt", storemembers);
2. 获取数据
var members = redis.getallitemsfromlist("test"); members.foreach(s => response.write("<br/>test :" + s));
3. 获取指定索引位置数据
var item = redis.getitemfromlist("test", 2);
4. 移除:
var list = redis.lists["test"]; list.clear();//清空 list.remove("two");//移除指定键值 list.removeat(2);//移除指定索引位置数据
二.存储对象:
[serializable] public class userinfo { public long id { set; get; } public string username { get; set; } public int age { get; set; } }
1.通常方式(底层使用json序列化):
redis.set<userinfo>("userinfo", new userinfo() { username = "李四", age = 45 }); userinfo userinfo = redis.get<userinfo>("userinfo");
注:当然上面方式也适合于基本类型,如:
redis.set<int>("my_age", 12);//或redis.set("my_age", 12); int age = redis.get<int>("my_age");
2.object序列化方式存储:
var ser = new objectserializer(); //位于namespace servicestack.redis.support; bool result = redis.set<byte[]>("userinfo", ser.serialize(new userinfo() { username = "张三", age = 12 })); userinfo userinfo = ser.deserialize(redis.get<byte[]>("userinfo")) as userinfo; //也支持列表 list<userinfo> userinfolist = new list<userinfo>(); userinfolist.add(new userinfo() { username = "pool_daizhj", age = 1 }); userinfolist.add(new userinfo() { username = "pool_daizhj1", age = 2 }); redis.set<byte[]>("userinfolist_serialize", ser.serialize(userinfolist)); list<userinfo> userlist = ser.deserialize(redis.get<byte[]>("userinfolist_serialize")) as list<userinfo>;
需要说明的是在测试过程中发现json序列化的效率要比object序列化高一些。
三.存储表格对象,比如:
using (var redisusers = redis.as<userinfo>()) { redisusers.store(new userinfo { id = redisusers.getnextsequence(), username = "test1", age = 22 }); redisusers.store(new userinfo { id = redisusers.getnextsequence(), username = "test2", age = 23 }); var allusers = redisusers.getall();//就像操作ado对象一样,可以进行crud等操作 }
四.使用客户端链接池模式提升链接速度:
public static pooledredisclientmanager createmanager(string[] readwritehosts, string[] readonlyhosts) { //支持读写分离,均衡负载 return new pooledredisclientmanager(readwritehosts, readonlyhosts, new redisclientmanagerconfig { maxwritepoolsize = 5,//“写”链接池链接数 maxreadpoolsize = 5,//“读”链接池链接数 autostart = true, }); }
声明链接池对象(这里只使用一个redis服务端):
pooledredisclientmanager prcm = createmanager(new string[] { "127.0.0.1:6379" }, new string[] { "127.0.0.1:6379" }); list<userinfo> userinfolist = new list<userinfo>(); userinfolist.add(new userinfo() { username = "pool_daizhj", age = 1 }); userinfolist.add(new userinfo() { username = "pool_daizhj1", age = 2 });
从池中获取一个链接:
using (iredisclient redis = prcm.getclient()) { redis.set("userinfolist", userinfolist); list<userinfo> userlist = redis.get<list<userinfo>>("userinfolist"); }
注:
如只想使用长链接而不是链接池的话,可以直接将下面对象用static方式声明即可:
protected static redisclient redis = new redisclient("127.0.0.1", 6379);
这样在redis服务端显示只有一个客户链接
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。