private void btnSearchKey_Click(object sender, EventArgs e)
        {
            if (RedisClient == null)
            {
                DoConnection();
            }
            try
            {
                this.treeKeys.Nodes.Clear();
                System.Threading.EventWaitHandle waitHandle = new System.Threading.EventWaitHandle(false, System.Threading.EventResetMode.AutoReset);
                List <string> keys = null;
                new Task(() =>
                {
                    keys = RedisClient.SearchKeys(txtPattern.Text);
                    waitHandle.Set();
                }).Start();
                if (!waitHandle.WaitOne(RedisClient.SendTimeout))
                {
                    RedisClient.Dispose();
                    RedisClient = null;
                    throw new Exception("search keys timeout!");
                }
                NestedHash keysTree = new NestedHash();
                foreach (string key in keys)
                {
                    string[]   keySegments = key.Split(':');
                    NestedHash pHash       = keysTree;   // 指针
                    string     pKeySegment = "";         // 指针
                    for (int i = 0; i < keySegments.Length; i++)
                    {
                        string keySegment = keySegments[i];
                        if (i > 0)
                        {
                            if (pHash[pKeySegment] == null)
                            {
                                NestedHash hash = new NestedHash();
                                pHash[pKeySegment] = hash;
                                pHash = hash;
                            }
                            else
                            {
                                pHash = pHash[pKeySegment] as NestedHash;
                            }
                        }

                        if (!pHash.ContainsKey(keySegment))
                        {
                            pHash.Add(keySegment, null);
                        }

                        pKeySegment = keySegment;
                    }
                }
                BuildTree(this.treeKeys.Nodes, keysTree);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
 private void BuildTree(TreeNodeCollection treeNodes, NestedHash nestedHash)
 {
     foreach (var item in nestedHash)
     {
         TreeNode   treeNode = treeNodes.Add(item.Key);
         NestedHash hash     = item.Value as NestedHash;
         if (hash != null)
         {
             BuildTree(treeNode.Nodes, hash);
         }
     }
 }