四、写入数据
在
C# Redis实战(三)中我们已经配置好了web.config程序,并且能通过C#代码来读取和管理以上配置信息。 接下来,就可以进行Redis的数据写入了。Redis中可以用Store和StoreAll分别保存单条和多条数据,C#中具体代码如下:
1、保存多条数据
[csharp]
view plain
copy 
- protected void btnOpenDB_Click(object sender, EventArgs e)
- {
- //System.Diagnostics.Process.Start(“D:\\redis\\redis-server.exe”);
- //lblShow.Text = “Redis已经打开!”;
- using (var redisClient = RedisManager.GetClient())
- {
- var user = redisClient.GetTypedClient<User>();
- if (user.GetAll().Count > 0)
- user.DeleteAll();
- var qiujialong = new User
- {
- Id = user.GetNextSequence(),
- Name = “qiujialong”,
- Job = new Job { Position = “.NET” }
- };
- var chenxingxing = new User
- {
- Id = user.GetNextSequence(),
- Name = “chenxingxing”,
- Job = new Job { Position = “.NET” }
- };
- var luwei = new User
- {
- Id = user.GetNextSequence(),
- Name = “luwei”,
- Job = new Job { Position = “.NET” }
- };
- var zhourui = new User
- {
- Id = user.GetNextSequence(),
- Name = “zhourui”,
- Job = new Job { Position = “Java” }
- };
- var userToStore = new List<User> { qiujialong, chenxingxing, luwei, zhourui };
- user.StoreAll(userToStore);
- lblShow.Text = “目前共有:” + user.GetAll().Count.ToString() + “人!”;
- }
- }
2
、保存单条数据
[csharp]
view plain
copy 
- protected void btnInsert_Click(object sender, EventArgs e)
- {
- if (!string.IsNullOrEmpty(txtName.Text) && !string.IsNullOrEmpty(txtPosition.Text))
- {
- using (var redisClient = RedisManager.GetClient())
- {
- var user = redisClient.GetTypedClient<User>();
- var newUser = new User
- {
- Id = user.GetNextSequence(),
- Name = txtName.Text,
- Job = new Job { Position = txtPosition.Text }
- };
- user.Store(newUser);
- if (user.GetAll().Count > 0)
- {
- var htmlStr = string.Empty;
- foreach (var u in user.GetAll())
- {
- htmlStr += “<li>ID=” + u.Id + ” 姓名:” + u.Name + ” 所在部门:” + u.Job.Position + “</li>”;
- }
- lblPeople.Text = htmlStr;
- }
- lblShow.Text = “目前共有:” + user.GetAll().Count.ToString() + “人!”;
- }
- }
- }
五、删除数据
在
C# Redis实战(四)中讲述了如何在Redis中写入key-value型数据,本篇将讲述如何删除Redis中数据。
1、void Delete(T entity);删除函数的运用
[csharp]
view plain
copy 
- using (var redisClient = RedisManager.GetClient())
- {
- var user = redisClient.GetTypedClient<User>();
- var newUser = new User
- {
- Id = user.GetAll().Count,
- Name = txtName.Text,
- Job = new Job { Position = txtPosition.Text }
- };
- user.Delete(newUser);
- }
以上代码直接删除了最后一条数据,效果图如下:
2
、void DeleteById(object id);删除数据函数
[csharp]
view plain
copy 
- using (var redisClient = RedisManager.GetClient())
- {
- var user = redisClient.GetTypedClient<User>();
- //var newUser = new User
- //{
- // Id = user.GetAll().Count,
- // Name = txtName.Text,
- // Job = new Job { Position = txtPosition.Text }
- //};
- //user.Delete(newUser);
- user.DeleteById(txtRedisId.Text);//txtRedisId.Text中为ID值
- }
如下图,删除了ID等于3的一条数据。
3、void DeleteByIds(IEnumerable ids);批量删除函数
[csharp]
view plain
copy 
- using (var redisClient = RedisManager.GetClient())
- {
- var user = redisClient.GetTypedClient<User>();
- user.DeleteByIds((txtRedisId.Text).ToList());//txtRedisId.Text中为ID值
- }
如下图,代码删除了ID分别为:1、2、6的三条数据。
4
、void DeleteAll();删除全部数据
[csharp]
view plain
copy 
- var user = redisClient.GetTypedClient<User>();
- user.DeleteAll();//删除全部数据
六、查询数据
在
C# Redis实战(五)中介绍了如何删除Redis中数据,本篇将继续介绍Redis中查询的写法。
1、使用Linq匹配关键字查询
[csharp]
view plain
copy 
- using (var redisClient = RedisManager.GetClient())
- {
- var user = redisClient.GetTypedClient<User>();
- var userList = user.GetAll().Where(x => x.Job.Position.Contains(txtScreenPosition.Text)).ToList();
- if (userList.Count > 0)
- {
- var htmlStr = string.Empty;
- foreach (var u in userList)
- {
- htmlStr += “<li>ID=” + u.Id + ” 姓名:” + u.Name + ” 所在部门:” + u.Job.Position + “</li>”;
- }
- lblPeople.Text = htmlStr;
- }
- lblShow.Text = “筛选后共有:” + userList.Count.ToString() + “人!”;
- }
以上代码实现了匹配所在部门来查询数据的功能,输入.NET,过滤掉Java部门的一人。查询结果如下:
2
、通过key来查询数据 在Redis中可以通过输入keys * 来查询当前数据库中所有的key,C#中我们可以通过以下代码来实现相同效果。
[csharp]
view plain
copy 
- var user = redisClient.GetTypedClient<User>();
- 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 
- using (var redisClient = RedisManager.GetClient())
- {
- var keyValue = string.Empty;
- try
- {
- var user = redisClient.GetTypedClient<User>();
- var value = user.GetValue(txtKey.Text);
- keyValue += “ID=” + value.Id + ” 姓名:” + value.Name + ” 所在部门:” + value.Job.Position;
- }
- catch (Exception ex)
- {
- keyValue += ex.ToString();
- }
- lblPeople.Text = keyValue.ToJson();
- lblShow.Text = string.Empty;
- }
效果如下:
七、修改数据
在上一篇 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