当前位置: 移动技术网 > IT编程>开发语言>c# > 在c#中使用servicestackredis操作redis的实例代码

在c#中使用servicestackredis操作redis的实例代码

2019年07月18日  | 移动技术网IT编程  | 我要评论

声明一个客户端对象:

复制代码 代码如下:

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服务端显示只有一个客户链接

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网