posts - 404,  comments - 115,  views - 118万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

例如:

1
2
3
game:upload_role:1000
game:member_info:2000
game:member_info:state_info:3000

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

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

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

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

使用如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$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 来显示了。

posted on   怀素真  阅读(3635)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示