全新java高級架構(gòu)師項目實(shí)戰(zhàn)智能運(yùn)營助手-redis基礎(chǔ)_第1頁
全新java高級架構(gòu)師項目實(shí)戰(zhàn)智能運(yùn)營助手-redis基礎(chǔ)_第2頁
全新java高級架構(gòu)師項目實(shí)戰(zhàn)智能運(yùn)營助手-redis基礎(chǔ)_第3頁
全新java高級架構(gòu)師項目實(shí)戰(zhàn)智能運(yùn)營助手-redis基礎(chǔ)_第4頁
全新java高級架構(gòu)師項目實(shí)戰(zhàn)智能運(yùn)營助手-redis基礎(chǔ)_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余30頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Redis實(shí)Java緩存機(jī)javastaticHashMap存緩存一個p就可以搞定對象的緩存最簡單也最不實(shí)用首要的問題就是保SoftRefernceWekReferencePhantomRference(batisJDKPhantoReference這玩意兒,得惡補(bǔ)基礎(chǔ)啊這三種都是弱,區(qū)別在于強(qiáng)度不同,至于弱概念個人理解就是對象的生命周期與JVM掛鉤,VMOutOfMeorrror異常。OsCacheEhCache區(qū)ehcache主要是對數(shù)據(jù)庫的緩存,相同的查詢語句只需查詢一次數(shù)據(jù)庫,從而提高了查詢的速度,使用spring的AOP可以很容易實(shí)現(xiàn)這能。NoSQL介NoSQLNotOnlySQL的縮寫,意即"SQL"的意思,泛指非關(guān)系型的數(shù)據(jù)庫。強(qiáng)調(diào)Key-ValueStores和文檔數(shù)據(jù)庫的優(yōu)點(diǎn),而不是單純的RDBMS。NoSQL產(chǎn)品Redis、mongodbMembase、RedisMembase區(qū)Redis支持?jǐn)?shù)據(jù)的持久化,可以將數(shù)據(jù)存放在硬盤上Memcache不支持?jǐn)?shù)據(jù)的之久Redissetliset等類Memcache支持簡單數(shù)據(jù)類型,需要客戶端自己處理對Redis簡RedisBSDkey-valueRediskeyvalueRedis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供等數(shù)據(jù)結(jié)構(gòu)的Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份Redis應(yīng)用場主要能夠體現(xiàn)解決數(shù)據(jù)庫的壓力例如:時間有效期、session共享解決方Redis優(yōu)Redis110000次/s,81000次/sRedisStrings,Lists,HashesSetsOrderedSets數(shù)據(jù)類型操作RedisRedis還支持對幾個操作全并后的原子Redispublish/subscribe,通知keyRedis與其他key-value有什么不同Redis可以做很多內(nèi)部復(fù)雜要進(jìn)行隨機(jī)。Redis安windows安裝新建start.bat批處理文件、內(nèi)容:redis- start.bat修改#requirepass 修改為requirepass注意:修改的時候前面不要加空linuxRedis的是:(這里的是Linux版Redis源碼包Redis服務(wù)器端的默認(rèn)端口是6379在windows系統(tǒng)中好Redis的源碼包。通過WinSCP工具將Redis的源碼windows上傳到Linux系統(tǒng)的這/opt/redis(即 下的lamp文件夾)tar-zxfredis- cdredis-2.6.17 (一般來說,解壓 rpm-qgcc查看gcc是否安裝) yum-yinstallgcc(makeclean清除臨時文件。之后,找到出錯的原因,解決問題后再來重新安裝。)進(jìn)入到 cdmake cdmkdir-p/usr/local/redis/binmkdir-p/usr/local/redis/etccd/lamp/redis-2.6.17cp./redis.conf/usr/local/redis/etccdsrccpmkreleasehdr.shredis-benarkredis-check-aofredis-check-dumpredis-cliredis-serverredis-sentinel/usr/local/redis/binlinux6379/etc/sysconfig/iptables文件:vi加入內(nèi)容并保存:-ARH-Firewall-1-INPUTmstatestateNEWmtcpp–dport6379-j查看端口是否開放:/sbin/iptablesL比較重要的3個可執(zhí)行文件redis-server:Redis服務(wù)器程Redis的啟動命/usr/local/redis/bin/redis-或cd./redis-server 為redis-server指定配置redis.conf文daemonizeyes---修改為yes requirepass123456----注釋取消掉設(shè)置賬號psaux|grep'6379' ---查詢端口kill159886---kill99886---serviceiptablesstop停止redis命令連接方./redis-cli-h-p6379-a"123456" ---redis使用賬號連接結(jié)果表示成功redis-clishutdownkillredis關(guān)Redis客戶端連接方Redis的基本數(shù)據(jù)類字符串類型 redis:6379>SETmykey"redis"redis:6379>GET在上面的例子中,SET和GET是redis中令,而mykey是鍵的名稱RedisRedisRedis字符串命令的redis:6379>COMMAND SS示redisredis:6379>SETmykey"redis"redis:6379>GETS在上面的例子中,SETGETredis令,而mykeyRedis編命描述說1SETkey2GET3GETRANGEkeystart獲取在鍵上的字符串的子字符串編命描述說4GETSETkey5GETBITkey返回在鍵處的字符串值中偏移處的位值6MGETkey17SETBITkeyoffset8SETEXkeyseconds9SETNXkeySETRANGEkeyoffsetSTRLEN獲取在鍵中的值的長MSETkeyvalue[keyvalueMSETNXkeyvalue[keyvaluePSETEXkeymillisecondsINCRINCRBYkeyINCRBYFLOATkeyDECRDECRBYkeyAPPENDkey列表類型Redis(左邊)一個列表最多可以包含232-1個元素 ,每個列表超過40億個元素)redisredis:6379>LPUSHrunoobkeyredis:6379>LPUSHrunoobkeyredis:6379>LPUSHrunoobkeyredis:6379>LRANGErunoobkey0Redis命令1BLPOPkey1[key2]2BRPOPkey1[key2]3BRPOPLPUSHsourcedestination從列表出一個值,將彈出的元素插入到另外一個列表中并返回它;如果列表沒有元素會阻塞列表直到等4LINDEXkey5LINSERTkeyBEFORE|AFTERpivot6LLEN7LPOP8LPUSHkeyvalue19LPUSHXkeyLRANGEkeystartLREMkeycountLSETkeyindexLTRIMkeystartRPOPRPOPLPUSHsourceRPUSHkeyvalue1RPUSHXkeyRedis集合Redis中集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。集合中最大的成員數(shù)為232-1( ,每個集合可40多億個成員)。redis:6379>redis:6379>SADDrunoobkeyredis:6379>SADDrunoobkeyredis:6379>SADDrunoobkeyredis:6379>SADDrunoobkeyredis:6379>SMEMBERSSADDrunoobkeyRedis集合命Redis命令1SADDkeymember12SCARD3SDIFFkey14SDIFFSTOREdestinationkey1返回給定所有集合的差集并在destination5SINTERkey16SINTERSTOREdestinationkey1返回給定所有集合的交集并在destination7SISMEMBERkeymemberkey8SMEMBERS9SMOVEsourcedestinationmembersourcedestinationSPOPSRANDMEMBERkeySREMkeymember1SUNIONkey1SUNIONSTOREdestinationkey1所有給定集合的并集在destination集合SSCANkeycursor[MATCHpattern][COUNTRedis有序集合(sortedRedis有序集合和集合一樣也是string類型元素的集合,doubleredis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行232-1 ,每個集合可40多億個成員)實(shí)redisredis:6379>ZADDrunoobkey1redis:6379>ZADDrunoobkey2redis:6379>ZADDrunoobkey3redis:6379>ZADDrunoobkey3redis:6379>ZADDrunoobkey4redis:6379>ZRANGErunoobkey010ZADDredisRedis有序集合命redis有序集合的基本命令命令1ZADDkeyscore1member1[score22ZCARD3ZCOUNTkeymin4ZINCRBYkeyincrement5ZINTERSTOREdestinationnumkeyskey[key計算給定的一個或多個有序集的交集并將結(jié)果集在新的有序集合key6ZLEXCOUNTkeymin7ZRANGEkeystartstop8ZRANGEBYLEXkeyminmax[LIMIToffset9ZRANGEBYSCOREkeyminmax[WITHSCORES]ZRANKkeyZREMkeymember[memberZREMRANGEBYLEXkeyminZREMRANGEBYRANKkeystart移除有序集合中給定的區(qū)間的所有成ZREMRANGEBYSCOREkeyminZREVRANGEkeystartstopZREVRANGEBYSCOREkeymaxminZREVRANKkeyZSCOREkeyZUNIONSTOREdestinationnumkeyskey[key計算給定的一個或多個有序集的并集,并在新的keyZSCANkeycursor[MATCHpattern][COUNTRedis哈希Redishash是一個string類型的field和value的映射表,hash特別適合用于對象Redis中每個hash可以232-1鍵值對(40多億)實(shí):6379>:6379>HMSETrunoobkeyname"redis:6379>HGETALL"redis"redisbasiccommandsforhsetkeymapHeyredis的一些描述信息(namedescriptionlikesvisitors)到哈希表runoobkey中。Redishash命redishash命令1HDELkeyfield22HEXISTSkeykey3HGETkey獲取在哈希表中指定字段的值4key5HINCRBYkeyfieldkeyincrement6HINCRBYFLOATkeyfieldkeyincrement7HKEYS8HLEN9HMGETkeyfield1HMSETkeyfield1value1[field2value2field-value域-值)keyHSETkeyfieldkeyfieldvalueHSETNXkeyfieldfieldHSCANkeycursor[MATCHpattern][COUNTJavaRedis<!--<!--/artifact/redis.clients/jedis--publicclassTestRedis{privateJedispublicvoidsetup()jedisnewJedis("00",6379);}* 字符publicvoidtestString() 添加數(shù)jedis.set("name","xinxin");//向key-->name中放入了value--System.out.println(jedis.get("name"));//執(zhí)行結(jié)果jedis.append("nameismylover拼jedis.del("name");//刪除某個//設(shè)置多個鍵值 jedis.incr("age");//進(jìn)行加1操作System.out.println(jedis.get("name")+"-"+jedis.get("age")+"-"+}*redis操作publicvoidtestMap() 添加數(shù)Map<String,String>map=newHashMap<String,String>();map.put("name","xinxin");map.put("age","22"); //取出user中的name,執(zhí)行結(jié)果:[minxr]-->注意結(jié)果是一個泛型的List<String>rsmap=jedis.hmget("user","name","age","qq");System.out.println(jedis.hmget("user","age"));//因?yàn)閯h除了,所以返回的是System.out.println(jedis.hlen("user"));//返回key為user的鍵中存放的值的個數(shù)System.out.println(jedis.exists("user"));//是否存在key為user的記錄返回System.out.println(jedis.hkeys("user"));//返回map對象中的所有System.out.println(jedis.hvals("user"));//返回map對象中的所有Iterator<String>iter=jedis.hkeys("user").iterator();while(iter.hasNext()){Stringkey=}}*jedis操作publicvoidjedis.del("javaframework");System.out.println(jedis.lrange("javaframework",0,-//先向keyjavaframework中存放三條數(shù)據(jù)jedis.lpush("javaframework","spring");jedis.lpush("javaframework","struts");jedis.lpush("javaframework","hibernate");//再取出所有數(shù)據(jù)jedis.lrange是按范圍取出//第一個是key,第二個是起始位置,第三個是結(jié)束位置,jedis.llen獲取長度-1表示取得所System.out.println(jedis.lrange("javaframework",0,-jedis.del("javaframework");jedis.rpush("javaframework","spring");jedis.rpush("javaframework","struts");jedis.rpush("javaframework","hibernate");System.out.println(jedis.lrange("javaframework",0,-}*jedis操作*jedis操作publicvoid//移除System.out.println(jedis.sismember("user","who"));//判斷who是否是user}publicvoidtest()throwsInterruptedException//jedisSystem.out.println(jedis.lrange("a",0,-1));//[9,3,6,1]System.out.println(jedis.sort("a1,36,9]//System.out.println(jedis.lrange("a",0,-}publicvoidtestRedisPool(){RedisUtil.getJedis().set("newname","中文測試");}SpringBoot集成Maven###Redis(RedisConfiguration)###Redis(RedisConfiguration)Java代publicclassRedisService{privateStringRedisTemplatepublicvoidsetObject(Stringkey,Objectvalue)this.setObject(key,value,}publicpublicvoidsetObject(Stringkey,Objectvalue,Longtime)if(StringUtils.isEmpty(key)||value==null)}if(valueinstanceofString)StringstringValue=(String)if(time==null)stringRedisTemplate.opsForValue().set(key,}else}}if(valueinstanceofList)List<String>listValue=(List<String>)for(Stringstring:listValue){stringRedisTemplate.opsForList().leftPush(key,string);}}}publicvoiddelKey(Stringkey){}publicStringgetString(Stringkey)return}}Redis主從linux克隆虛擬生成新的mack地主從配redis主從1、redis的功能是支持多個數(shù)據(jù)庫之間的數(shù)據(jù)同步。一類是主數(shù)據(jù)庫(master)通過redis的功能可以很好的實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離提高服務(wù)器的負(fù)載能力。主數(shù)據(jù)庫主要進(jìn)行寫操作,而從數(shù)據(jù)庫負(fù)責(zé)讀操作。主從過主從過程:見下過程2:主數(shù)據(jù)庫接收到sync命令后會開始在保存快照(執(zhí)行rdb操作),并將保存期間接收到令緩存起來3:當(dāng)快照完成后,redis會將快照文件和所有緩存令發(fā)送給從數(shù)據(jù)庫4:從數(shù)據(jù)庫收到后,會載入快照文件并執(zhí)行收到的緩存令redisredis.confslaveof30masterauth123456---主redis服務(wù)器配置了,則需要配Redis哨兵機(jī)什么是哨兵機(jī)Redis的哨兵(sentinel)Redis服務(wù)器,該系統(tǒng)執(zhí)行以下三個任務(wù)·(Monitoring):哨兵(sentinel)會不斷地檢查你的Master和Slave是提醒(Notification):當(dāng)被的某個Redis出現(xiàn)問題時,哨兵(sentinel)可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知。自動故障遷移(Automaticfailover):當(dāng)一個Master不能正常工作時哨兵(sentinel)會開始一次自動故障遷移操作,它會將失效Master的其中一個Slave升級為新的Master,并讓失效Master的其他Slave改為新的Master;當(dāng)客戶端試圖連接失效的Master時,集群也會向客戶端返回新Master的地址,使得集群可以使用Master代替失Master。哨兵(sentinel)是一個分布式系統(tǒng),你可以在一個架構(gòu)中運(yùn)行多個哨兵(sentinel)進(jìn)程,這些進(jìn)程使用流言協(xié)議(gossipprotocols)Master是否下線的信息,并使用投票協(xié)議(agreementprotocols)來決定是否執(zhí)行自動故障遷移,以及選擇哪個Slave作為Master.的”認(rèn)為宕機(jī)”SubjectiveDown,簡稱若“哨兵群”中的多數(shù)sentinel,都報告某一master沒響應(yīng),系統(tǒng)才認(rèn)為該master"徹底"(即:客觀上的真正down機(jī),ObjectiveDown,odown),vote算法,slave節(jié)點(diǎn)中,master,然后自動修改相關(guān)配置.雖然哨兵(sentinel)redis-sentinel但實(shí)際上它只是RedisRedis服務(wù)器時通過給定--sentinel選項來啟動哨兵(sentinel).哨兵(sentinel)zookeeper非常類似哨兵模式修改配實(shí)現(xiàn)步驟cp sentinel.confsentinelmonitor 336379 #主節(jié)點(diǎn)名稱IP端次5000sentineldown-after-millisecondsmymastersentinelparallel-syncsmymaster2---./redis-server/usr/local/redis/etc/sentinel.conf--sentinelRedis事Redis事Redis實(shí)中,最后由EXEC命令觸發(fā)事務(wù),一并執(zhí)行事務(wù)中的所有命令:redisredis:6379>MULTIredis:6379>SETbook-name"MasteringC++in21days"redis:6379>GETbook-nameredis:6379>SADDtag"C++""Programming""MasteringSeries"redis:6379>SMEMBERStagredis:6379>"MasteringC++in211)"Mastering2)3)3)Redis事務(wù)命redis命令1234WATCHkey5WATCHkey[key監(jiān)視一個(或多個)key,如果在事務(wù)執(zhí)行之前這個(或這些)key被其令所改動,那么事務(wù)將被打斷Redis持久什么Redis持久Redis持久化,Redis持久化(AOF與RDB兩種模式RDB持久RDB優(yōu)點(diǎn):使用單獨(dú)子進(jìn)程來進(jìn)行持久化,主進(jìn)程不會進(jìn)行任何IO操作,保證redis的缺點(diǎn):RDB是間隔一段時間進(jìn)行持久化,如果持久化之間redis發(fā)生故障,會發(fā)生數(shù)據(jù)redisnmkey被修改RDB操作。這個操作就類Redis的所有數(shù)據(jù),一次快照數(shù)據(jù)。所有這個持久化方法也通常叫做snapshots。RDB默認(rèn)開啟,redis.conf#dbfilename#dbfilename:持久化數(shù) 在本地的文dbfilename下在當(dāng)前dir##snapshot觸發(fā)的時機(jī)##可以通過“save“””來關(guān)閉snapshot功能#save時間,以下分別表示更改了1key時間隔900s進(jìn)行持久key60s進(jìn) save900;更改了10key300s進(jìn)save300save60##當(dāng)snapshot時出現(xiàn)錯誤無法繼續(xù)時,是否阻塞客戶端“變更操作”,“錯誤”可能因?yàn)榇疟P已滿/磁盤故障/OS級別異常stop-writes-on-bgsave-error##是否啟用rdb“yes”“額外的cu消耗”pressionAOF持久Append-onlyfile,將“操作+數(shù)據(jù)”以格式化指令的方式追加到操作日志文件的尾append操作返回后(已經(jīng)寫入到文件或者即將寫入),才進(jìn)行實(shí)際的數(shù)據(jù)變更,“日志文件”保存了歷史所有的操作過程;當(dāng)server需要數(shù)據(jù)恢復(fù)時,可以直接replay此日AOFmysqlbin.logapache.log、zookeepertxn-log簡直異曲同工。AOF文件內(nèi)容是字符串,非常容易閱讀和解析。優(yōu)點(diǎn):可以保持更高的數(shù)據(jù)完整性,如果設(shè)置追加file的時間是1s,如果redis發(fā)生故1sredis-check-aof來進(jìn)行日志修復(fù);AOF文件沒被rewrite之前(文件過大時會對命令進(jìn)行合并重寫),可以刪除其中的某些命令(比如誤操作的flushall)。缺點(diǎn):AOFRDB等),如果server中持續(xù)的大量變更操作,將會導(dǎo)致AOF文件非常的龐大,意味著server失效后,數(shù)據(jù)恢復(fù)的過程將會很長;事實(shí)上,一條數(shù)據(jù)經(jīng)過多次變更,將會產(chǎn)生多條AOF記錄,其實(shí)只要保存當(dāng)前的狀態(tài),歷史的操作記錄是可以拋棄的;因?yàn)锳OF持久化模式還伴生了“AOFrewrite”。AOF的特性決定了它相對比較安全,如果你期望數(shù)據(jù)更少的丟失,那么可以采用AOF模式。如果AOF文件正在被寫入時突然server失效,有可能導(dǎo)致文件的最后一次記錄是不完整,你可以通過手工或者程序的方式去檢測并修正不完整的記錄,以便通過aof文件恢復(fù)能夠正常;同時需要提醒,如果你的redis持久化中有aof,那么在server故障失效后再次啟動前,需要檢測aof文件的完整性。AOF默認(rèn)關(guān)閉,開啟方法,修改配置文件reds.conf:appendonly####aof功能的開關(guān),默認(rèn)為“no”,可以通過“yes”aof##只有在“yes”下,aof重寫/appendonly##aofappendfilename##aof操作中文件同步策略,有三個合法值:alwayseverysecno,appendfsync##aof-rewrite期間,appendfsync是否暫緩文件同步,"no"表示“不暫緩”,“yes”表no-appendfsync-on-rewrite##aof文件rewrite觸發(fā)的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才會觸發(fā)rewrite,默認(rèn)“64mb”,建議“512mb”auto-aof-rewrite-min-size##相對于“上一次”rewriterewriteaof##rewrite之后,redis都會記錄下此時“aof”文件的大小(A)A*(1+p)##rewriteaofaofauto-aof-rewrite-percentageAOF是文件操作,對于變更操作比較密集的server,那么必將造成磁盤IO的負(fù)荷加重;此外linux對文件操作采取了“延遲寫入”,即并非每次write操作都會觸發(fā)實(shí)際磁盤操作,而是進(jìn)入了buffer中,當(dāng)buffer數(shù)據(jù)達(dá)到閥值時觸發(fā)實(shí)際寫入(也有其他時機(jī))linuxbuffer沒有刷新到磁盤,此時物理機(jī)器失效(比如斷電)aof記錄的丟失。通過上述配置文件,可以得知redis提供了3中aof記錄同步選項:操作和阻塞延遲,是IO開支較大。everysecredis推薦的方式。如果遇到物理服務(wù)器故障,有可能導(dǎo)致最近一秒內(nèi)aof記錄丟失(可能為部分丟失)。no:redis并不直接調(diào)用文件同步,而是交給操作系統(tǒng)來處理,操作系統(tǒng)可以根據(jù)buffer通道空閑時間等擇機(jī)觸發(fā)同步;這是一種普通的文件操作方式。性能較好,在物理服務(wù)器故障時,數(shù)據(jù)丟失量會因OS配置有關(guān)。AOF文件會不斷增大,它的大小直接影響“故障恢復(fù)”的時間,而且AOF文件中歷史操作是可以丟棄的。AOFrewrite操作就是“壓縮”AOF文件的過程,當(dāng)然redis并沒有采用“基于原aof文件”來重寫的方式,而是采取了類似snapshot的方式:基于copy-on-writeaofAOFrewrite能夠正確反應(yīng)當(dāng)前內(nèi)存數(shù)據(jù)的狀態(tài),這正是我們所需要的;*rewrite過程中,對于新的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論