標籤:blog http io ar os sp for strong on
七、修改資料 在上一篇 C# Redis實戰(六)中介紹了如何查詢Redis中資料,本篇將介紹如何修改Redis中相關資料。大家都知道Redis是key-value型儲存系統,所以應該可以修改key,也可以根據key來修改value。接下來將是詳細的C#語言修改Redis樣本。
1、通過key修改單個value
[csharp] view plaincopy
- 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
[csharp] view plaincopy
- 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代碼如下:
[csharp] view plaincopy
- 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中仍有六條資料。
[csharp] view plaincopy
- 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()均對其不起作用。 如需轉載,請註明出處,本系列博文樣本程式
C# Redis實戰(七)