简介

  已经有了membercache和各种数据库,redis为什么会产生?redis纯粹为应用而产生,它是一个高性能的key-value数据库。redis的出现,很大程序补偿了memcached这类key-value存储的不足,解决了断电后数据库完全丢失的情况;在部分场合可以对关系数据库起到很好的补偿作用。性能测试结果表示set操作每秒钟可达110000,get操作每秒81000次(当然不同的服务器配置性能不同)。

  redis是一种面向”键-值”对类型数据的分布式nosql数据库系统,特点是高性能,持久存储,适应高并发的应用场景。和memcache类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的,支持各种不同方式的排序。redis与memcache一样,为了保证效率,数据都是缓存在内存中,区别的是redis会周期性的把更新的数据写入磁盘或者修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  redis目前提供四种数据类型:string、list、set、zset

  redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。

    1、save seconds updates:指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。

    2、appendonly yes/no:是否在每次更新操作后进行日志记录。如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身数据同步文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在内存中。

    3、appendfsync no/always/everysec:数据缓存同步至磁盘的方式。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。

 安装及使用

下载地址:https://github.com/microsoftarchive/redis/releases

百度云盘:

链接:https://pan.baidu.com/s/1obktyq5hrcyovgwkqanffq
提取码:d3yo

第一步:下载后解压本地磁盘上(注:目录不能包括中文)

 

第二步: 定位到解压redis目录下(cmd)

1 1、redis-server.exe        redis服务器的daemon启动程序
2 2、redis.windows.conf        redis配置文件
3 3、redis-cli.exe        redis命令行操作工具
4 4、redis-check-dump.exe        本地数据库检查
5 5、redis-check-aof.exe        更新日志检查
6 6、redis-benchmark.exe        性能测试,用于模拟同时由n个客户端发送m个 sets/gets查询(类似于apache ab工具)

 第三步:启动服务

  我们也可以启动前配置下redis,详细配置请看:https://www.runoob.com/redis/redis-conf.html(配置文件:redis.windows.conf)

  这里为了演示,直接用默认配置启动即可

 

 配置文件参数

 

 

 

 

 

 

 

 

 

 

 

启动方式2

 启动方式3(以window服务方式)

 1 安装(redis-install.bat)
 2 echo install redis-server
 3 d:\redis\redis-server.exe --service-install d:\redis\redis.windows.conf --loglevel verbose  
 4 
 5 
 6 卸载(redis-uninstall.bat)
 7 echo uninstall redis-server
 8 d:\redis\redis-server.exe --service-uninstall 
 9 
10 启动(start-redis.bat)
11 echo start redis-server 
12 d:\redis\redis-server.exe d:\redis\redis.windows.conf 
1 格式:redis-server --service-install redis.windows.conf

 第四步:连接redis

 连上!!

 第五步:set/get

以下c#控制台代码演示

第一步:nuget下载dll类库

 注:安装最新版本的,项目框架应用高版本的,低版本的框架,可能不兼容高版本redis

 不会下载的朋友,请到我百度云盘下载:

链接:https://pan.baidu.com/s/1-wzv0tnoxhi6xmkhv_90gw
提取码:e9at

第二步:引入类库

 第三步:引入命名空间

1 using servicestack.redis;

第四步:实现(控制台)

  1 using servicestack.redis;
