• 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
  • 相关阅读:
    短url生成类
    websphere6.1部署SystemErr.log必须为元素类型“webapp”声明属性“ve
    解决websphere6.1必须为元素类型webapp声明属性version
    websphere6.1部署SystemErr.log必须为元素类型“webapp”声明属性“ve
    websphere6.1部署ear程序教程
    目测websphere6.1不支持dbcp1.4以及1.4以上版本
    maven与log4j之间的配置,log4j如何配置到web项目根目录下最简单方案
    在myeclipse中制作能部署到websphere上的java web程序教程制作ear
    【技术贴】servlet传参|前台传参含中文符号等 tomcat乱码 java后台接收乱码终极解决方
    【技术贴】servlet传参|前台传参含中文符号等 tomcat乱码 java后台接收乱码终极解决方
  • 原文地址:https://www.cnblogs.com/lzjsky/p/15769932.html
Copyright © 2020-2023  润新知