zoukankan      html  css  js  c++  java
  • 自己动手写Redis客户端(C#实现)4

    整数回复

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

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

    返回整数回复的其中两个命令是 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整数操作都可以参照上面的代码进行实现。

  • 相关阅读:
    POJ1182 食物链---(经典种类并查集)
    HDU1025---(LIS 最长上升子序列 的应用)
    HDU5748---(记录每个元素的 最长上升子序列 nlogn)
    c++ 批量初始化数组 fill和fill_n函数的应用
    JNI 方法注册与签名+BufferedReader使用readLine问题
    正确在遍历中删除List元素
    Head First Java设计模式思维导图总结
    关于一些基础的Java问题的解答(七)
    关于一些基础的Java问题的解答(六)
    关于一些基础的Java问题的解答(四)
  • 原文地址:https://www.cnblogs.com/tangruixin/p/7932378.html
Copyright © 2011-2022 走看看