C# Redis实战(二)

2021-06-27 22:05

阅读:312

七、修改数据

在上一篇 C# Redis实战(六)中介绍了如何查询Redis中数据,本篇将介绍如何修改Redis中相关数据。大家都知道Redis是key-value型存储系统,所以应该可以修改key,也可以根据key来修改value。接下来将是详细的C#语言修改Redis示例。

1、通过key修改单个value
using (var redisClient = RedisManager.GetClient())
{
var user = redisClient.GetTypedClient();
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();
using (var redisClient = RedisManager.GetClient())
{
var user = redisClient.GetTypedClient();
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 += "

  • ID=" + u.Id + "  姓名:" + u.Name + "  所在部门:" + u.Job.Position + "
  • ";
    }
    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();
    var userKeyList = user.GetAllKeys();

    if (userKeyList.Count > 0)
    {
    lblPeople.Text = string.Empty;
    var htmlStr = string.Empty;
    foreach (var u in userKeyList)
    {
    htmlStr += "

  • key=" + u + "
  • ";
    }
    lblPeople.Text = htmlStr;
    }
    lblShow.Text = "筛选后共有:" + userKeyList.Count.ToString() + " Keys!";
    }

    这样是可以重命名key的,如下图:


    可以看到urn:user:1已经不存在了,取而代之的是urn:user:5,但是如果我们再次运行GetAll()时,却发现只有三条数据了,如图:
          
    在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


    评论


    亲,登录后才可以留言!