Redis的初识
简介
已经有了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
觉得对你有帮助的话,帮忙推荐下,有不懂的地方,欢迎下方留言!!
上一篇: 二维码生成插件qrious
推荐阅读
-
SlickEdit Core添加对Eclipse 3.5的支持
-
PHP生成HTML的技术原理_PHP教程
-
RMAN备份或恢复归档日志时报未找到归档的日志或是目录超出同步的解决办法
-
将MySQL命令行的显示数据提取为文本方法[图文]
-
php通过Chianz.com获取IP地址与地区的方法_PHP
-
判断用户是否使用代理的PHP代码
-
PHP中的Trait 特性及作用_php实例
-
简单的图形计数器需要MYSQL,GD的支持_MySQL
-
PHP编程过程中需要了解的this,self,parent的区别_PHP教程
-
腾讯微博提示missing parameter errorcode 102 错误的解决方法,parametererrorcode