zoukankan      html  css  js  c++  java
  • C# Redis实战(七)

    七、修改数据

     
    在上一篇 C# Redis实战(六)中介绍了如何查询Redis中数据,本篇将介绍如何修改Redis中相关数据。大家都知道Redis是key-value型存储系统,所以应该可以修改key,也可以根据key来修改value。接下来将是详细的C#语言修改Redis示例。
     
    1、通过key修改单个value
                    using (var redisClient = RedisManager.GetClient())
                    {
                        var user = redisClient.GetTypedClient<User>();
                        var value = user.GetValue(txtChangeKey.Text);//首先先获取当前key的值
                        var changedUser = new User
                        {
                            Id = value.Id,
                            Name = txtChangeName.Text,
                            Job = new Job { Position = txtChangePosition.Text }
                        };//设置相应的新value值,并使其它数据与原来相统一
                        redisClient.Set(txtChangeKey.Text, changedUser);//修改value
                        value = user.GetValue(txtChangeKey.Text);//根据key获取最新的数据
    
                        var htmlStr = string.Empty;
                        htmlStr += "修改后的ID=" + value.Id + "  姓名:" + value.Name + "  所在部门:" + value.Job.Position;
                        lblPeople.Text = htmlStr;
                        lblShow.Text = "筛选后共有:1人!";
    
                    }
    代码执行后效果图如下:

    以上代码让Redis修改了key为urn:user:1的人所在部门,将原先.NET修改为现在的Python,修改后全部的数据就变成了:
     
    2、通过keys修改多个values
                var dictionary = new Dictionary<string, User>();
                using (var redisClient = RedisManager.GetClient())
                {
                    var user = redisClient.GetTypedClient<User>();
                    var user1 = new User
                    {
                        Id = user.GetNextSequence(),//获取新的ID
                        Name = "小明",
                        Job = new Job { Position = "Python" }
                    };
                    var user2 = new User
                    {
                        Id = user.GetNextSequence(),
                        Name = "小红",
                        Job = new Job { Position = "Python" }
                    };
                    var userKeyList = user.GetAllKeys().Where(x => x.StartsWith("urn")).OrderBy(y => y).ToList();//只获取保存value的key
                    dictionary.Add(userKeyList[1], user1);//第二个人
                    dictionary.Add(userKeyList[2], user2);//第三个人
                    redisClient.SetAll(dictionary);//同时修改多个value
                   
                    var users = user.GetAll();
                    if (users.Count > 0)
                    {
                        var htmlStr = string.Empty;
                        foreach (var u in users)
                        {
                            htmlStr += "<li>ID=" + u.Id + "  姓名:" + u.Name + "  所在部门:" + u.Job.Position + "</li>";
                        }
                        lblPeople.Text = htmlStr;
                    }
                    lblShow.Text = "筛选后共有:" + users.Count.ToString() + "人!";
                }

    我需要在修改了第一个人所在部门的基础上同时将第二个人和第三个人所在部门、姓名、ID都一并修改,执行后效果图如下:

    3、重命名key
    以上修改value的示例我们只修改了value,但是并没有改变key值。如果需要重命名key,首先,查询Redis中所有的key

    修改key代码如下:
    using (var redisClient = RedisManager.GetClient())
                    {
                        redisClient.RenameKey(txtKey.Text, txtNewKey.Text);
                       
                        var user = redisClient.GetTypedClient<User>();
                        var userKeyList = user.GetAllKeys();
    
                        if (userKeyList.Count > 0)
                        {
                            lblPeople.Text = string.Empty;
                            var htmlStr = string.Empty;
                            foreach (var u in userKeyList)
                            {
                                htmlStr += "<li>key=" + u + "</li>";
                            }
                            lblPeople.Text = htmlStr;
                        }
                        lblShow.Text = "筛选后共有:" + userKeyList.Count.ToString() + " Keys!";
                    }
    这样是可以重命名key的,如下图:

    可以看到urn:user:1已经不存在了,取而代之的是urn:user:5,但是如果我们再次运行GetAll<User>()时,却发现只有三条数据了,如图:
          
     
    C# Redis实战(六)中我已经提到了ids:User的概念,其实在ServiceStack.Redis的Rename中并没有将重命名后的key保存在其中,这样就会导致ids:User中只有原来的三条未修改的数据,但是seq:User中仍有六条数据。
    public void Rename(string oldKeyname, string newKeyname)
            {
                if (oldKeyname == null)
                    throw new ArgumentNullException("oldKeyname");
                if (newKeyname == null)
                    throw new ArgumentNullException("newKeyname");
    
                SendExpectSuccess(Commands.Rename, oldKeyname.ToUtf8Bytes(), newKeyname.ToUtf8Bytes());
            }
    但是查询单个key依然可以得到完整的数据:
    可以这么理解,可怜的urn:user:5变成了无家可归的孩子,不管是GetAll(),或者DeleteAll()均对其不起作用。
     
    如需转载,请注明出处,http://download.csdn.net/detail/qiujialongjjj/6613377
  • 相关阅读:
    MFC 记录 CreateProcess启动外部游戏主程序
    MFC 记录 CListCtrl 学习使用
    MS SQL自定义字符串拆分函数的惨痛经历
    C#路径/文件/目录/I/O常见操作汇总
    2012年开发者该做的11件事
    取出AD中一個組的所有成員信息(C#實現功能配合EXT做的界面)
    代码注释规范
    基于工作实际需求的Ext.Net和C#搭配应用之一 取出网域(AD)中所有计算机名及位置描述等信息
    2012,我的C#全能Excel操作(无需Office,不使用XML)
    一個文件文件和路徑的類
  • 原文地址:https://www.cnblogs.com/lzjsky/p/15769932.html
Copyright © 2011-2022 走看看