美文网首页
【输入输出】32周[0805-0811]

【输入输出】32周[0805-0811]

作者: 言十年 | 来源:发表于2019-08-11 20:35 被阅读0次

    输入

    其实这周没什么计划,一方面忙着写需求。空闲了。看几篇容易看的文章。

    《黄勇的OKR实战笔记》阅读了4篇,我们用OKR。但我对这玩意儿不了解,故随便看看。

    其他的不记了。

    输出

    暂无,我的算法okr,算是打脸了。

    收获

    代码

    1.php代码中,操作redis使用lua代码。

    写一条数据

    $redis->set('name_list', json_encode(['name'=>'xiaoming']));
    

    用lua读一条数据。

    $lua = <<<'LUA'
        return redis.call('get','name_list');
    LUA;
    return $redis->eval($lua);
    

    结果

    '{"name":"xiaoming"}'
    

    2.Code Review一段代码

    代码稍微处理了下

    public static function isNewUser($deviceId, $clientId):bool
    {
        $res = 0;
        if (empty($deviceId)) {
            return (bool)$res;
        }
    
        $key   = sprintf(CacheKey::IS_NEW_USER, $deviceId);
        $redis = Redis::getInstance('xxx');
        $ret   = $redis->get($key);
        if (is_string($ret) && in_array($ret, ['1', '0'])) {
            return (bool)$ret;
        }
    
        $deviceCreateTime = UserService::getDeviceCreateTime($deviceId, $clientId);
        $expireTime       = 604800;// 缓存 7天
        if (((time() - $deviceCreateTime) <= 24 * 3600) ) {
            $res = 1;
            $expireTime = ($deviceCreateTime + 86400) - time();
        }
    
        $redis->setex($key, $expireTime,  $res);
        return (bool)$res;
    }
    

    开始....

    槽点

    1. empty($deviceId) 之后,直接return false。

    2.is_string($ret) && in_array($ret, ['1', '0']),既然返回值只有'1'跟'0'。直接两个"==="判断即可。避免两次函数调用。减少开销。

    1. 24 * 3600,直接写计算后的值。

    4.time(),调用一次赋值给变量,下面就可以不用。 time()会造成系统调用(内核态到用户态)。

    5.($deviceCreateTime + 86400) - time(),相当于(86400-(time() - $deviceCreateTime)),故跟((time() - $deviceCreateTime) <= 24 * 3600)。可以复用。

    鸣谢大佬帮忙review代码,蛮有收获。

    一个优化点

    1.是否可以不用time()。因为代码经过服务执行。能否直接用服务器的时间(或者统一的入口网关时间)。

    示例代码:

    public static function requestTime()
    {
        if (!isset(self::$server['REQUEST_TIME'])) {
            self::$server['REQUEST_TIME'] = time();
        }
        return self::$server['REQUEST_TIME'];
    }
    

    一个隐藏的点

    1. UserService::getDeviceCreateTime($deviceId, $clientId); 是否需要catch?实际上,该代码里面做了catch。但异常的时候,返回的是0。问题是:如果是0,新用户被误认为老用户,那么24小时内(这台机器这辈子不能使用)就无法使用新用户能使用的功能。所以,这是一个隐藏的逻辑问题。如果异常不能够缓存。

    命令与工具

    1.MongoDB 可视化工具

    https://www.cnblogs.com/tugenhua0707/p/9250673.html

    2.文档查看 https://devdocs.io/

    3.画图工具edrawmax(我用的是OmiGraffle)

    方式方法

    本周做一个小需求,要求比较紧,故把前三天的想法与做法总结成下文。

    1.【思考】忙有忙的好处--任务分解、做事反馈、ER图https://www.jianshu.com/p/3e2067da128d

    参考资料:

    相关文章

      网友评论

          本文标题:【输入输出】32周[0805-0811]

          本文链接:https://www.haomeiwen.com/subject/nhwsjctx.html