㈠ 如何設置redis一秒鍾持久化一次
此外,我還討論過較為常見的基於伺服器的數據存儲,比如MongoDB和CouchDB。每個數據存儲都有其優勢和劣勢,特別是當應用於特定領域時。本期的Java開發2.0關注的是Redis,一種輕量級鍵值對數據存儲。多數NoSQL實現本質上都是鍵值對,但是Redis支持非常豐富的值集,其中包括字元串、列表、集以及散列。因此,Redis通常被稱為數據結構伺服器。Redis也以異常快速而聞名,這使得它成為某一特定類型使用案例的最優選擇。當我們想要了解一種新事物時,將其同熟知的事物進行比較可能會有所幫助,因此,我們將通過對比其與memcached的相似性以開啟Redis探索之旅。接著我們將介紹Redis的主要功能,這些功能可以使其在某些應用場景可以勝過memcached。最後我將向您展示如何將Redis作為一個傳統數據存儲用於模型對象。Redis和memcachedMemcached是一個眾所周知的內存對象緩存系統,通過將目標鍵和值導入內存緩存運行。因此,Memcached能迴避讀取磁碟時發生的I/O成本問題。在Web應用程序和資料庫之間粘貼memcached時會產生更好的讀取性能。因此,對於那些需要快速數據查詢的應用程序,Memcached是一個不錯的選擇。其中的一個例子為股票查詢服務,需要另外訪問資料庫獲取相對靜態數據,如股票名稱或價格信息。MemcacheDB將Redis與memcached相比較並不公平,它與MemcacheDB相比要好的多,MemcacheDB是一個分布式鍵值對存儲系統,專為數據持久化而設計。MemcacheDB與Redis較為相似,其新增優勢可以使其輕松地與memcached實現的客戶端進行通信。但是memcached也有其局限性,其中一個事實就是它所有的值均是簡單的字元串。Redis作為memcached的替代者,支持更加豐富的功能集。一些基準(benchmarks)也表明Redis的速度要比memcached快很多。Redis提供的豐富數據類型使其可以在內存中存儲更為復雜的數據,這是使用memcached無法實現的。同memcached不一樣,Redis可以持久化其數據。Redis解決了一個重大的緩存問題,而其豐富的功能集又為其找到了其他用途。由於Redis能夠在磁碟上存儲數據以及跨節點復制數據,因而可以作為數據倉庫用於傳統數據模式(也就是說,您可以使用Redis,就像使用RDBMS一樣)。Redis還經常被用作隊列系統。在本用例中,Redis是備份和工作隊列持久化存儲(利用Redis的列表類型)的基礎。GitHub是以此種方法使用Redis的大規模基礎架構示例准備好Redis,立即開始!要開始使用Redis,您需要訪問它,可以通過本地安裝或者託管供應商來實現訪問。如果您使用的MAC,安裝過程可能就不那麼簡單。如果您使用的是Windows??,您需要先安裝Cygwin。如果您正在尋找一個託管供應商,Redis4You擁有一個免費計劃。不管您以何種方式訪問,您都能夠根據本文下列示例進行操作,但是我需要指出的是,使用一個託管供應商進行緩存可能並不是很好的緩存解決方案,因為網路延遲可能會抵消任何性能優勢。您需要通過命令與Redis進行交互,這就是說,這里沒有SQL類查詢語言。使用Redis工作非常類似於使用傳統map數據結構,即所有的一切都擁有一個鍵和一個值,每個值都有多種與之關聯的數據類型。每個數據類型都有其自己的命令集。例如,如果您計劃使用簡單數據類型,比如某種緩存模式,您可以使用命令set和get。您可以通過命令行shell與一個Reids實例進行交互。還有多個客戶端實現,可以以編程方式與Redis進行交互。清單1展示了一個使用基礎命令的簡單命令行shell交互:清單1.使用基礎的Redis命令redis127.0.0.1:6379>setpageregistrationOKredis127.0.0.1:6379>keys*1)"foo"2)"page"redis127.0.0.1:6379>getpage"registration"在這里,我通過set命令將鍵"page"與值"registration"相關聯。接著,我發出keys命令(後綴*表示我想看到所有可用的實例鍵。keys命令顯示有一個page值和一個foo,我可以通過get命令檢索到與一個鍵關聯的值。請記住,使用get檢索到的值只能是一個字元串。如果一個鍵的值是一個列表,那麼您必須使用一個特定列表的命令來檢索列表元素。(注意,有可以查詢值類型的命令)。Java與Jedis集成對於那些想要將Redis集成到Java應用程序的編程人員,Redis團隊建議使用一個名為Jedis的項目,Jedis是一個輕量級庫,可以將本地Redis命令映射到Java方法。例如Jedis可以獲取並設置簡單值,如清單2所示:清單2.Java代碼中的基礎Redis命令JedisPoolpool=newJedisPool(newJedisPoolConfig(),"localhost");Jedisjedis=pool.getResource();jedis.set("foo","bar");Stringfoobar=jedis.get("foo");assertfoobar.equals("bar");pool.returnResource(jedis);pool.destroy();在清單2中,我配置了一個連接池並捕獲連接,(與您在典型JDBC場景中的操作非常相似)然後我在清單的底部設置了返回操作。在連接池邏輯之間,我設置了值"bar"和鍵"foo",這是我通過get命令檢索到的。與memcached類似,Redis允許您將過期(expiration)時間關聯到一個值。因此我設置了這樣一個值(比如,股票臨時交易價格),最終將從Redis緩存中清除掉。如果我想在Jedis中設置一個過期時間,需要在發出set調用之後將其和一個過期時間關聯。如清單3所示:清單3.Redis值可以設置為終止jedis.set("gone","daddy,gone");jedis.expire("gone",10);Stringthere=jedis.get("gone");assertthere.equals("daddy,gone");Thread.sleep(4500);StringnotThere=jedis.get("gone");assertnotThere==null;在清單3中,我使用了一個expire調用將"gone"的值設置為在10秒鍾內終止。調用Thread.sleep之後,"gone"的get調用會返回null。Redis中的數據類型使用Redis數據類型,比如列表和散列需要專用命令用法。例如,我可以通過為鍵附加值來創建列表。
㈡ redis 每一個緩存都需要設置過期時間么
將redis當做使用LRU演算法的緩存來使用LRU是Redis唯一支持的回收方法。
maxmemory配置指令用於配置Redis存儲數據時指定限制的內存大小。
㈢ net redis 設置緩存過期時間,查詢key時緩存時間會不會變
MariaDB和其他開源產品抱怨MySQL 5.5沒有測試用例和某些企業功能是私有模塊,但是它依然表現突出,Oracle花費了兩年發布DMR給MySQL社區來測試和得到反饋。MySQL 5.6從之前的4 CPU線程增長到64 CPU線程,還有其他新功能。net redis 設置緩存過期時間,查詢key時緩存時間會不會變
㈣ redis需要設置過期時間嗎
看需求吧,如果你緩存的數據是靜態的,隨著時間不會變化或者變化比較小,以後一直會用到,那就不用設置。但是如果緩存的數據具有時效新,或者是動態的,不停追加,那麼最好設置或者自己定時刪除,不然內存會撐爆的
㈤ java設置 redis 失效時間多久
EXPIRE命令返回1表示成功,返回0表示鍵值不存在或設置失敗。
同時這里還有一個比較常用的命令是ttl,用於查看一個鍵還有多久時間會被刪除。返回的是剩餘時間(秒數)。
這里就不貼代碼了,有一點需要說明的是,ttl命令在鍵不存在或被刪除之後,會返回-2,在沒有為鍵設置生存時間(即永久存在,建一個鍵之後的默認情況)時返回的是-1。大家可以親自操作一把。
如果想要把一個設置過過期時間的鍵取消過期時間設置,則需要使用persist命令。
redis > SET session:27e7a id1234
OK
redis > EXPIRE session:27e7a 1200
(integer) 1
redis > TTL session:27e7a
(integer) 1092
redis > PERSIST session:27e7a
(integer) 1
redis > TTL session:27e7a
(integer) -1
這里需要說明一點的是,除了使用persist命令外,使用set、getset命令為鍵賦值,也會同時消除鍵的生存時間,如果需要可以重新使用expire命令為鍵設置生存時間。而其他對鍵的操作命令(如incr、lpush、hset、zrem)都不會影響鍵的生存時間。
expire命令的單位是秒,而且這個參數必須為整數,如果需要更精準的時間的話,需要使用pexpire命令設置,其單位為毫秒,同理也需要用pttl命令來看鍵的剩餘毫秒數。當然使用expire命令設置的過期時間也是可以用pttl看鍵的剩餘毫秒數的。
訪問限制
有時候我們會有一個需求是需要限制一個用戶對一個資源的訪問頻率,我們假定一個用戶(用IP作為判斷)每分鍾對一個資源訪問次數不能超過10次。
我們可以使用一個鍵,每次用戶訪問則把值加1,當值加到10的時候,我們設定鍵的過期時間為60秒,並且禁止訪問。這時候下次訪問發現值為10,則不讓訪問了,然後60秒後鍵被刪除,這時候再次創建鍵。這樣就可以解決,但是其實這樣時間並不精準,問題還是挺大的。
我們還有一個方案:使用隊列。前面的章節也說到了,使用列表類型可以用作隊列。
我們設定一個隊列rate.limiting.192.168.1.1(假定是這個IP),我們把每次的訪問時間都添加到隊列中,當隊列長度達到10以後,判斷當前時間與隊列第一個值的時間差是否小於60,如果小於60則說明60秒內訪問次數超過10次,不允許訪問;否則說明可以訪問,則把隊列頭的值刪除,隊列尾增加當前訪問時間。
這種方法可以比較精準的實現訪問限制,但是當限制的次數比較大時,這種方法佔用的存儲空間也會比較大。
緩存
有時候會把一些對CPU或IO資源消耗比較大的操作結果緩存起來,並設置一定時間的自動過期。比如我們設定一個微博外鏈的最熱站點緩存放於新浪微博的首頁,這樣我們不可能每次訪問都重新計算最熱的外鏈站點,所以我們可以設定兩小時更新一次。每次訪問是判斷這個鍵有沒有,如果存在則直接返回,如果沒有則通過計算把內容存入鍵中,並設定兩小時的過期時間。
然而在很多場合這種方法會很恐怖,當伺服器內存有限的時候,大量使用緩存切設置生存時間過長就會導致redis佔用太多內存,而redis有時候會把系統內存都吃掉,導致系統崩潰。但是設置時間過短又會導致緩存的命中太低。
所以我們最好的辦法是設定緩存的淘汰規則。這種方式比較適用於將redis用作緩存系統的時候比較好。
具體就是:修改配置文件中的maxmemory參數,限制redis的最大內存,當超出後會按照maxmemory-policy參數指定的策略刪除不需要的鍵,直到redis佔用的內存小於設定值。
㈥ 集成部署對redis緩存失效有影響嗎
expires查找key期間存說明應key沒設置期間直接返
slave機器則直接返Redis保證數據致性且實現簡單緩存失效主權交給Master機器slave機器沒許可權key失效
前Master機器且key期則master做兩件重要事情:1)刪除命令寫入AOF文件2)通知Slave前key失效刪除
master本字典key於值刪除
主失效機制
主失效機制叫積極失效機制即服務端定檢查失效緩存失效則進行相應操作
我都知道Redis單線程基於事件驅RedisEventLoopEventLoop負責兩類事件進行處理:
類IO事件類事件底層路復用器離
類定事件類事件主要用事件某任務定執行
㈦ 用了redis緩存後還要用並發容器嗎
當用Redis作為一個LRU存儲時,有些時候是比較方便的,在你增添新的數據時會自動驅逐舊的數據。這種行為在開發者論壇是非常有名的,因為這是流行的memcached系統的默認行為。
LRU實際上只是支持驅逐的方式之一。這頁包含更多一般的Redis maxmemory指令的話題用於限制內存使用到一個定額,同時它也深入的涵蓋了Redis所使用的LRU演算法,實際上是精確LRU的近似值。
一、Maxmemory設置指令
Maxmemory設置指令用於配置Redis的數據集使用指定量的內存。可以用redis conf.file設置指令,或者可以在稍晚的時候在運行時間用config set命令。
例如,為了設置內存局限於100百萬位元組,下列指令可在redis.conf file內使用。設置maxmemory到零使得沒有內存限制。這是64位系統的默認行為,而32位系統使用3GB內隱記憶極限。
maxmemory 100mb
當達到指定量的內存後,就可以選擇不同的行為,稱為策略。Redis可以返回錯誤的指令,導致使用更多的內存,或者為了每次增加新的數據後返回指定的內存,它可以驅逐一些舊的數據。
二、驅逐策略
當到達maxmemory極限時,使用maxmemory-策略配置指令來執行具體的Redis動作。
以下策略可以使用:
1、noeviction:達到內存限額後返回錯誤,客戶嘗試可以導致更多內存使用的命令(大部分寫命令,但DEL和一些例外)
2、allkeys-lru:為了給新增加的數據騰出空間,驅逐鍵先試圖移除一部分最近使用較少的(LRC)。
3、volatile-lru:為了給新增加的數據騰出空間,驅逐鍵先試圖移除一部分最近使用較少的(LRC),但只限於過期設置鍵。
4、allkeys-random: 為了給新增加的數據騰出空間,驅逐任意鍵。
5、volatile-random: 為了給新增加的數據騰出空間,驅逐任意鍵,但只限於有過期設置的驅逐鍵。
6、volatile-ttl: 為了給新增加的數據騰出空間,驅逐鍵只有秘鑰過期設置,並且首先嘗試縮短存活時間的驅逐鍵。
如果沒有秘鑰去驅逐匹配先決條件,策略volatile-lru, volatile-random 和volatile-ttl行為很像noeviction。
那麼根據你應用的訪問模式選擇正確的驅逐策略是很重要的。然而在應用運行時你可以在運行時間重新設置策略,並且監控緩存缺失的數量並為了調整你的設置點擊Redis信息輸出。
三、近似LRU演算法
Redis的LRU演算法不是准確的實現。也就是說Redis沒有為逐出選擇 最好的候選人 ,也就是沒有選擇過去最後被訪問離現在最久的。反而 是去執行一個 近似LRU的演算法,通過抽樣少量的key,並且逐出抽樣中最後被訪問離現在最久的key(最老的訪問時間)。
在Redis 3.0(目前的測試版),演算法被改進了,使用了一個逐出最佳候選池。改進了演算法的性能,使它更加近似真正LRU演算法。
演算法中,關於逐出檢測的樣品數量,你可以自己去調整。配置參數是:
maxmemory-samples 5
Redis沒有使用真正實現LRU算是的原因是,因為消耗更多的內存。然而對於使用Redis的應用來說,事實上是等價的。
㈧ 如何制定Redis過期策略
Redis是key-value資料庫,我們可以設置Redis中緩存的key的過期時間。Redis的過期策略就是指當Redis中緩存的key過期了,Redis如何處理。
過期策略通常有以下三種:
定時過期:每個設置過期時間的key都需要創建一個定時器,到過期時間就會立即清除。該策略可以立即清除過期的數據,對內存很友好;但是會佔用大量的CPU資源去處理過期的數據,從而影響緩存的響應時間和吞吐量。
惰性過期:只有當訪問一個key時,才會判斷該key是否已過期,過期則清除。該策略可以最大化地節省CPU資源,卻對內存非常不友好。極端情況可能出現大量的過期key沒有再次被訪問,從而不會被清除,佔用大量內存。
定期過期:每隔一定的時間,會掃描一定數量的資料庫的expires字典中一定數量的key,並清除其中已過期的key。該策略是前兩者的一個折中方案。通過調整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和內存資源達到最優的平衡效果。
(expires字典會保存所有設置了過期時間的key的過期時間數據,其中,key是指向鍵空間中的某個鍵的指針,value是該鍵的毫秒精度的UNIX時間戳表示的過期時間。鍵空間是指該Redis集群中保存的所有鍵。)
㈨ Redis 的數據過期淘汰策略
Redis 中數據過期策略採用定期刪除+惰性刪除策略。
定期刪除策略:Redis 啟用一個定時器定時監視所有的 key,判斷key是否過期,過期的話就刪除。這種策略可以保證過期的 key 最終都會被刪除,但是也存在嚴重的缺點:每次都遍歷內存中所有的數據,非常消耗 CPU 資源,並且當 key 已過期,但是定時器還處於未喚起狀態,這段時間內 key 仍然可以用。
惰性刪除策略:在獲取 key 時,先判斷 key 是否過期,如果過期則刪除。這種方式存在一個缺點:如果這個 key 一直未被使用,那麼它一直在內存中,其實它已經過期了,會浪費大量的空間。
2、定期刪除+惰性刪除策略是如何工作的?
這兩種策略天然的互補,結合起來之後,定時刪除策略就發生了一些改變,不在是每次掃描全部的 key 了,而是隨機抽取一部分 key 進行檢查,這樣就降低了對 CPU 資源的損耗,惰性刪除策略互補了為檢查到的key,基本上滿足了所有要求。但是有時候就是那麼的巧,既沒有被定時器抽取到,又沒有被使用,這些數據又如何從內存中消失?沒關系,還有內存淘汰機制,當內存不夠用時,內存淘汰機制就會上場。Redis 內存淘汰機制有以下幾種策略:
noeviction:當內存不足以容納新寫入數據時,新寫入操作會報錯。(Redis 默認策略)
allkeys-lru:當內存不足以容納新寫入數據時,在鍵空間中,移除最近最少使用的 Key。(推薦使用)
allkeys-random:當內存不足以容納新寫入數據時,在鍵空間中,隨機移除某個 Key。
volatile-lru:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,移除最近最少使用的 Key。這種情況一般是把 Redis 既當緩存,又做持久化存儲的時候才用。
volatile-random:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,隨機移除某個 Key。
volatile-ttl:當內存不足以容納新寫入數據時,在設置了過期時間的鍵空間中,有更早過期時間的 Key 優先移除。
修改內存淘汰機制只需要在 redis.conf 配置文件中配置 maxmemory-policy 參數即可。
㈩ redis中hset(key,field,value)存儲的數據怎麼設置過期時間,針對field設置
過期時間刪除的方法有三種:
1、刪除這個key,使用del command
2、用set or getset 命令會將key的expiration清空,事實上set和getset命令是替換了key對應的value,所以key的過期時間也就不復存在。所以,需要注意的是:incr,LPUSH,HSET命令是不會改變key的過期時間的。原來是多久,這三條命令執行完之後還是多久。
3、使用persist命令清楚key的過期時間。
rename命令是將keyA變為keyB,無論keyB是否已經存在,keyA的過期時間都會被keyB繼承過去。