第十八阶段redis技术教案_第1页
第十八阶段redis技术教案_第2页
第十八阶段redis技术教案_第3页
第十八阶段redis技术教案_第4页
第十八阶段redis技术教案_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Redis介NoSQL,泛指非关系型的数据库,NoSQLNot-OnlySQL,它可以作为关系型数据库的良好Nosql典型应用:内容缓存,主要用于处理大量数据的高负载。数据模型:一系列键值对劣势:的数据缺少结构列数据,典型应用:Web应用(Key-Value类似,Value是结构化的)数据模型:一系列键值对RedisC语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的需求,目前为止Redis支持的键值数据类型如有序集合类型redis2008年,意大利的一家Merzia推出了一款基于MySQL的实时统计系统LLOOGGSalvatoreSanfilippoMySQL的性能感到失望,LLOOGG2009年开发完成,这个数据库就是RedisSalvatoreSanfilippoRedisLLOOGG这一款产品,而是希望更SalvatoreSanfilippoRedisRedis的另一名主要的代码贡献者PieterNoordhuisRedis的开发,直到今天。RedisHackerNews在2012年发布了一份数据库的使用情况,结果显示有近12%的公司在使用Redis。国内如、街旁网、知乎网,国外如、StackOverflow、Flickr等都是Redis的用户。redis缓存(数据查询、短连接、内容、商品内容等等(最多使用)session分离。聊天室的好友列表(秒杀、抢购、12306等等)应用榜。Redis安装配Redis官网地址:RedisRedis是C语言开发,建议在linux上运行,本使用Centos6.4作为安装[root@linux02redis-3.0.0]#yuminstallgcc-Linuxgcc[root@linux02redis-3.0.0]#yuminstallgcc-第三步:将的Redis源码包上传到Linux服务器>->-"[root@linux02~]#tar[root@linux02~]#tar-zxfredis-[root@linux02~]#cd[root@linux02~]#cdredis-Redis[root@linux02/]#cd/root/redis-[root@linux02/]#cd/root/redis-[root@redis01bin2]#vim[root@redis01bin2]#vimRedis客户Redis[root@localhost-0723[root@localhost-0723bin]#./redis-cli-h-p-h:redisip-p:redis图形界面客户端(了解[root@redis01bin]#vim连接redis服务,需要关闭或者修改配[root@redis01bin]#vim在命令模式下,选定要的那一行的末尾,然后点击键盘yyp,就完成,然后修改 iptablesACCEPT:filter [确定切换数据库使用命令:select数据库编号例如:select1JavajedisRedisjava、C、C#、C++、php、Node.js、Go等。方推荐使用Jedis和Redisson。在企业中用的最多的就是Jedis下面我们就重点学习下Jedis。Jedis同样也是托管在上,地址: jarpublicvoidtestJedis()//创建一个Jedis的连Jedisjedis=newJedis("",//执行redis命jedis.set("mytest", oworld,thisis//redisStringresult=//关闭连}publicvoidtestJedisPool()//创建一连接池对JedisPooljedisPool=newJedisPool("",//从连接池中获得Jedisjedis=jedisPool.getResource();Stringresult=jedis.get("mytest");}spring的jar<?xmlversion="1.0"encoding=<?xmlversion="1.0"encoding="UTF-<beans"""""连接池配置<beanid="jedisPoolConfig"最大连接数<propertyname="maxTotal"value="30"最大空闲连接数<propertyname="maxIdle"value="10"每次释放连接的最大数目<propertyname="numTestsPerEvictionRun"value="1024"释放连接的扫描间隔(毫秒)<propertyname="timeBetweenEvictionRunsMillis"value="30000"连接最小空闲时间<propertyname="minEvictableIdleTimeMillis" "连接空闲多久后释放当空闲时间>闲连接>最大空闲连接数直接释放<property<propertyname="softMinEvictableIdleTimeMillis"value="10000"<!--获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1<propertyname="maxWaitMillis"value="1500"在获取连接的时候检查有效性默认false<propertyname="testOnBorrow"value="false"在空闲时检查有效性默认false<propertyname="testWhileIdle"value="true"连接耗尽时是否阻塞false报异常,ture阻塞直到超时默认true<propertyname="blockWhenExhausted"value="false"redis<beanid="jedisPool"class="redis.<constructor-argname="poolConfig"ref="jedisPoolConfig"<constructor-argname="host"value="30"<constructor-argname="port"value="6379"publicvoidtestJedisPool()JedisPoolpool=(JedisPool)applicationContext.getBean("jedisPool");Jedisjedis=null;tryjedis=jedis.set("name","lisi");Stringname=jedis.get("name");}catch(Exceptionex){}finallyif(jedis!=null)关闭连}}}Redis数据类Redis中数据是通过key-value的,对于value的类型有以下几种Hash在redis中令语句中,命令是忽略大小写的,而key是不忽略大小写的String赋:6379>settest:6379>settest123取:6379>get:6379>get设置/语法MSETkeyvalue[keyvalue…]MGETkey[key…]:6379>:6379>msetk1v1k2v2k3:6379>:6379>getk1:6379>mgetk1:6379>getsets2:6379>getsets2:6379>get删:6379>del:6379>del数值增当的字符串是整数时,Redis提供了一个实用令INCR,其作用是让当前键值递:6379>incr:6379>incr:6379>incr:6379>incr语法:INCRBYkey:6379>:6379>incrbynum:6379>incrbynum:6379>incrbynum:6379>decr:6379>decr:6379>decr:6379>decr:6379>decr:6379>decr:6379>decrbynum:6379>decrbynum其它命令(向尾部追加APPENDvaluevalue,即相当于SETkeyvalue。返回值是追加后字符串的总长度。:6379>setstro:6379>:6379>setstro:6379>appendstr"world!"(integer)12:6379>get"o:6379>strlen(integer):6379>strlen(integer):6379>setstr :6379>strlen(integer)自增主string的递增数字特性生成。key:items:idHashstring假设有User对象以JSON序列化的形式到Redis中,User对象有id,username、password、age、name等属性,的过程如下:agehash可以很好的解决这个问题。redishash赋HSETHSET1,当执行更新操0。语法:HSETkeyfieldvalue:6379>:6379>hsetuserusername(integer)一次可以设置多个字段:6379>hmsetuserage20username语法::6379>hmsetuserage20username:6379>hsetnxuserage30 如果user中没有age字:6379>hsetnxuserage30 如果user中没有age字段则age值为30,否则(integer)取语法:HGETkeyfield:6379>:6379>hgetuserusername语法:HMGETkeyfieldfield:6379>:6379>hmgetuserage1)2)语法:HGETALLkey删除字:6379>hdeluserage(integer)1:6379>hdeluserage(integer)1:6379>hdeluseragename(integer)0:6379>hdeluserage(integer)增加数:6379>hincrbyuserage 将用:6379>hincrbyuserage 将用户 加(integer):6379hgetuser 获取用户其它命令(判断字段是否存:6379>hexistsuser(integer):6379>hexistsuser(integer)查看user中是否有age字:6379hexistsuser 查看user中是否有name字(integer)语法:6379>hmsetuserage:6379>hmsetuserage20namelisi1)2)获取字段数:6379>hlen(integer):6379>hlen(integer)商品信1001Rediskey:7003>HMSET:7003>HMSETitems:1001id3nameappleprice:7003>:7003>HGETitems:1001idListLinkedList使用双向链表方式数据,每个元素都记录前后元素的指针,所以插入、redislist向列表左边增加元:6379>lpushlist:112(integer):6379>lpushlist:112(integer)向列表右边增加元:6379>rpushlist:145:6379>rpushlist:145(integer)查看列LRANGE命令是列表类型最常用令之一,获取列表中的某一片段,将返回start、stop之-:6379>lrangelist:101):6379>lrangelist:101)2)3)LPOP命令从列表左边弹出一个元素,会分两步完成:语法LPOPkeyRPOP:6379>:6379>lpop:6379>rpop:6379>llen(integer):6379>llen(integer)其它命令(count>0LREMcount<0LREMcount=0LREMvalue语法:LREMkeycount获得/语法:LINDEXkeyindex:6379>:6379>lindexl:list语法:LSETkeyindexvalue:6379>:6379>lsetl:list22:6379>lrangel:list0-1)2)3)4)4)LRANGE:6379>lrangel:list0-1):6379>lrangel:list0-1)2)3)4):6379>ltriml:list02:6379>lrangel:list0-1)2)3)向列表中插入元pivotBEFORE还AFTERvalue插入到该元素的前面还是后面。:6379>lrangelist0-1):6379>lrangelist0-1)2)3):6379>linsertlistafter3:6379>lrangelist0-1)2)3)4)将元素从一个列表转移到另一个列表:6379>rpoplpushlistnewlist:6379>rpoplpushlistnewlist:6379>lrangenewlist0-1):6379>lrangelist0-1)2)3)商品评论列用户发布商品评论,将评论信息转成json到list中用户在页面查询评论列表,从redisjson定义商品评论列表:7001>ment:1001'{"id":1,"name商品不错,很好!!1001:7001>ment:1001'{"id":1,"name商品不错,很好!!SetredissetRedis0(1)。增加/删除元:6379>saddsetab:6379>saddsetabc(integer)3:6379>saddset(integer):6379>sremsetc(integer):6379>sremsetc(integer):6379>sismemberseta(integer)1:6379>:6379>sismemberseta(integer)1:6379>sismembersetA-AB语法:SDIFFkey[key:6379>:6379>saddsetA12(integer):6379>saddsetB23(integer):6379>sdiffsetA1):6379>sdiffsetB1)AAB:6379>sintersetA1):6379>sintersetA1)2)AA或者属于B:6379>sunionsetA1):6379>sunionsetA1)2)3)4)1)1)2)3)从集合出一个元:6379>spop语:6379>spopSortedSetredissortedset增加元:6379>zadd(integer):6379>zadd(integer):6379>zadd(integer):6379>zadd(integer)80zhangsan89lisi9497语法:ZSCOREkey删除元移除有序集key中的一个或多个成员,不存在的成员将被忽略。key存在但不是有序集类型时,返回一个错误。:6379>zrem语法::6379>zrem获得在某个范围的元素列按照元素分数从小到大startstop之间的所有元素(包含两端的元00按照元素分数从大到小startstop之间的所有元素(包含两端的元"lisi""lisi"zhangsan001其它命令(获得指定分数范围的元909770100limit14语4(integer)80(integer)80按照范围删除元(integer)0(integer)0 -11):6379>zadd84:6379>zadd84 80:6379>ZRANK:6379>ZRANK商品销售,Key写入商品销售量:7007>ZADDitems:sellsort9100110:7007>ZADDitems:sellsort9100110:7001>ZRANGEitems:sellsort:7001>ZRANGEitems:sellsort09keyRedis在实际使用过程中的用作缓存,然而缓存的数据一般都是需要设置生存时间的,EXPIREEXPIREkeyTTLkey查看key生于的生存时间PEXPIREkey 生存时间设置单位为:毫:7002>set:7002>settest设置test的值为获取test的:7002EXPIREtest 设置test的生存时间为5(integer)(integer)查看test的生于生成时间1秒删获取test的值,已经删其它命令(redis:6379>keysredis:6379>keys确认一个keyredis:6379>existsHongWan(integer)0redis:6379>existsredis:6379>existsHongWan(integer)0redis:6379>existsage(integer)1redisredis:6379>redis:6379>delage(integer)11)1)redis:6379[1]>renameageage_new1)1)redisredisredis:6379>typeaddrredis:6379>typemyzset2redis:6379>typemylistredisRedis持久化方RDBRDBRedissavesave900save300save60save开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件“save900115分钟(900秒钟)1“save300105分钟(300秒)10#Notethatyou#Notethatyoumustspecifyadirectoryhere,notafiledir#Thefilenamewhere#ThefilenamewheretodumpthedbfilenameRedis启动后会RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构1GB的20~30秒钟。AOFappendonlyappendonly开启AOF持久化后每执行一条会更改Redis中的数据令,Redis就会将该命令写入硬AOF文件。dirAOF文件的保存位置和RDBdirdirRedis的主从什么是主从redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从机制就可以避免这种单点故障,如下图:redis服务也可以继续提供服务。redisredisredis写入数据时通过主从复制机制会到两个从redis服务上。只有一个主redisredis主从不会阻塞master,在同步数据时,master可以继续处 主主Redisredisredis#slaveof<masterip>#slaveof<masterip>redisredisIPRedis集redis-cluster架构细节所有的redis节点彼此互联( 客户端与redis节点直连,不需要中间 redis-cluster把所有的物理节点映射到[0-16383]slot上,clusterRedisRedis16384Rediskey-时,rediskeycrc1616384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等redis-cluster投票:master参与投票,master节点与其中一个master节点通信超过(cluster-node-timeout),master节点挂掉.master挂掉,且当前masterslavefail状态。也可以理解成集群的[0-16383]slotfail状态。Rubyredisredis-trib.rbrubyruby[root@redis01bin]#[root@redis01bin]#yuminstall[root@redis01bin]#yuminstall>-">-"将Redis集群搭建文件到 [root@redis01[root@redis01/]#cd/root/redis-3.0.0/src/[root@redis01src]#ll*.rb-rwxrwxr-x.1rootroot481414月 12015redis-trib.rb[root@redis01src]#cpredis-trib.rb/usr/local/redis0707/-r第一步:创建6个redis实例,需要端[root@localhost-0723[root@localhost-0723redis]#./redis-trib.rbcreate--replicas1:7001 >>>CreatingConnectingtonode:7001:Connectingtonode:7002:OKConnectingtonode:7003:OKConnectingtonode:7004:OKConnectingtonode:7005:OKConnectingtonode:7006:>>>Performinghashslotsallocationon6nodes...Using3masters:Addingreplica:7004toAddingreplica:7005toAddingreplica:7006toM: slots:0-5460(5461slots)M: S:0bc a6e040c6af05be:7005replicates7a12bc730ddc939c84a156f276c446c28acf798creplicates93f73d2424a CanIsettheaboveconfiguration?(type'yes'toaccept):yes>>>Nodesconfiguration>>>Assignadifferentconfigepochtoeach>>>SendingCLUSTERMEETmessagestojointheclusterWaitingfortheclustertojoin....>>>PerformingClusterCheck(usingnodeM: slots:0-5460(5461slots)M: slots:(0slots)M:0bc a6e040c6af05be:7005slots:(0slots)masterslots:slots:(0slots)[OK]Allnodesagreeaboutslots>>>Checkforopen>>>Checkslotscoverage...[OK]All16384slotscovered.[root@localhost-0723redis]#./redis-cli-p7006-c:7006>setkey1123->Redirected[root@localhost-0723redis]#./redis-cli-p7006-c:7006>setkey1123->Redirectedtoslot[9189]locatedat:7002查看集群:7003>cluster:7003>cluster7a12bc730ddc939c84a156f276c446c28acf798c:7002master-01443601739754 c660928b71edd3db881f:7003myself,master-00 :7001master-01443601741267 c660928b71edd3db881f014436017392506014436017422774 节点(7007hash添加完主节点需要对主节点进行hash槽分配,这样该主节才可以数据redis16384个槽,集群中的每个结点分配自已槽,通过查看集群结点可以看到槽占7007输入:500500PS7007clusternodes7007id700870087007命令:./redis-trib.rbadd-nodeslavemaster-ididipip和./redis-trib.rb./redis-trib.rbadd-node--slave--master-id 7007idclusternodes查[ERR]NodeXXXXXXisnotempty.Eitherthe[ERR]NodeXXXXXXisnotempty.Eitherthenodealreadyknowsothernodes(checkCLUSTERNODES)orcontainssomekeyindatabase [ERR]Node:7005isnotempty!ResharddataawayandtryJedis连接集-AINPUT-picmp-j-AINPUT-ilo-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport22-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport8080-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport6379-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport6380-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport7001-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport7002-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport7003-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport7004-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport7005-j-AINPUT-mstate--stateNEW-mtcp-ptcp--dport7006-j-AINPUT-jREJECT--reject-withicmp-host--AFORWARD-jREJECT--reject-withicmp-host-prohibited~"/etc/sysconfig/iptables22L1079C JedisCluster类连接redispublicvoidtestJedisCluster()throwsException//创建一连接,JedisCluster对象,在系统中是单例存在Set<HostAndPort>nodes=newHashSet<>();nodes.add(newHostAndPort("7001));nodes.add(newHostAndPort("",nodes.add(newHostAndPort("",nodes.add(newHostAndPort("",nodes.add(newHostAndPort("",nodes.add(newHostAndPort("",7006));JedisClusternodes.add(newHostAndPort("",7006));JedisClustercluster=new//JedisClusterredis一一对应。cluster.set("cluster-testmyjedisclustertest");Stringresult=cluster.get("cluster-test");//程序结束时需要关闭JedisCluster}连接池连接池配置<beanid="jedisPoolConfig" 最大连接数<propertyname="maxTotal"value="30"最大空闲连接数<propertyname="maxIdle"value="10"每次释放连接的最大数目<propertyname="numTestsPerEvictionRun"value="1024"释放连接的扫描间隔(毫秒)<propertyname="timeBetweenEvictionRunsMillis"value="30000"连接最小空闲时间<propertyname="minEvictableIdleTimeMillis" "连接空闲多久后释放当空闲时间>闲连接>最大空闲连接数直接释放<propertyname="so

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论