欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

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