C#操作redis(StackExchange.Redis)

打印 上一主题 下一主题

主题 510|帖子 510|积分 1530

C#操作redis
入门步调:
安装redis–安装可视化软件RedisDesktopManager–C#操作redis
前两步软件的安装教程很多,这里不赘述。
一、类库的选择
在C#中使用Redis,一样寻常有两种方式:
1、ServiceStack.Redis,据说是Redis官方保举使用的驱动类库,但是是收费的。
2、StackExchange.Redis,可能性能要比ServiceStack.Redis差点,但是是免费的。
经过多方调研,我选用StackExchange.Redis来实现Redis操作,可找到的资料也更多。
二、添加StackExchange.Redis引用
想要在C#中使用Redis,起首得要有个Redis支持的C#版的驱动。
通过网络下载或nuget安装,得到Redis相干的dll,添加到项目中引用。这里先容下通过NuGet方式添加
第一步:在项目中右键,选择管理NuGet管理包

第二步:搜索StackExchange.Redis添加,我这里已经添加过了以是没有添加按钮
留意.net framework的版本要相顺应

通过这两步,会在项目中自动添加StackExchange.Redis引用
有需要的可以自行添加Newtonsoft.Json引用
增补完整后引用如图

三、利用StackExchange.Redis对数据库举行增删查改
论坛里有不少教程,都是给出RedisHelper类,可自己调用这样的用法,如下面几篇文章
https://blog.csdn.net/u011301348/article/details/105215016
https://blog.csdn.net/wanlong360599336/article/details/46771477
https://blog.csdn.net/weixin_30892037/article/details/98005759
https://blog.csdn.net/yangwohenmai1/article/details/93536539
对我而言,更想学数据库毗连,写入,增删查改的具体方法,下面的原文毗连很友爱。
https://blog.csdn.net/kingshown_WZ/article/details/89603057
我这里在原文步伐的基础上扩展功能,对redis各种数据范例的操作做了完整增补。步伐布局在上图中可以看到。
1、新建控制台步伐
同上步操作添加Nuget包
2、添加UserInfoDto.cs用户实体
   public class UserInfoDto
    {
        public int Id { get; set; }
        public string StaffId { get; set; }
        public string StaffName { get; set; }
        public string Password { get; set; }
        public System.DateTime LastLoginTime { get; set; } 
    }
  3、添加Redis数据库辅助操作类RedisHelper.cs
留意:private static readonly ConfigurationOptions ConfigurationOptions = ConfigurationOptions.Parse(“127.0.0.1:6379,password=123456”);
设置毗连数据库的IP、端口号和暗码,若没有设置暗码可去掉后半句。
  1. class RedisHelper
  2.     {
  3.         private static readonly ConfigurationOptions ConfigurationOptions = ConfigurationOptions.Parse("127.0.0.1:6379,password=123456");
  4.         private static readonly object Locker = new object();
  5.         private static ConnectionMultiplexer _redisConn;
  6.         /// <summary>
  7.         /// 单例获取
  8.         /// </summary>
  9.         public static ConnectionMultiplexer RedisConn
  10.         {
  11.             get
  12.             {
  13.                 if (_redisConn == null)
  14.                 {
  15.                     // 锁定某一代码块,让同一时间只有一个线程访问该代码块
  16.                     lock (Locker)
  17.                     {
  18.                         if (_redisConn == null || !_redisConn.IsConnected)
  19.                         {
  20.                             _redisConn = ConnectionMultiplexer.Connect(ConfigurationOptions);
  21.                         }
  22.                     }
  23.                 }
  24.                 return _redisConn;
  25.             }
  26.         }
  27.     }
复制代码
4、 添加Redis数据库业务实现类RedisDemo.cs

