1. 程式人生 > >C# Redis實戰(二)

C# Redis實戰(二)

open rediscli conf get 單個 fonts 讀取 cep 分組

四、寫入數據

在C# Redis實戰(三)中我們已經配置好了web.config程序,並且能通過C#代碼來讀取和管理以上配置信息。 接下來,就可以進行Redis的數據寫入了。Redis中可以用Store和StoreAll分別保存單條和多條數據,C#中具體代碼如下: 1、保存多條數據 [csharp] view plain copy 技術分享圖片技術分享圖片
  1. protected void btnOpenDB_Click(object sender, EventArgs e)
  2. {
  3. //System.Diagnostics.Process.Start("D:\\redis\\redis-server.exe");
  4. //lblShow.Text = "Redis已經打開!";
  5. using (var redisClient = RedisManager.GetClient())
  6. {
  7. var user = redisClient.GetTypedClient<User>();
  8. if (user.GetAll().Count > 0)
  9. user.DeleteAll();
  10. var qiujialong = new User
  11. {
  12. Id = user.GetNextSequence(),
  13. Name = "qiujialong",
  14. Job = new Job { Position = ".NET" }
  15. };
  16. var chenxingxing = new User
  17. {
  18. Id = user.GetNextSequence(),
  19. Name = "chenxingxing",
  20. Job = new Job { Position = ".NET" }
  21. };
  22. var luwei = new User
  23. {
  24. Id = user.GetNextSequence(),
  25. Name = "luwei",
  26. Job = new Job { Position = ".NET" }
  27. };
  28. var zhourui = new User
  29. {
  30. Id = user.GetNextSequence(),
  31. Name = "zhourui",
  32. Job = new Job { Position = "Java" }
  33. };
  34. var userToStore = new List<User> { qiujialong, chenxingxing, luwei, zhourui };
  35. user.StoreAll(userToStore);
  36. lblShow.Text = "目前共有:" + user.GetAll().Count.ToString() + "人!";
  37. }
  38. }

2、保存單條數據 [csharp] view plain copy 技術分享圖片技術分享圖片
  1. protected void btnInsert_Click(object sender, EventArgs e)
  2. {
  3. if (!string.IsNullOrEmpty(txtName.Text) && !string.IsNullOrEmpty(txtPosition.Text))
  4. {
  5. using (var redisClient = RedisManager.GetClient())
  6. {
  7. var user = redisClient.GetTypedClient<User>();
  8. var newUser = new User
  9. {
  10. Id = user.GetNextSequence(),
  11. Name = txtName.Text,
  12. Job = new Job { Position = txtPosition.Text }
  13. };
  14. user.Store(newUser);
  15. if (user.GetAll().Count > 0)
  16. {
  17. var htmlStr = string.Empty;
  18. foreach (var u in user.GetAll())
  19. {
  20. htmlStr += "<li>ID=" + u.Id + " 姓名:" + u.Name + " 所在部門:" + u.Job.Position + "</li>";
  21. }
  22. lblPeople.Text = htmlStr;
  23. }
  24. lblShow.Text = "目前共有:" + user.GetAll().Count.ToString() + "人!";
  25. }
  26. }
  27. }

五、刪除數據

在C# Redis實戰(四)中講述了如何在Redis中寫入key-value型數據,本篇將講述如何刪除Redis中數據。 1、void Delete(T entity);刪除函數的運用 [csharp] view plain copy 技術分享圖片技術分享圖片
  1. using (var redisClient = RedisManager.GetClient())
  2. {
  3. var user = redisClient.GetTypedClient<User>();
  4. var newUser = new User
  5. {
  6. Id = user.GetAll().Count,
  7. Name = txtName.Text,
  8. Job = new Job { Position = txtPosition.Text }
  9. };
  10. user.Delete(newUser);
  11. }

以上代碼直接刪除了最後一條數據,效果圖如下: 技術分享圖片
2、void DeleteById(object id);刪除數據函數 [csharp] view plain copy 技術分享圖片技術分享圖片
  1. using (var redisClient = RedisManager.GetClient())
  2. {
  3. var user = redisClient.GetTypedClient<User>();
  4. //var newUser = new User
  5. //{
  6. // Id = user.GetAll().Count,
  7. // Name = txtName.Text,
  8. // Job = new Job { Position = txtPosition.Text }
  9. //};
  10. //user.Delete(newUser);
  11. user.DeleteById(txtRedisId.Text);//txtRedisId.Text中為ID值
  12. }

