整數回覆 整數回覆就是一個以 ":" 開頭, CRLF 結尾的字元串表示的整數。 比如說, ":0\r\n" 和 ":1000\r\n" 都是整數回覆。 返回整數回覆的其中兩個命令是 INCR 和 LASTSAVE 。 被返回的整數沒有什麼特殊的含義, INCR 返回鍵的一個自增後的整數值, 而 L ...
整數回覆
整數回覆就是一個以 ":" 開頭, 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整數操作都可以參照上面的代碼進行實現。