这部门步伐是操作数据库的主要部门
下面有对string、Hash、List、Set、SortedSet五种范例的基本操作
备注是自己加的,也比较具体,有什么题目欢迎大家指出
  1. class RedisDemo
  2.     {
  3.         //键值对
  4.         public static void StringTest()
  5.         {
  6.             // Using:定义了一个范围,等范围结束以后进行资源的释放,结束后调用Dispose()
  7.             using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
  8.             {
  9.                 //测试0,文件夹下入数据
  10.                 string key0 = "StringTest:";
  11.                 //默认为db0
  12.                 //括号内可填写1-15,如var db2 = conn.GetDatabase(2);
  13.                 var db = conn.GetDatabase(); //在Redis中获得与数据库的交互式连接
  14.                 db.StringSet(key0+"num", "138");
  15.                 db.StringSet(key0 + "time", DateTime.Now.ToString());
  16.                 var num = db.StringGet("StringTest:num");
  17.                 Console.WriteLine(num);
  18.                 //测试1,写入数据,读取数据
  19.                 string key = "StringTest";
  20.                 if (db.KeyExists(key))
  21.                     db.KeyDelete(key);
  22.                 db.StringSet(key, "1008611");
  23.                 var value = db.StringGet(key);
  24.                 Console.WriteLine(value);
  25.                 //测试2,获取当前时间
  26.                 string key2 = "StringTest2";
  27.                 //如果key已经存在并且是字符串,则此命令将值附加在字符串的末尾
  28.                 //如果key不存在,则会创建它并将其设置为空字符串,类似于SET
  29.                 //if (db.KeyExists(key2))
  30.                 //     db.KeyDelete(key2);
  31.                 //db.StringAppend(key2, DateTime.Now.ToString());
  32.                 db.StringSet(key2, DateTime.Now.ToString());
  33.                 Console.WriteLine(db.StringGet(key2));
  34.                 //测试3,控制台写入
  35.                 string value3 = Console.ReadLine();
  36.                 Console.WriteLine("value3=" + value3);
  37.                 string key3 = "StringTest3";
  38.                 db.StringSet(key3, value3);
  39.                 Console.WriteLine(db.StringGet(key3));
  40.                 // 测试4,批量读写数据
  41.                 // KeyValuePair<RedisKey, RedisValue>[] values
  42.                 //以KeyValuePair数组形式批量写入
  43.                 var keyvp1 = new KeyValuePair<RedisKey, RedisValue>("name1", "Jhon");
  44.                 var keyvp2 = new KeyValuePair<RedisKey, RedisValue>("name2", "Lilei");
  45.                 var keyvp3 = new KeyValuePair<RedisKey, RedisValue>("name3", "Jim");
  46.                 KeyValuePair<RedisKey, RedisValue>[] values = { keyvp1, keyvp2, keyvp3 };
  47.                 db.StringSet(values);
  48.                 //批量读取key的值
  49.                 RedisKey[] rkarray = { "name1", "name2", "name3" };
  50.                 RedisValue[] rvarray = db.StringGet(rkarray);
  51.                 foreach (var item in rvarray)
  52.                 {
  53.                     Console.WriteLine(item);
  54.                 }
  55.                 //测试5,将对象以Json格式存入string中
  56.                 db.StringSet("myfirstname", "Li");
  57.                 string str = db.StringGet("myfirstname");
  58.                 db.StringSet("mylastname", "Shuxian", TimeSpan.FromSeconds(20));//设置时间,20s后过期。
  59.                 str = db.StringGet("mylastname");
  60.                 //创建对象
  61.                 UserInfoDto User1 = new UserInfoDto()
  62.                 {
  63.                     Id = 97,
  64.                     LastLoginTime = DateTime.Now,
  65.                     Password ="xxxxxx",
  66.                     StaffId = "xxxxxx",
  67.                     StaffName = "xxx"
  68.                 };
  69.                
  70.                 string user1_Json = JsonConvert.SerializeObject(User1);//序列化,对象转化为Json格式
  71.                 db.StringSet("stringtest_Json", user1_Json);
  72.                 string user1_JsonResult = db.StringGet("stringtest_Json");//读取Json格式的key
  73.                 Console.WriteLine(user1_JsonResult);
  74.                 User1 = JsonConvert.DeserializeObject<UserInfoDto>(user1_JsonResult);//反序列化
  75.                 Console.WriteLine(User1);
  76.             }
  77.         }
  78.         //Hash类型
  79.         //string类型的域和值的映射表
  80.         //常用来存储对象信息
  81.         public static void HashTest()
  82.         {
  83.             // C# 泛型集合 List<数据类型>
  84.             List<UserInfoDto> list = new List<UserInfoDto>();
  85.             for (int i = 0; i < 11; ++i)
  86.             {
  87.                 list.Add(new UserInfoDto()
  88.                 {
  89.                     Id = i,
  90.                     LastLoginTime = DateTime.Now,
  91.                     Password = "password_" + i.ToString(),
  92.                     StaffId = "StaffId_" + i.ToString(),
  93.                     StaffName = "StaffName_" + i.ToString()
  94.                 });
  95.             }
  96.             using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
  97.             {
  98.                 //测试1:对象序列化为JSON字符串写入
  99.                 string key = "HashSetTest";
  100.                 var db = conn.GetDatabase();
  101.                 if (db.KeyExists(key))
  102.                     db.KeyDelete(key);
  103.                 //string listKey = IdentityMap.CreateKey<UserInfoDto>();
  104.                 HashEntry[] items = new HashEntry[list.Count];
  105.                 for (int i = 1; i < list.Count; i++)
  106.                 {
  107.                     // 将指定的对象序列化为JSON字符串。
  108.                     string json = JsonConvert.SerializeObject(list[i]);
  109.                     db.HashSet(key, list[i].Id, json);
  110.                     Console.WriteLine(db.HashGet(key, list[i].Id));
  111.                     Console.WriteLine(db.HashGet(key, "StaffId"));
  112.                     db.HashDelete(key, "password");//无效
  113.                 }
  114.                 //测试2:将对象以plain text格式希尔
  115.                 string key2 = "HashSetTest2";
  116.                 //if (db.KeyExists(key2))
  117.                 //    db.KeyDelete(key2);
  118.                 //为哈希表的每一个域设值
  119.                 //bool HashSet(RedisKey key, RedisValue hashField, RedisValue value)
  120.                 for (int i = 1; i < 5; i++)
  121.                 {
  122.                     key2 = "HashSetTest" + list[i].Id.ToString();
  123.                     if (db.KeyExists(key2))
  124.                         db.KeyDelete(key2);
  125.                     db.HashSet(key2, "ID", list[i].Id);
  126.                     db.HashSet(key2, "password", list[i].Password);
  127.                     db.HashSet(key2, "StaffId", list[i].StaffId);
  128.                     db.HashSet(key2, "StaffName", list[i].StaffName);
  129.                     db.HashSet(key2, "LastLoginTime", DateTime.Now.ToString());
  130.                     Console.WriteLine(db.HashGet(key2, list[i].Id));
  131.                     //删除key中的域
  132.                     db.HashDelete(key2, "password");
  133.                 }
  134.                 //测试3:删除key中的域
  135.                 string key3 = "HashDeletTest";
  136.                 db.HashSet(key3, "ID", 123456111111111111);
  137.                 db.HashSet(key3, "password", "xxxxxx");
  138.                 db.HashSet(key3, "StaffId", "xxxxxxxxxx");
  139.                 db.HashDelete(key3, "password");
  140.             }
  141.             Console.ReadLine();
  142.         }
  143.         //列表数据类型
  144.         //列表按照插入顺序排序,可将一个元素插入列表的头部和尾部
  145.         public static void ListTest()
  146.         {
  147.             using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
  148.             {
  149.                 string key = "ListTest";
  150.                 var db = conn.GetDatabase();
  151.                 if (db.KeyExists(key))
  152.                     db.KeyDelete(key);
  153.                 for (int i = 0; i < 10; i++)
  154.                 {
  155.                     // 将指定的值插入存储在key的列表的开头 ,相当于栈
  156.                     // 如果键不存在,则在执行推入操作之前将其创建为空列表
  157.                     db.ListLeftPush(key, "left_" + i.ToString());
  158.                     db.ListRightPush(key, "right_" + i.ToString());
  159.                 }
  160.                 Console.WriteLine("写入完成");
  161.                 var length = db.ListLength("list"); //读出list的长度
  162.                 Console.WriteLine(length);
  163.                 var str = db.ListLeftPop(key); //从顶部拿出数据
  164.                 Console.WriteLine(str);
  165.                 str = db.ListRightPop(key); //从底部拿出数据
  166.                 Console.WriteLine(str);
  167.                 //返回存储在键列表中指定的元素。
  168.                 //偏移量start和stop是从零开始的索引,0是列表的第一个元素(列表的头),1是下一个元素,依此类推。
  169.                 //这些偏移也可以是负数,表示从列表。用于示例,-1是列表的最后一个元素,-2是倒数第二个元素,依此类推。
  170.                 //注意,如果您有一个从0到100的数字列表,LRANGE list 0 10将返回11个元素,也就是说,包含最右边的项。
  171.                 var list = db.ListRange(key, 0, 4);
  172.                 foreach (var item in list)
  173.                 {
  174.                     Console.WriteLine(item);
  175.                 }
  176.                 str = db.ListRemove(key, "left_2"); //删除list中的单个数值
  177.                 Console.WriteLine(str);
  178.                 str = db.ListInsertAfter(key, list[3], "After"); //在某一位置后插入数据
  179.                 Console.WriteLine(str);
  180.                 str = db.ListInsertBefore(key, list[3], "Before"); //在某一位置前插入数据
  181.                 Console.WriteLine(str);
  182.                 //删除list中的数据
  183.                 while (db.ListLength(key) != 0)
  184.                 {
  185.                     //从redis数据库弹出List里的数据
  186.                     //var str = db.ListRightPop(key);
  187.                     //Console.WriteLine(str);
  188.                 }
  189.             }
  190.         }
  191.         //Set是String类型的无序集合
  192.         public static void SetTest()
  193.         {
  194.             List<UserInfoDto> list = new List<UserInfoDto>();
  195.             DateTime dt = DateTime.Now;
  196.             for (int i = 1; i < 4; i++)
  197.             {
  198.                 list.Add(new UserInfoDto()
  199.                 {
  200.                     Id = i,
  201.                     LastLoginTime = dt,
  202.                     Password = "password" + i.ToString(),
  203.                     StaffId = "StaffId_" + i.ToString(),
  204.                     StaffName = "StaffName_" + i.ToString()
  205.                 });
  206.             }
  207.             using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
  208.             {
  209.                 //测试1
  210.                 string key = "SetTest:";
  211.                 var db = conn.GetDatabase();
  212.                 db.KeyDelete(key);
  213.                 //string listKey = IdentityMap.CreateKey<UserInfoDto>();
  214.                 HashEntry[] items = new HashEntry[list.Count];
  215.                 for (int i = 0; i < list.Count; i++)
  216.                 {
  217.                     string json = JsonConvert.SerializeObject(list[i]);
  218.                     db.KeyDelete(key + list[i].Id.ToString());
  219.                     // 以Json格式存储
  220.                     db.SetAdd(key + list[i].Id.ToString(), json);
  221.                     //以string格式存储
  222.                     db.SetAdd(key + list[i].Id.ToString() + ":Id", list[i].Id);
  223.                     db.SetAdd(key + list[i].Id.ToString() + ":password", list[i].Password);
  224.                     db.SetAdd(key + list[i].Id.ToString() + ":StaffId", list[i].StaffId);
  225.                     db.SetAdd(key + list[i].Id.ToString() + ":StaffName", list[i].StaffName);
  226.                     db.SetAdd(key + list[i].Id.ToString() + ":LastLoginTime", DateTime.Now.ToString());
  227.                     //SSCAN命令用于对集合进行增量迭代。
  228.                     //注意:要通过游标恢复迭代,请将原始的可枚举或枚举数转换为IScanningCursor。
  229.                     var result = db.SetScan(key, "*password99*").FirstOrDefault();
  230.                     Console.WriteLine(result);
  231.                 }
  232.                 Console.WriteLine("Complete test1!");
  233.                 //测试2,set命令
  234.                 //冒号后可在目录下创建文件夹
  235.                 string key2 = "citys:";
  236.                 db.KeyDelete(key2);
  237.                 RedisValue[] citys1 = { "北京", "上海", "广州" };
  238.                 db.SetAdd(key2 + "1", citys1);
  239.                 RedisValue[] citys2 = { "成都", "重庆", "西安" };
  240.                 db.SetAdd(key2 + "2", citys2);
  241.                 RedisValue[] citys3 = { "太原", "大连", "徐州" };
  242.                 db.SetAdd(key2 + "3", citys3);
  243.                 db.SetMove("citys:2", "citys:1", "成都");
  244.                 db.SetRemove("citys:3", "大连");
  245.             }
  246.         }
  247.         //有序集合
  248.         //每个集合元素都有一个对应的double类型的分数
  249.         public static void SortedSet()
  250.         {
  251.             List<UserInfoDto> list = new List<UserInfoDto>();
  252.             for (int i = 1; i < 5; i++)
  253.             {
  254.                 list.Add(new UserInfoDto()
  255.                 {
  256.                     Id = i,
  257.                     LastLoginTime = DateTime.Now,
  258.                     Password = "password" + i.ToString(),
  259.                     StaffId = "StaffId_" + i.ToString(),
  260.                     StaffName = "StaffName_" + i.ToString()
  261.                 });
  262.             }
  263.             using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
  264.             {
  265.                 //测试2
  266.                 var db = conn.GetDatabase();
  267.                 string key = "SortedSetTest:";
  268.                 db.KeyDelete("SortedSetTest");
  269.                 foreach (var item in list)
  270.                 {
  271.                     string json = JsonConvert.SerializeObject(item);
  272.                     db.KeyDelete(key + item.Id.ToString());
  273.                     db.KeyDelete("SortedSetTest" + item.Id.ToString() + ":name");
  274.                     db.KeyDelete("SortedSetTest" + item.Id.ToString() + ":StaffId");
  275.                     //db.SetAdd(key + list[i].Id.ToString(), json);
  276.                     db.SortedSetAdd(key + item.Id.ToString() + ":name", item.StaffName, item.Id);
  277.                     db.SortedSetAdd(key + item.Id.ToString() + ":StaffId", item.StaffName, item.Id);
  278.                 }
  279.                 Console.WriteLine("写入完成");
  280.                 Console.WriteLine("读取两条记录");
  281.                 var result = db.SortedSetRangeByRank(key, 1, 3);
  282.                 for (int i = 0; i < result.Length; i++)
  283.                 {
  284.                     Console.WriteLine(result[i]);
  285.                 }
  286.                 var result2 = db.SortedSetRangeByRankWithScores(key, 0, -1, Order.Descending);
  287.                 var result3 = db.SortedSetScan(key, "*99*", 10).ToList();
  288.                 for (int i = 0; i < result3.Count; i++)
  289.                 {
  290.                     Console.WriteLine(result3[i]);
  291.                 }
  292.                 Console.ReadLine();
  293.                 //测试1
  294.                 string key0 = "SortedSetTest0";
  295.                 var db2 = conn.GetDatabase(2);
  296.                 var rep = db2.SortedSetAdd(key0, "北京", 6521);
  297.                 Console.WriteLine(rep);
  298.                 var city1 = new SortedSetEntry("北京", 4451);
  299.                 var city2 = new SortedSetEntry("上海", 3400);
  300.                 var city3 = new SortedSetEntry("广州", 3459);
  301.                 var city4 = new SortedSetEntry("成都", 3300);
  302.                 var city5 = new SortedSetEntry("太原", 2459);
  303.                 SortedSetEntry[] citys = { city1, city2, city3, city4, city5 };
  304.                 var rep2 = db2.SortedSetAdd(key0, citys);
  305.                 Console.WriteLine(rep2);
  306.                 var res = db2.SortedSetRangeByRank(key0, 1, 3);
  307.                 for (int i = 0; i < res.Length; i++)
  308.                 {
  309.                     Console.WriteLine(res[i]);
  310.                 }
  311.             }
  312.         }
  313.     }
