本身動手寫Redis客戶端(C#實現)4 - 整數回覆

整數回覆

 

整數回覆就是一個以 ":" 開頭, CRLF 結尾的字符串表示的整數。this

好比說, ":0\r\n" 和 ":1000\r\n" 都是整數回覆。 spa

返回整數回覆的其中兩個命令是 INCR 和 LASTSAVE 。 被返回的整數沒有什麼特殊的含義, INCR 返回鍵的一個自增後的整數值, 而 LASTSAVE 則返回一個 UNIX 時間戳, 返回值的惟一限制是這些數必須可以用 64 位有符號整數表示。code

整數回覆也被普遍地用於表示邏輯真和邏輯假: 好比 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 。blog

 

整數回覆的代碼實現:字符串

/// <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操做的代碼實現:string

/// <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操做的代碼實現:it

/// <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操做的代碼實現:io

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

所以SISMEMBER操做的代碼實現:ast

/// <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整數操做均可以參照上面的代碼進行實現。class

相關文章
相關標籤/搜索