C# Redis實戰(二)

4、寫入數據

C# Redis實戰(三)中咱們已經配置好了web.config程序,而且能經過C#代碼來讀取和管理以上配置信息。
接下來,就能夠進行Redis的數據寫入了。Redis中能夠用Store和StoreAll分別保存單條和多條數據,C#中具體代碼以下:
 
一、保存多條數據
[csharp]  view plain  copy 在CODE上查看代碼片派生到個人代碼片
  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.   
  6.            using (var redisClient = RedisManager.GetClient())  
  7.            {  
  8.                var user = redisClient.GetTypedClient<User>();  
  9.   
  10.                if (user.GetAll().Count > 0)  
  11.                    user.DeleteAll();  
  12.   
  13.                var qiujialong = new User  
  14.                {  
  15.                    Id = user.GetNextSequence(),  
  16.                    Name = "qiujialong",  
  17.                    Job = new Job { Position = ".NET" }  
  18.                };  
  19.                var chenxingxing = new User  
  20.                {  
  21.                    Id = user.GetNextSequence(),  
  22.                    Name = "chenxingxing",  
  23.                    Job = new Job { Position = ".NET" }  
  24.                };  
  25.                var luwei = new User  
  26.                {  
  27.                    Id = user.GetNextSequence(),  
  28.                    Name = "luwei",  
  29.                    Job = new Job { Position = ".NET" }  
  30.                };  
  31.                var zhourui = new User  
  32.                {  
  33.                    Id = user.GetNextSequence(),  
  34.                    Name = "zhourui",  
  35.                    Job = new Job { Position = "Java" }  
  36.                };  
  37.   
  38.                var userToStore = new List<User> { qiujialong, chenxingxing, luwei, zhourui };  
  39.                user.StoreAll(userToStore);                
  40.   
  41.                lblShow.Text = "目前共有:" + user.GetAll().Count.ToString() + "人!";  
  42.            }  
  43.        }  

2 、保存單條數據
[csharp]  view plain  copy 在CODE上查看代碼片派生到個人代碼片
  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.   
  9.                     var newUser = new User  
  10.                     {  
  11.                         Id = user.GetNextSequence(),  
  12.                         Name = txtName.Text,  
  13.                         Job = new Job { Position = txtPosition.Text }  
  14.                     };                    
  15.                     user.Store(newUser);  
  16.                      
  17.                     if (user.GetAll().Count > 0)  
  18.                     {  
  19.                         var htmlStr = string.Empty;  
  20.                         foreach (var u in user.GetAll())  
  21.                         {  
  22.                             htmlStr += "<li>ID=" + u.Id + "  姓名:" + u.Name + "  所在部門:" + u.Job.Position + "</li>";  
  23.                         }  
  24.                         lblPeople.Text = htmlStr;  
  25.                     }  
  26.                     lblShow.Text = "目前共有:" + user.GetAll().Count.ToString() + "人!";  
  27.                 }  
  28.             }  
  29.         }  
 
 

5、刪除數據

C# Redis實戰(四)中講述瞭如何在Redis中寫入key-value型數據,本篇將講述如何刪除Redis中數據。
 
 
一、void Delete(T entity);刪除函數的運用
[csharp]  view plain  copy 在CODE上查看代碼片派生到個人代碼片
  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.   
  12. }  

以上代碼直接刪除了最後一條數據,效果圖以下:

2 、void DeleteById(object id);刪除數據函數
[csharp]  view plain  copy 在CODE上查看代碼片派生到個人代碼片
  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的一條數據。

三、void DeleteByIds(IEnumerable ids);批量刪除函數
[csharp]  view plain  copy 在CODE上查看代碼片派生到個人代碼片
  1. using (var redisClient = RedisManager.GetClient())  
  2. {  
  3.     var user = redisClient.GetTypedClient<User>();  
  4.     user.DeleteByIds((txtRedisId.Text).ToList());//txtRedisId.Text中爲ID值  
  5.   
  6. }  
以下圖,代碼刪除了ID分別爲:一、二、6的三條數據。

4 、void DeleteAll();刪除所有數據
[csharp]  view plain  copy 在CODE上查看代碼片派生到個人代碼片
      1. var user = redisClient.GetTypedClient<User>();  
      2.                     user.DeleteAll();//刪除所有數據  

6、查詢數據

C# Redis實戰(五)中介紹瞭如何刪除Redis中數據,本篇將繼續介紹Redis中查詢的寫法。
 
 
一、使用Linq匹配關鍵字查詢
[csharp]  view plain  copy 在CODE上查看代碼片派生到個人代碼片
  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.   
  6.                     if (userList.Count > 0)  
  7.                     {  
  8.                         var htmlStr = string.Empty;  
  9.                         foreach (var u in userList)  
  10.                         {  
  11.                             htmlStr += "<li>ID=" + u.Id + "  姓名:" + u.Name + "  所在部門:" + u.Job.Position + "</li>";  
  12.                         }  
  13.                         lblPeople.Text = htmlStr;  
  14.                     }  
  15.                     lblShow.Text = "篩選後共有:" + userList.Count.ToString() + "人!";  
  16.   
  17.                 }  
以上代碼實現了匹配所在部門來查詢數據的功能,輸入.NET,過濾掉Java部門的一人。查詢結果以下:

2 、經過key來查詢數據
在Redis中能夠經過輸入keys * 來查詢當前數據庫中全部的key,C#中咱們能夠經過如下代碼來實現相同效果。
[csharp]  view plain  copy 在CODE上查看代碼片派生到個人代碼片
  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 在CODE上查看代碼片派生到個人代碼片
  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. }  
效果以下:
 
 

7、修改數據html

在上一篇 C# Redis實戰(六)中介紹瞭如何查詢Redis中數據,本篇將介紹如何修改Redis中相關數據。你們都知道Redis是key-value型存儲系統,因此應該能夠修改key,也能夠根據key來修改value。接下來將是詳細的C#語言修改Redis示例。git

一、經過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人!";

}github

代碼執行後效果圖以下:web


以上代碼讓Redis修改了key爲urn:user:1的人所在部門,將原先.NET修改成如今的Python,修改後所有的數據就變成了:redis


二、經過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都一併修改,執行後效果圖以下:json


三、重命名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!";
}ui

這樣是能夠重命名key的,以下圖:url


能夠看到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
相關文章
相關標籤/搜索