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

输入

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

《黄勇的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

参考资料:

  • 《php+redis+lua实现分布式锁》https://blog.csdn.net/love_yu_er/article/details/77153936
  • 《Redis的Lua脚本编程的实现和应用》https://www.jianshu.com/p/9e7b5c5c9b7b

你可能感兴趣的:(【输入输出】32周[0805-0811])