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
相关文章
相关标签/搜索