复制代码
5、 Program.cs类

主步伐,对上面各部门的功能举行测试
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             //字符串            
  6.             RedisDemo.StringTest();
  7.             //Hash
  8.             //RedisDemo.HashTest();
  9.             //List
  10.             //RedisDemo.ListTest();
  11.             //Console.ReadKey();
  12.             //Set
  13.             //RedisDemo.SetTest();
  14.             //SortedSet
  15.             //RedisDemo.SortedSet();
  16.         }        
  17.     }
复制代码
这部门就不逐一展示测试结果了
其他功能测试

添加定时器,定时往redis数据库中写入数据,并在控制台体现
  1. static int i = 1;
  2.         static void Main2(string[] args)
  3.         {
  4.             ConnectionMultiplexer conn = RedisHelper.RedisConn;
  5.             string key = "Data Storage";
  6.             var db = conn.GetDatabase(3);
  7.             if (db.KeyExists(key))
  8.                 db.KeyDelete(key);
  9.             System.Timers.Timer aTimer = new System.Timers.Timer();
  10.             aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
  11.             // Set the Interval to 5 seconds.
  12.             aTimer.Interval = 2000;
  13.             aTimer.Enabled = true;
  14.             Console.WriteLine("Press /'q/' to quit the sample.");
  15.             while (Console.Read() == 'q')
  16.             {
  17.                 Console.WriteLine("结束!");
  18.             }
  19.             void OnTimedEvent(object source, ElapsedEventArgs e)
  20.             {
  21.                 Console.WriteLine("Hello World!");
  22.                 db.ListLeftPush(key, "left_" + i.ToString());
  23.                 i++;
  24.                 var str = db.ListGetByIndex(key, 0); //从顶部拿出数据
  25.                 Console.WriteLine(str);
  26.             }
  27.         }