2 using system;
3 using system.collections.generic;
4 using system.linq;
5 using system.text;
6 using system.threading;
7 
8 namespace redisdemo
9 {
10     class program
11     {
12         static void main(string[] args)
13         {
14             //在redis中存储常用的5种数据类型:string,hash,list,setsorted set
15 
16             redisclient client = new redisclient("192.168.1.102", 6379);
17             
18             client.flushall();
19 
20             //-----string开始----------
21             client.add<string>("stringvaluetime", "我已设置过期时间噢30秒后会消失", datetime.now.addmilliseconds(30000));
22             while (true)
23             {
24                 if (client.containskey("stringvaluetime"))
25                 {
26                     console.writeline("string.键:stringvalue,值:{0} {1}", client.get<string>("stringvaluetime"), datetime.now);
27                     thread.sleep(10000);
28                 }
29                 else
30                 {
31                     console.writeline("键:stringvalue,值:我已过期 {0}", datetime.now);
32                     break;
33                 }
34             }
35 
36             client.add<string>("stringvalue", " string和memcached操作方法差不多");
37             console.writeline("数据类型为:string.键:stringvalue,值:{0}", client.get<string>("stringvalue"));
38 
39             student stud = new student() { id = "1001", name = "李四" };
40             client.add<student>("stringentity", stud);
41             student get_stud = client.get<student>("stringentity");
42             console.writeline("数据类型为:string.键:stringentity,值:{0} {1}", get_stud.id, get_stud.name);
43             //-----string结束----------
44 
45             //---------hash开始---------------
46             client.setentryinhash("hashid", "name", "张三");
47             client.setentryinhash("hashid", "age", "24");
48             client.setentryinhash("hashid", "sex", "男");
49             client.setentryinhash("hashid", "address", "上海市xx号xx室");
50 
51             list<string> haskkey = client.gethashkeys("hashid");
52             foreach (string key in haskkey)
53             {
54                 console.writeline("hashid--key:{0}", key);
55             }
56 
57             list<string> haskvalue = client.gethashvalues("hashid");
58             foreach (string value in haskvalue)
59             {
60                 console.writeline("hashid--value:{0}", value);
61             }
62 
63             list<string> allkey = client.getallkeys(); //获取所有的key。
64             foreach (string key in allkey)
65             {
66                 console.writeline("allkey--key:{0}", key);
67             }
68             //---------hash结束---------------
69 
70             //-----------list开始--------------
71             /*
72              * list是一个链表结构,主要功能是push,pop,获取一个范围的所有的值等,操作中key理解为链表名字。 
73              * redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,
74              * 这样list既可以作为栈,又可以作为队列。redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,
75              * redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构 
76              */
77             client.enqueueitemonlist("queuelistid", "1.张三");  //入队
78             client.enqueueitemonlist("queuelistid", "2.张四");
79             client.enqueueitemonlist("queuelistid", "3.王五");
80             client.enqueueitemonlist("queuelistid", "4.王麻子");
81             long q = client.getlistcount("queuelistid");
82             for (int i = 0; i < q; i++)
83             {
84                 console.writeline("queuelistid出队值:{0}", client.dequeueitemfromlist("queuelistid"));   //出队(队列先进先出)
85             }
86 
87             client.pushitemtolist("stacklistid", "1.张三");  //入栈
88             client.pushitemtolist("stacklistid", "2.张四");
89             client.pushitemtolist("stacklistid", "3.王五");
90             client.pushitemtolist("stacklistid", "4.王麻子");
91             long p = client.getlistcount("stacklistid");
92             for (int i = 0; i < p; i++)
93             {
94                 console.writeline("stacklistid出栈值:{0}", client.popitemfromlist("stacklistid"));   //出栈(栈先进后出)
95             }
96             //-----------list结束--------------
97 
98             //----------set无序集合开始------------
99             /*
100              它是string类型的无序集合。set是通过hash table实现的,添加,删除和查找,对集合我们可以取并集,交集,差集
101              */
102             client.additemtoset("set1001", "小a");
103             client.additemtoset("set1001", "小b");
104             client.additemtoset("set1001", "小c");
105             client.additemtoset("set1001", "小d");
106             hashset<string> hastseta = client.getallitemsfromset("set1001");
107             foreach (string item in hastseta)
108             {
109                 console.writeline("set无序集合valuea:{0}", item); //出来的结果是无须的
110             }
111 
112             client.additemtoset("set1002", "小k");
113             client.additemtoset("set1002", "小c");
114             client.additemtoset("set1002", "小a");
115             client.additemtoset("set1002", "小j");
116             hashset<string> hastsetb = client.getallitemsfromset("set1002");
117             foreach (string item in hastsetb)
118             {
119                 console.writeline("set无序集合valueb:{0}", item); //出来的结果是无须的
120             }
121 
122             hashset<string> hashunion = client.getunionfromsets(new string[] { "set1001", "set1002" });
123             foreach (string item in hashunion)
124             {
125                 console.writeline("求set1001和set1002的并集:{0}", item); //并集
126             }
127 
128             hashset<string> hashg = client.getintersectfromsets(new string[] { "set1001", "set1002" });
129             foreach (string item in hashg)
130             {
131                 console.writeline("求set1001和set1002的交集:{0}", item);  //交集
132             }
133 
134             hashset<string> hashd = client.getdifferencesfromset("set1001", new string[] { "set1002" });  //[返回存在于第一个集合,但是不存在于其他集合的数据。差集]
135             foreach (string item in hashd)
136             {
137                 console.writeline("求set1001和set1002的差集:{0}", item);  //差集
138             }
139             //----------set无序集合开始------------
140 
141             //--------setsorted 有序集合开始-------
142             /*
143              sorted set 是set的一个升级版本,它在set的基础上增加了一个顺序的属性,这一属性在添加修改.元素的时候可以指定,
144              * 每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序。可以理解为有列的表,一列存 value,一列存顺序。操作中key理解为zset的名字.
145              */
146             client.additemtosortedset("setsorted1001", "1.刘仔");
147             client.additemtosortedset("setsorted1001", "2.星仔");
148             client.additemtosortedset("setsorted1001", "3.猪仔");
149             list<string> listsetsorted = client.getallitemsfromsortedset("setsorted1001");
150             foreach (string item in listsetsorted)
151             {
152                 console.writeline("setsorted有序集合{0}", item);
153             }
154             //--------setsorted 有序集合开始-------
155             console.readkey();
156         }
157         public class student
158         {
159             public string id { get; set; }
160             public string name { get; set; }
161         }
162     }
163 }

 项目源码:

链接:https://pan.baidu.com/s/1lmngrrhqkzbhxem3kdfzwa
提取码:tbkc

觉得对你有帮助的话,帮忙推荐下,有不懂的地方,欢迎下方留言!!