`

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()均对其不起作用。
 
如需转载,请注明出处,本系列博文示例程序下载地址
分享到:
评论

相关推荐

    rediapp_c#redisdemo_

    标签 "c#redisdemo" 明确了这个压缩包的内容是关于C#编程语言与Redis的实战示例。 在压缩包文件名称列表中,只有一个条目 "rediapp",这可能是项目的名字或者包含源代码、配置文件的主目录。 在这个"rediapp"项目...

    Redis全套学习笔记 (带章节目录) 完整版pdf

    Redis,即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了...

    很全面的Redis教程(在java和c#中安装教程、工具类、架包、以及桌面客户端等)

    5. **Redis实战**: - **数据结构**:Redis支持多种数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets),在设计高效数据存储方案时非常有用。 - **事务与发布订阅**:...

    《Redis实战》红丸出品

    ### Redis实战知识点详解 #### 一、Key-Value存储系统简介与Redis的选择 **1.1 Key-Value存储系统简介** - **Voldemort**: 一个分布式键值存储系统,最初由LinkedIn开发,用于处理大规模数据读写操作。它强调一致...

    Redis实战 中文完整版

    ### Redis实战:中文完整版知识点总结 #### 一、Redis快速入门 ##### 1.1 Key-Value存储系统简介 **1.1.1 Voldemort** Voldemort是一款分布式键值存储系统,它支持高可用性和数据分区,适用于大规模数据存储场景...

    YXBG.Second_redis_IP缓存_c#集成redis_

    在IT行业中,Redis被广泛用作高性能的内存数据存储,常用于实现缓存、消息队列等功能。在本项目"YXBG.Second_redis_IP缓存_c#集成redis_"中,我们将...这是一个很好的实战案例,展示了Redis在实际业务中的应用价值。

    Redis 实战

    ### Redis 实战 #### Key-Value存储系统简介 在探讨Redis之前,我们首先需要了解什么是Key-Value存储系统。这类系统是一种非关系型数据库的一种形式,它通过键(Key)来存储和检索值(Value)。这种简单的设计使得...

    Redis实战《红丸出品》.pdf

    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object...

    2018年redis全套视频-讲解 实战

    ### 四、Redis实战技巧 1. **优化配置**: - 调整最大内存限制,避免因内存不足导致服务不稳定。 - 合理设置持久化策略,平衡性能与数据安全性。 - 配置合适的过期时间,自动清理不再使用的数据。 2. **命令...

    《高并发网站与分布式缓存Redis与开发实战》3.0.pdf

    根据给定的文件信息,我们可以提炼出以下知识点: 1. 高并发网站架构:高并发网站指的...通过结合理论知识与实际案例,本书旨在为开发者提供实战经验,帮助他们在构建高并发网站与分布式缓存系统时能够更加得心应手。

    redis实战相关项目代码,用python编写.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...

    Redis实战视频课程

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/...

    后端数据优化之-Redis 自带差集测试Demo.rar

    描述中的"redis c# 数据优化 差集 c#redis GetDifferencesFromSet"指出了我们将使用C#来调用Redis客户端,执行差集操作。`GetDifferencesFromSet`是一个可能的C#方法名,它代表了从Redis服务器获取两个集合差集的...

    redis windows 安装包含.net项目示例

    4. .NET C#项目实战示例: - 缓存操作:在Web应用中,可以将经常访问但计算代价高的数据缓存在Redis,例如用户会话、常用查询结果等,提高响应速度。 - 消息队列:利用Redis的List数据结构,实现简单的消息队列...

    成语接龙_Redis.7z

    标题中的“成语接龙_Redis.7z”表明这是一个与编程相关的项目,特别是使用C#语言实现的成语接龙游戏,且游戏数据存储在Redis内存数据库中。...对于学习C#编程和Redis数据库操作的开发者来说,这是一个很好的实战案例。

Global site tag (gtag.js) - Google Analytics