C#依照C#的MongoDB数据库开发使用(4)–Redis的设置及应用

1、Redis基础及安装

Redis是一个开源的选择ANSI
C语言编写、协理网络、可依照内存亦可持久化的日志型、Key-Value数据库,和Memcached类似,它帮衬存储的value类型相对更加多,包含string(字符串)、list(链表)、set(集合)、zset(sorted
set
–有序集合)和hash(哈希类型)。在此基础上,redis支持各个分裂方法的排序。与memcached一样,为了确保功能,数据都是缓存在内存中。区其余是redis会周期性的把立异的多少写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上得以达成了master-slave(主从)同步。

Redis的代码坚守ANSI-C编写,可以在装有POSIX系统(如Linux, *BSD, Mac OS
X,
Solaris等)上设置运行。而且Redis并不依靠任何非标准库,也并未编译参数必需添加。

1)Redis援助二种持久化形式:

 
 (1):snapshotting(快照)也是默认格局.(把多少做一个备份,将数据存储到文件)

   (2)Append-only file(缩写aof)的方式 

 
 快照是默许的持久化方式,那种方法是将内存中数据以快照的措施写到二进制文件中,默许的文件名称为dump.rdb.可以因而安插安装自动做快照持久化的形式。大家可以配备redis在n秒内假若当先m个key键修改就自动做快照.

 
 aof形式:由于快照方式是在一定间隔时间做三次的,所以一旦Redis意外down掉的话,就会丢掉最终三次快照后的兼具修改。aof比快照格局有更好的持久化性,是由于在应用aof时,redis会将每一个收取的写命令都因此write函数追加到文件中,当redis重启时会通过重复履行文书中保留的写命令来在内存中重建总体数据库的始末。 

2)Redis数据结构

Redis 的撰稿人antirez曾称其为一个数据结构服务器(data structures
server
),那是一个可怜准确的发挥,Redis的拥有功效就是将数据以其固有的三种结构保留,并提须要用户操作那三种结构的接口。我们得以想象大家在各样语言中的那一个固有数据类型及其操作。

Redis近期提供四种数据类型:string,list,setzset(sorted
set)和Hash

  • string是最简单易行的种类,你可以知道成与Memcached一模一个的序列,一个key对应一个value,其上匡助的操作与Memcached的操作看似。但它的机能更丰裕。
  • list是一个链表结构,主要成效是push、pop、获取一个范围的所有值等等。操作中key领悟为链表的名字。
  • set是汇集,和我们数学中的集合概念一般,对聚集的操作有添加删除元素,有对三个集合求交并差等操作。操作中key领会为汇集的名字。
  • zset是set的一个升任版本,他在set的底子上加码了一个逐项属性,这一特性在增进修改元素的时候可以指定,每趟指定后,zset会自行重新按新的值调整顺序。可以知道了有两列的mysql表,一列存value,一列存顺序。操作中key精晓为zset的名字。
  • Hash数据类型允许用户用Redis存储对象类型,Hash数据类型的一个重中之重亮点是,当您存储的数目对象唯有很少多少个key值时,数据存储的内存消耗会很小.更加多关于Hash数据类型的辨证请见: http://code.google.com/p/redis/wiki/Hashes

3)Redis数据存储

Redis的囤积分为内存存储、磁盘存储和log文件三局地,配置文件中有几个参数对其开展布局。

save seconds
updates
save布置,建议在多久内,有微微次创新操作,就将数据同步到数据文件。这几个可以八个条件协作,比如默许配置文件中的设置,就设置了多少个尺码。

appendonly
yes
/no appendonly陈设,提议是否在每一趟换代操作后开展日志记录,若是不打开,可能会在断电时造成一段时间内的多寡丢失。因为redis本身同步数据文件是按上面的save条件来一头的,所以有的数据会在一段时间内只存在于内存中。

appendfsync
no
/always/everysec appendfsync配置,no代表等操作系统举办数据缓存同步到磁盘,always意味着每一遍换代操作后手动调用fsync()将数据写到磁盘,everysec代表每秒同步四回。

 

4)Redis的安装

Redis可以在不一致的平台运行,但是自己根本依据Windows进行付出工作,所以上边主如果基于Windows平台举行介绍。

Redis能够安装以DOS窗口启动的,也得以设置为Windows服务的,一般为了便于,大家更乐于把它安装为Windows服务,那样可以比较方便管理。下载地址:https://github.com/MSOpenTech/redis/releases下载,安装为Windows服务即可。

时下得以下载到最新的Windows安装版本为3.0,安装后作为Windows服务运作,安装后得以在系统的劳务之中看到Redis的劳务在运转了,如下图所示。

C# 1

安装好Redis后,还有一个Redis伴侣Redis Desktop
Manager必要设置,那样可以实时查看Redis缓存里面有啥样数据,具体地址如下:http://redisdesktop.com/download

下载属于自己平台的本子即可

C# 2

下载安装后,打开运行界面,倘使大家往里面添加键值的数额,那么可以看来里边的多少了。

