自己动手写Redis客户端(C#实现)4_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 自己动手写Redis客户端(C#实现)4

自己动手写Redis客户端(C#实现)4

 2017/12/1 3:04:43  整数回复  程序员俱乐部  我要评论(0)
  • 摘要:整数回复整数回复就是一个以":"开头,CRLF结尾的字符串表示的整数。比如说,":0\r\n"和":1000\r\n"都是整数回复。返回整数回复的其中两个命令是INCR和LASTSAVE。被返回的整数没有什么特殊的含义,INCR返回键的一个自增后的整数值,而LASTSAVE则返回一个UNIX时间戳,返回值的唯一限制是这些数必须能够用64位有符号整数表示。整数回复也被广泛地用于表示逻辑真和逻辑假:比如EXISTS和SISMEMBER都用返回值1表示真,0表示假。其他一些命令,比如SADD
  • 标签:C# 实现 自己 客户 客户端

整数回复

 

整数回复就是一个以 ":" 开头, CRLF 结尾的字符串表示的整数。

比如说, ":0\r\n" 和 ":1000\r\n" 都是整数回复。

返回整数回复的其中两个命令是 INCR 和 LASTSAVE 。 被返回的整数没有什么特殊的含义, INCR 返回键的一个自增后的整数值, 而 LASTSAVE 则返回一个 UNIX 时间戳, 返回值的唯一限制是这些数必须能够用 64 位有符号整数表示。

整数回复也被广泛地用于表示逻辑真和逻辑假: 比如 EXISTS 和 SISMEMBER 都用返回值 1 表示真, 0 表示假。 其他一些命令, 比如 SADD 、 SREM 和 SETNX , 只在操作真正被执行了的时候, 才返回 1 , 否则返回 0 。 以下命令都返回整数回复: SETNX 、 DEL 、 EXISTS 、 INCR 、 INCRBY 、 DECR 、 DECRBY 、 DBSIZE 、 LASTSAVE 、 RENAMENX 、 MOVE 、 LLEN 、 SADD 、 SREM 、 SISMEMBER 、 SCARD 。

 

整数回复的代码实现:

/// <summary>
/// 整数回复
/// </summary>
/// <param name="client"></param>
/// <returns></returns>
public static Int64 ReplyLong(Socket client) {
    BufferedStream s = new BufferedStream(new NetworkStream(client));
    int b = s.ReadByte(); // 读取第一个字节 
    string result;
    switch (b)
    {
        // 整数回复(integer reply)的第一个字节是 ":"
        case ':': 
            return long.Parse(ReadLine(s));
        // 错误回复(error reply)的第一个字节是 "-"
        case '-':
            result = ReadLine(s);
            throw new Exception(result);  // 抛出异常 
               
        default:
            break;
    }
    return 0;
}

 

因此INCR操作的代码实现:

/// <summary>
/// +1操作
/// </summary>
/// <param name="client"></param>
/// <param name="key"></param>
/// <returns></returns>
public static Int64 INCR(this Socket client, string key) {
    SendCmd(client, "INCR", Encoding.UTF8.GetBytes(key));
    return ReplyLong(client);
}

因此LASTSAVE操作的代码实现:

/// <summary>
/// LastSave
/// </summary>
/// <param name="client"></param>
/// <param name="key"></param>
/// <returns></returns>
public static DateTime LASTSAVE(this Socket client) {
    SendCmd(client, "LASTSAVE");
    long l =  ReplyLong(client);
    System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
    return startTime.AddSeconds(l);
}

因此EXISTS操作的代码实现:

public static bool EXISTS(this Socket client, string key) {
    SendCmd(client, "EXISTS", Encoding.UTF8.GetBytes(key));
    return ReplyLong(client) == 0;
}

因此SISMEMBER操作的代码实现:

/// <summary>
/// 判断 member 元素是否集合 key 的成员
/// </summary>
/// <returns></returns>
public static bool SISMEMBER(this Socket client, string key, string member) {
    SendCmd(client, "SISMEMBER", Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(member));
    return ReplyLong(client) == 0;
}

其他  SETNX 、 DEL 、 EXISTS 、 INCR 、 INCRBY 、 DECR 、 DECRBY 、 DBSIZE 、 LASTSAVE 、 RENAMENX 、 MOVE 、 LLEN 、 SADD 、 SREM 、 SISMEMBER 、 SCARD整数操作都可以参照上面的代码进行实现。

发表评论
用户名: 匿名