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()均对其不起作用。