C# 3

 

在前方介绍了三篇有关MongoDB数据库的费用使用小说,严刻来讲这么些不可以归类于MongoDB数据库开发,不过Redis又拥有和MongoDB数据库非凡仔细的关联,它们两者很相近,Redis紧如若内存中的NoSQL数据库,用来增强性能的;MongoDB数据库则是文本中的NoSQL数据库,做多少种类号存储使用的,它们两者关系密切又有所不相同。本篇主要介绍Redis的设置及使用,为前边Redis和MongoDB数据库的一块儿利用先铺下基础。

2、Redis的C#使用

Redis近日提供四种数据类型:string,list,setzset(sorted
set)和Hash。因而它在C#中间也有对应的包裹处理,而且有成百上千人对他开展了包装,提供了成百上千的响应开发包,具体可以访问http://redis.io/clients#c
进行询问。一般提出用瑟维斯(Service)Stack.Redis的包装驱动相比好,具体的运用可以参见https://github.com/ServiceStack/ServiceStack.Redis

大家开发C#代码的时候,能够在NuGet程序包上面举办添加对应的瑟维斯(Service)Stack.Redis引用,如下所示。

C# 4

 

在弹出的NuGet程序包里面,输入瑟维斯(Service)Stack.Redis举行检索,并丰硕上面的驱动引用即可。

C# 5

如此那般会在品种引用里面添加了多少个照应的程序集,如下所示。

C# 6

在C#其中使用Redis,首先须要实例化一个Redis的客户端类,如下所示。

        //创建一个Redis的客户端类
        RedisClient client = new RedisClient("127.0.0.1", 6379);

在动用前,我们须求清空所有的键值存储,使用FushAll方法即可,如下所示

            //Redis FlushAll 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。 
            client.FlushAll();

基于地方的驱动,可以为分化门类的处理编写一些演示代码,下边代码是摘录网上的案例进行介绍。

            #region string类型的测试代码

            client.Add<string>("StringValueTime", "带有有效期的字符串", DateTime.Now.AddMilliseconds(10000));

            while (true)
            {
                if (client.ContainsKey("StringValueTime"))
                {
                    Console.WriteLine("String.键:StringValue, 值:{0} {1}", client.Get<string>("StringValueTime"), DateTime.Now);
                    Thread.Sleep(10000);
                }
                else
                {
                    Console.WriteLine("键:StringValue, 值:已过期 {0}", DateTime.Now);
                    break;
                }
            }

            client.Add<string>("StringValue", " String和Memcached操作方法差不多");
            Console.WriteLine("数据类型为:String.键:StringValue, 值:{0}", client.Get<string>("StringValue"));

            Student stud = new Student() { id = "1001", name = "李四" };
            client.Add<Student>("StringEntity", stud);
            Student Get_stud = client.Get<Student>("StringEntity");
            Console.WriteLine("数据类型为:String.键:StringEntity, 值:{0} {1}", Get_stud.id, Get_stud.name);
            #endregion

            #region Hash类型的测试代码

            client.SetEntryInHash("HashID", "Name", "张三");
            client.SetEntryInHash("HashID", "Age", "24");
            client.SetEntryInHash("HashID", "Sex", "男");
            client.SetEntryInHash("HashID", "Address", "上海市XX号XX室");

            List<string> HaskKey = client.GetHashKeys("HashID");
            foreach (string key in HaskKey)
            {
                Console.WriteLine("HashID--Key:{0}", key);
            }

            List<string> HaskValue = client.GetHashValues("HashID");
            foreach (string value in HaskValue)
            {
                Console.WriteLine("HashID--Value:{0}", value);
            }

            List<string> AllKey = client.GetAllKeys(); //获取所有的key。
            foreach (string Key in AllKey)
            {
                Console.WriteLine("AllKey--Key:{0}", Key);
            }
            #endregion

            #region List类型的测试代码
            /*
             * list是一个链表结构,主要功能是push,pop,获取一个范围的所有的值等,操作中key理解为链表名字。 
             * Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,
             * 这样list既可以作为栈,又可以作为队列。Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,
             * Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构 
             */
            client.EnqueueItemOnList("QueueListId", "1.张三");  //入队
            client.EnqueueItemOnList("QueueListId", "2.张四");
            client.EnqueueItemOnList("QueueListId", "3.王五");
            client.EnqueueItemOnList("QueueListId", "4.王麻子");
            long q = client.GetListCount("QueueListId");

            Console.WriteLine(client.GetItemFromList("QueueListId", 0));
            for (int i = 0; i < q; i++)
            {
                Console.WriteLine("QueueListId出队值:{0}", client.DequeueItemFromList("QueueListId"));   //出队(队列先进先出)
            }

            q = client.GetListCount("QueueListId");
            Console.WriteLine(q);

            client.PushItemToList("StackListId", "1.张三");  //入栈
            client.PushItemToList("StackListId", "2.张四");
            client.PushItemToList("StackListId", "3.王五");
            client.PushItemToList("StackListId", "4.王麻子");
            long p = client.GetListCount("StackListId");
            for (int i = 0; i < p; i++)
            {
                Console.WriteLine("StackListId出栈值:{0}", client.PopItemFromList("StackListId"));   //出栈(栈先进后出)
            }
            q = client.GetListCount("StackListId");
            Console.WriteLine(q);

            #endregion

            #region Set无序集合的测试代码
            /*
             它是string类型的无序集合。set是通过hash table实现的,添加,删除和查找,对集合我们可以取并集,交集,差集
             */
            client.AddItemToSet("Set1001", "小A");
            client.AddItemToSet("Set1001", "小B");
            client.AddItemToSet("Set1001", "小C");
            client.AddItemToSet("Set1001", "小D");
            HashSet<string> hastsetA = client.GetAllItemsFromSet("Set1001");
            foreach (string item in hastsetA)
            {
                Console.WriteLine("Set无序集合ValueA:{0}", item); //出来的结果是无须的
            }

            client.AddItemToSet("Set1002", "小K");
            client.AddItemToSet("Set1002", "小C");
            client.AddItemToSet("Set1002", "小A");
            client.AddItemToSet("Set1002", "小J");
            HashSet<string> hastsetB = client.GetAllItemsFromSet("Set1002");
            foreach (string item in hastsetB)
            {
                Console.WriteLine("Set无序集合ValueB:{0}", item); //出来的结果是无须的
            }

            HashSet<string> hashUnion = client.GetUnionFromSets(new string[] { "Set1001", "Set1002" });
            foreach (string item in hashUnion)
            {
                Console.WriteLine("求Set1001和Set1002的并集:{0}", item); //并集
            }

            HashSet<string> hashG = client.GetIntersectFromSets(new string[] { "Set1001", "Set1002" });
            foreach (string item in hashG)
            {
                Console.WriteLine("求Set1001和Set1002的交集:{0}", item);  //交集
            }

            HashSet<string> hashD = client.GetDifferencesFromSet("Set1001", new string[] { "Set1002" });  //[返回存在于第一个集合,但是不存在于其他集合的数据。差集]
            foreach (string item in hashD)
            {
                Console.WriteLine("求Set1001和Set1002的差集:{0}", item);  //差集
            }

            #endregion

            #region  SetSorted 有序集合的测试代码
            /*
             sorted set 是set的一个升级版本,它在set的基础上增加了一个顺序的属性,这一属性在添加修改.元素的时候可以指定,
             * 每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序。可以理解为有列的表,一列存 value,一列存顺序。操作中key理解为zset的名字.
             */
            client.AddItemToSortedSet("SetSorted1001", "1.刘仔");
            client.AddItemToSortedSet("SetSorted1001", "2.星仔");
            client.AddItemToSortedSet("SetSorted1001", "3.猪仔");
            List<string> listSetSorted = client.GetAllItemsFromSortedSet("SetSorted1001");
            foreach (string item in listSetSorted)
            {
                Console.WriteLine("SetSorted有序集合{0}", item);
            }
            #endregion