复制代码
控制台输出

可视化中检察数据库的写入


四、留意

1、步伐运行前启动redis服务器

打开可视化工具,若redis设置了暗码,要输入暗码才可打开数据库。
2、选择数据写入的数据库

redis默认16个数据库,怎样选择将数据写入哪个数据库呢?

var db = conn.GetDatabase(); //在Redis中得到与数据库的交互式毗连
该语句毗连数据库,括号为空默认写入db0
var db = conn.GetDatabase(3);即可将数据写入db3数据库
3、在数据库内添加文件夹存储
开始时将key全部写入db0中,数据存储凌乱,后来找到了添加文件夹的方法

具体操作:key值后加冒号

  1. string key = "SetTest:";
  2.                 var db = conn.GetDatabase();
  3.                 db.KeyDelete(key);
  4.                 //string listKey = IdentityMap.CreateKey<UserInfoDto>();
  5.                 HashEntry[] items = new HashEntry[list.Count];
  6.                 for (int i = 0; i < list.Count; i++)
  7.                 {
  8.                     string json = JsonConvert.SerializeObject(list[i]);
  9.                     db.KeyDelete(key + list[i].Id.ToString());
  10.                     // 以Json格式存储
  11.                     db.SetAdd(key + list[i].Id.ToString(), json);
  12.                     //以string格式存储
  13.                     db.SetAdd(key + list[i].Id.ToString() + ":Id", list[i].Id);
  14.                     db.SetAdd(key + list[i].Id.ToString() + ":password", list[i].Password);
  15.                     db.SetAdd(key + list[i].Id.ToString() + ":StaffId", list[i].StaffId);
  16.                     db.SetAdd(key + list[i].Id.ToString() + ":StaffName", list[i].StaffName);
  17.                     db.SetAdd(key + list[i].Id.ToString() + ":LastLoginTime", DateTime.Now.ToString());
复制代码
对应的文件夹添加环境如图

string key = “SetTest:”; 该key值加了冒号,成为文件夹
子文件夹也是,通过加冒号添加文件夹。
下文中也有添加文件夹的说明,大家可多方面参考学习
https://blog.csdn.net/a6864657/article/details/103863349
五、Redis高级功能
redis还有事件、消息队列、同步异步等高级功能,找了找其他参考,有以下几篇文章可参考,本人未举行试验。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表