注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

C# Redis实战  

2017-07-23 22:16:30|  分类: 分布式缓存 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

转自“http://blog.csdn.net/qiujialongjjj/article/details/17298767”

七、修改数据


在上一篇 C# Redis实战(六)中介绍了如何查询Redis中数据,本篇将介绍如何修改Redis中相关数据。大家都知道Redis是key-value型存储系统,所以应该可以修改key,也可以根据key来修改value。接下来将是详细的C#语言修改Redis示例。

1、通过key修改单个value
[csharp] view plain copy
  1. using (var redisClient = RedisManager.GetClient())  
  2. {  
  3.     var user = redisClient.GetTypedClient<User>();  
  4.     var value = user.GetValue(txtChangeKey.Text);//首先先获取当前key的值  
  5.     var changedUser = new User  
  6.     {  
  7.         Id = value.Id,  
  8.         Name = txtChangeName.Text,  
  9.         Job = new Job { Position = txtChangePosition.Text }  
  10.     };//设置相应的新value值,并使其它数据与原来相统一  
  11.     redisClient.Set(txtChangeKey.Text, changedUser);//修改value  
  12.     value = user.GetValue(txtChangeKey.Text);//根据key获取最新的数据  
  13.   
  14.     var htmlStr = string.Empty;  
  15.     htmlStr += "修改后的ID=" + value.Id + "  姓名:" + value.Name + "  所在部门:" + value.Job.Position;  
  16.     lblPeople.Text = htmlStr;  
  17.     lblShow.Text = "筛选后共有:1人!";  
  18.   
  19. }  

代码执行后效果图如下:

以上代码让Redis修改了key为urn:user:1的人所在部门,将原先.NET修改为现在的Python,修改后全部的数据就变成了:


2、通过keys修改多个values
[csharp] view plain copy
  1. var dictionary = new Dictionary<string, User>();  
  2. using (var redisClient = RedisManager.GetClient())  
  3. {  
  4.     var user = redisClient.GetTypedClient<User>();  
  5.     var user1 = new User  
  6.     {  
  7.         Id = user.GetNextSequence(),//获取新的ID  
  8.         Name = "小明",  
  9.         Job = new Job { Position = "Python" }  
  10.     };  
  11.     var user2 = new User  
  12.     {  
  13.         Id = user.GetNextSequence(),  
  14.         Name = "小红",  
  15.         Job = new Job { Position = "Python" }  
  16.     };  
  17.     var userKeyList = user.GetAllKeys().Where(x => x.StartsWith("urn")).OrderBy(y => y).ToList();//只获取保存value的key  
  18.     dictionary.Add(userKeyList[1], user1);//第二个人  
  19.     dictionary.Add(userKeyList[2], user2);//第三个人  
  20.     redisClient.SetAll(dictionary);//同时修改多个value  
  21.      
  22.     var users = user.GetAll();  
  23.     if (users.Count > 0)  
  24.     {  
  25.         var htmlStr = string.Empty;  
  26.         foreach (var u in users)  
  27.         {  
  28.             htmlStr += "<li>ID=" + u.Id + "  姓名:" + u.Name + "  所在部门:" + u.Job.Position + "</li>";  
  29.         }  
  30.         lblPeople.Text = htmlStr;  
  31.     }  
  32.     lblShow.Text = "筛选后共有:" + users.Count.ToString() + "人!";  
  33. }  

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

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

修改key代码如下:
[csharp] view plain copy
  1. using (var redisClient = RedisManager.GetClient())  
  2.                 {  
  3.                     redisClient.RenameKey(txtKey.Text, txtNewKey.Text);  
  4.                      
  5.                     var user = redisClient.GetTypedClient<User>();  
  6.                     var userKeyList = user.GetAllKeys();  
  7.   
  8.                     if (userKeyList.Count > 0)  
  9.                     {  
  10.                         lblPeople.Text = string.Empty;  
  11.                         var htmlStr = string.Empty;  
  12.                         foreach (var u in userKeyList)  
  13.                         {  
  14.                             htmlStr += "<li>key=" + u + "</li>";  
  15.                         }  
  16.                         lblPeople.Text = htmlStr;  
  17.                     }  
  18.                     lblShow.Text = "筛选后共有:" + userKeyList.Count.ToString() + " Keys!";  
  19.                 }  

这样是可以重命名key的,如下图:

可以看到urn:user:1已经不存在了,取而代之的是urn:user:5,但是如果我们再次运行GetAll<User>()时,却发现只有三条数据了,如图:
      
C# Redis实战(六)中我已经提到了ids:User的概念,其实在ServiceStack.Redis的Rename中并没有将重命名后的key保存在其中,这样就会导致ids:User中只有原来的三条未修改的数据,但是seq:User中仍有六条数据。
[csharp] view plain copy
  1. public void Rename(string oldKeyname, string newKeyname)  
  2.         {  
  3.             if (oldKeyname == null)  
  4.                 throw new ArgumentNullException("oldKeyname");  
  5.             if (newKeyname == null)  
  6.                 throw new ArgumentNullException("newKeyname");  
  7.   
  8.             SendExpectSuccess(Commands.Rename, oldKeyname.ToUtf8Bytes(), newKeyname.ToUtf8Bytes());  
  9.         }  

但是查询单个key依然可以得到完整的数据:
可以这么理解,可怜的urn:user:5变成了无家可归的孩子,不管是GetAll(),或者DeleteAll()均对其不起作用。

如需转载,请注明出处,本系列博文示例程序下载地址
  评论这张
 
阅读(27)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017