对于现实项目的类对象,也可以行使As方法开展更换为相应的拍卖对象举行处理,如下所示

IRedisTypedClient<Phone> phones = client.As<Phone>();

切切实实的测试代码如下所示。

        /// <summary>
        /// Redis对对象类的处理例子
        /// </summary>
        private void btnTypeValue_Click(object sender, EventArgs e)
        {
            IRedisTypedClient<Phone> phones = client.As<Phone>();
            Phone phoneFive = phones.GetValue("5");
            if (phoneFive == null)
            {
                Thread.Sleep(50);
                phoneFive = new Phone
                {
                    Id = 5,
                    Manufacturer = "Apple",
                    Model = "xxxxx",
                    Owner = new Person
                    {
                        Id = 1,
                        Age = 100,
                        Name = "伍华聪",
                        Profession = "计算机",
                        Surname = "wuhuacong"
                    }
                };

                phones.SetEntry(phoneFive.Id.ToString(), phoneFive);
            }

            client.Store<Phone>(
                new Phone
                {
                    Id = 2,
                    Manufacturer = "LG",
                    Model = "test-xxx",
                    Owner = new Person
                    {
                        Id = 2,
                        Age = 40,
                        Name = "test",
                        Profession = "teacher",
                        Surname = "wuhuacong"
                    }
                });

            var message = "Phone model is " + phoneFive.Manufacturer + ",";
            message += "Phone Owner Name is: " + phoneFive.Owner.Name;
            Console.WriteLine(message);
        }

上述就是关于Redis的安装以及简单的事例使用验证,在实际中,大家得以选取Redis的高性能特点,来构建我们的缓存数据,并且可以动用Redis和MongoDB数据库的周详衔接,可以组成一起做的更好,为相关的后台提供更便捷的多寡处理操作,毕竟在互联网的大环境下,性能是那些关键的。

 

相关文章