• redis里通过命名空间存储缓存,根据结构生成树型


    一般为了方便管理 redis 缓存,我们通过 : 来分隔不同的 key 来进行存储缓存,这样方便查看。

    例如:

    game:upload_role:1000
    game:member_info:2000
    game:member_info:state_info:3000

    上面的这种结构在 Redis Desktop Manager 中就会显示如下:

    我们可以通过 keys 命令来获取 redis 里的所有 key。但这些 key 是没有层次的,如何生成?

    只能通过 : 分隔符来处理各 key 的上下层关系。

    代码如下:

    function relationCache($keys, &$index, &$index_tree)
    {
        $result = [];
        if ($keys) {
            foreach ($keys as $key) {
                $arr = explode(':', $key);
                $len = count($arr);
    
                for ($ix = 0; $ix < $len; $ix++) {
                    $cur_key = implode(':', array_slice($arr, 0, $ix + 1));
    
                    if (!isset($index_tree[$cur_key])) {
                        $index_tree[$cur_key] = $index++;
    
                        $pid = 0;
                        if ($ix >= 1) {
                            $pre_key = implode(':', array_slice($arr, 0, $ix));
                            $pid = $index_tree[$pre_key];
                        }
    
                        $result[] = [
                            'id' => $index_tree[$cur_key],
                            'pid' => $pid,
                            'name' => $arr[$ix],
                            'key' => $cur_key,
                        ];
                    }
                }
            }
        }
        return $result;
    }
    

    然后生成树型的函数如下:

    function genTree($items, $id = 'id', $pid = 'pid', $son = 'child')
    {
        $tree = array();
        $tmpMap = array();
    
        foreach ($items as $item) {
            $tmpMap[$item[$id]] = $item;
        }
    
        foreach ($items as $item) {
            if (isset($tmpMap[$item[$pid]])) {
                $tmpMap[$item[$pid]][$son][] = &$tmpMap[$item[$id]];
            } else {
                $tree[] = &$tmpMap[$item[$id]];
            }
        }
        unset($tmpMap);
        return $tree;
    }
    

    使用如下:

    $keys = [
        'game:upload_role:1000',
        'game:member_info:2000',
        'game:member_info:state_info:3000',
    ];
    
    //索引
    $index = 1;
    //索引树
    $index_tree = [];
    
    //注意,如果想多次调用relationCache,并共享索引,请通过外部传参的方式
    $result = relationCache($keys, $index, $index_tree);
    
    $result = genTree($result, 'id', 'pid', 'children');
    
    echo '<pre>';
    print_r($result);
    

    这样生成的结果,通过json_encode就可以使用 zTree 来显示了。

  • 相关阅读:
    Educational Codeforces Round 78 (Rated for Div. 2)
    Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
    Codeforces Round #604 (Div. 2)
    Codeforces Round #603 (Div. 2)
    Educational Codeforces Round 77 (Rated for Div. 2)
    一个逆向的问题
    cppcheck,今天下载了这个软件,准备研究学习一下了
    SQL 显错注入的基本步骤
    OD打印保存执行的汇编指令的脚本
    没事还是不要算卦得好
  • 原文地址:https://www.cnblogs.com/jkko123/p/13305750.html
Copyright © 2020-2023  润新知