如下圖,刪除了ID等於3的一條數據。 技術分享圖片
3、void DeleteByIds(IEnumerable ids);批量刪除函數 [csharp] view plain copy 技術分享圖片技術分享圖片
  1. using (var redisClient = RedisManager.GetClient())
  2. {
  3. var user = redisClient.GetTypedClient<User>();
  4. user.DeleteByIds((txtRedisId.Text).ToList());//txtRedisId.Text中為ID值
  5. }
如下圖,代碼刪除了ID分別為:1、2、6的三條數據。 技術分享圖片
4、void DeleteAll();刪除全部數據 [csharp] view plain copy 技術分享圖片技術分享圖片
      1. var user = redisClient.GetTypedClient<User>();
      2. user.DeleteAll();//刪除全部數據

六、查詢數據

在C# Redis實戰(五)中介紹了如何刪除Redis中數據,本篇將繼續介紹Redis中查詢的寫法。 1、使用Linq匹配關鍵字查詢 [csharp] view plain copy 技術分享圖片技術分享圖片
  1. using (var redisClient = RedisManager.GetClient())
  2. {
  3. var user = redisClient.GetTypedClient<User>();
  4. var userList = user.GetAll().Where(x => x.Job.Position.Contains(txtScreenPosition.Text)).ToList();
  5. if (userList.Count > 0)
  6. {
  7. var htmlStr = string.Empty;
  8. foreach (var u in userList)
  9. {
  10. htmlStr += "<li>ID=" + u.Id + " 姓名:" + u.Name + " 所在部門:" + u.Job.Position + "</li>";
  11. }
  12. lblPeople.Text = htmlStr;
  13. }
  14. lblShow.Text = "篩選後共有:" + userList.Count.ToString() + "人!";
  15. }
以上代碼實現了匹配所在部門來查詢數據的功能,輸入.NET,過濾掉Java部門的一人。查詢結果如下: 技術分享圖片
2、通過key來查詢數據 在Redis中可以通過輸入keys * 來查詢當前數據庫中所有的key,C#中我們可以通過以下代碼來實現相同效果。 [csharp] view plain copy 技術分享圖片技術分享圖片
  1. var user = redisClient.GetTypedClient<User>();
  2. var userKeyList = user.GetAllKeys();

代碼中userKeyList中保存了所有的key 技術分享圖片
細心的讀者會發現此處查詢到的key數量與數據庫保存的數據量不同 技術分享圖片
我們逐一說明下: seq:User:用來維護當前類型User的ID自增序列,用作對象唯一ID,也就是使用GetNextSequence()函數可以獲取當前數據庫最新的ID的原因了。 ids:User:同一類型User中所有對象ID的列表,相當於一個索引,包含了所有同為類型User的ID; 由於維護了這樣一個分組信息,所以很容易實現GetAll<User>()這樣的功能。
urn:user:1:這才是保存user對象的key。 在redis-client中輸入:get urn:user:1 得到json類型數據。
技術分享圖片
通過上述說明,我們就可以很輕松的通過key來查詢value值了,代碼如下: [csharp] view plain copy 技術分享圖片技術分享圖片
  1. using (var redisClient = RedisManager.GetClient())
  2. {
  3. var keyValue = string.Empty;
  4. try
  5. {
  6. var user = redisClient.GetTypedClient<User>();
  7. var value = user.GetValue(txtKey.Text);
  8. keyValue += "ID=" + value.Id + " 姓名:" + value.Name + " 所在部門:" + value.Job.Position;
  9. }
  10. catch (Exception ex)
  11. {
  12. keyValue += ex.ToString();
  13. }
  14. lblPeople.Text = keyValue.ToJson();
  15. lblShow.Text = string.Empty;
  16. }
效果如下: 技術分享圖片

七、修改數據

在上一篇 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()均對其不起作用。
---------------------
作者:風一樣的大叔
來源:CSDN
原文:https://blog.csdn.net/qiujialongjjj/article/details/17298767
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

VS版本:2015 用NuGet安裝了Redis的包 技術分享圖片 按照百度的各種教程來操作,但是發現網上下載的DEMO可以正常運行,自己項目卻一直報錯 如下圖: 自己項目報錯: 技術分享圖片 網上找的DEMO 不報錯: 技術分享圖片 問題原因:版本太新了。。。。(折騰了好幾個小時才定位到我會去說??!!) 我的版本: 技術分享圖片 對應的接口文檔: 技術分享圖片 網上教程用的: 技術分享圖片 對應的接口文檔。 技術分享圖片 網上有人說: 請使用As替代GetTypedClient。(暫時還沒有研究AS怎麽用,不過確實有這個方法,老版本也有這個) (該地址國內直接訪問不了,想看的自己想辦法吧。。。。。) 詳細請見於https://github.com/ServiceStack/ServiceStack.Redis/wiki/IRedisTypedClient

C# Redis實戰(二)