『壹』 誰能告訴我C#中緩存的生命周期
緩存這個概念很廣.
在Asp.Net環境下,頁面,控制項都可以設置輸出緩存,並且可以設置過期時間.Asp.Net的HttpContext對象有個Cache屬性,可以設置數據緩存,可以設置過期時間.可能你會用到一些第三方緩存庫(比如微軟的企業庫)或者分布式緩存庫(大名鼎鼎的Memcache),這些都是可以設置過期時間的.
在Windows應用程序下,由於沒有了HttpContext對象,所有緩存機製得靠自己實現.
至於緩存的生命周期,輸出緩存是一個絕對過期時間,超出該時間則緩存失效.數據緩存可以設置絕對過期時間和相對過期時間,在相對過期時間范圍內沒有訪問該緩存,則失效,否則繼續延長緩存期限.第三方緩存一般設計的是絕對過期時間.
在內存吃緊的時候,CLR會自動清理緩存已滿足應用程序需要,這種特殊情況過期時間不一定靠譜.
『貳』 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佔用的內存小於設定值。
『叄』 緩存擊穿互斥鎖 設置鎖的失效時間
設置鎖的失效時間是自己設置的,它的過期時間會很短,最長不超過五分鍾
緩存穿透是指查詢一個一定不存在的數據
由於緩存是不命中時被動寫的,
並且出於容錯考慮,如果從存儲層查不到數據則不寫入緩存,
這將導致這個不存在的數據每次請求都要到存儲層去查詢,失去了緩存的意義。
在流量大時,可能DB就掛掉了,
要是有人利用不存在的key頻繁攻擊我們的應用,這就是漏洞。
最常見的則是採用布隆過濾器
將所有可能存在的數據哈希到一個足夠大的bitmap中,
一個一定不存在的數據會被 這個bitmap攔截掉,
從而避免了對底層存儲系統的查詢壓力。
另外也有一個更為簡單粗暴的方法
如果一個查詢返回的數據為空(不管是數 據不存在,還是系統故障),
我們仍然把這個空結果進行緩存,但它的過期時間會很短,最長不超過五分鍾
『肆』 android有哪幾種緩存方式,優缺點是什麼
二級緩存工作機制。
1.所謂二級緩存實際上並不復雜,當Android端需要獲得數據時比如獲取網路中的圖片,我們首先從內存中查找(按鍵查找),內存中沒有的再從磁碟文件或sqlite中去查找,若磁碟中也沒有才通過網路獲取。
2.當獲得來自網路的數據,就以key-value對的方式先緩存到內存(一級緩存),同時緩存到文件或sqlite中(二級緩存)。注意:內存緩存會造成堆內存泄露,所有一級緩存通常要嚴格控制緩存的大小,一般控制在系統內存的1/4。
3.網路中的數據是變化的,數據一旦放入緩存中,再取該數據就是從緩存中獲得,這樣豈不是不能體現數據的變化?在緩存數據時會設置有效時間,比如說30分鍾,若超過這個時間數據就失效並釋放空間,然後重新請求網路中的數據。
『伍』 請教nginx中fastcgi緩存過期時間,以及如何清理緩存的問題
nginx的緩存服務proxy_cache不能清除指定的URL緩存,只能設置URL過期時間,要清除指定URL可以用nginx第三方模塊ngx_cache_purge。
nginx安裝時需要將ngx_cache_purege載入進去。
『陸』 Ie瀏覽器緩存的css文件多久失效
css是緩存文件,可以自行在瀏覽器里設置失效時間。
在瀏覽器中打開「工具internet選項」,對話框的中間位置,瀏覽歷史記錄,cookie的位置有刪除和設置兩個按鈕,點擊設置按鈕,裡面你可以設置緩存文件的大小,存在時間,還可以打開緩存文件目錄。
『柒』 redis需要設置過期時間嗎
看需求吧,如果你緩存的數據是靜態的,隨著時間不會變化或者變化比較小,以後一直會用到,那就不用設置。但是如果緩存的數據具有時效新,或者是動態的,不停追加,那麼最好設置或者自己定時刪除,不然內存會撐爆的
『捌』 redis 每一個緩存都需要設置過期時間么
將redis當做使用LRU演算法的緩存來使用LRU是Redis唯一支持的回收方法。
maxmemory配置指令用於配置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集群中保存的所有鍵。)
『拾』 設置頁面在失效前被緩存的時間是什麼意思
你應該是說的頁面緩存失效時間,比如你改了頁面引入的js,刷新的時候並不會生效,因為實際上瀏覽的是緩存的頁面,並沒有載入新寫的JS,緩存失效過了之後會重新讀一遍就會把新寫的js讀進去了,這個一般都是項目和伺服器配置,跟前端無關