Redis-14Redis超時命令

      網友投稿 710 2022-05-29

      文章目錄

      概述

      Redis 的超時命令

      Spring操作 Redis 超時命令

      如果 key, 超時了, Redis 會回收 key 的存儲空間嗎 ?

      Redis對超時鍵值對的回收策略

      定時回收

      惰性回收

      小結

      代碼

      概述

      正如 Java 虛擬機,它提供 GC的功能,來保證 Java 程序使用過且不再使用的 Java 對象及時的從內存中釋放掉,從而保證內存空間可用。當程序編寫不當或考慮欠缺的時候(比如讀入大文件),內存就可能存儲不下運行所需要的數據,那么 Java虛擬機就會拋出內存溢出的異常而導致服務失敗。同樣,

      Redis 也是基于內存而運行的數據集合,也存在著對內存垃圾的回收和管理的問題。

      Redis 基于內存 ,而內 存對于一個系統是最為寶貴的資源,而且它遠遠沒有磁盤那么大,所以對于 Redis 的鍵值對的內存回收也是一個十分重要的問題,如果操作不當會產生 Redis巖機的問題,使得系統性能低下。

      對于 Redis 而言, del 命令可以刪除一些鍵值對,所以 Redis 比 Java 虛擬機更靈活,允許刪除一部分的鍵值對。與此同時,當內存運行空間滿了之后 ,它還會按照回收機制去自動回收一些鍵值對,這和 Java 虛擬機又有相似之處,但是當垃圾進行回收的時候,又有可能執行回收而引發系統停頓,因此選擇適當的回收機制和時間將有利于系統性能的提高。

      Redis 的超時命令

      Spring操作 Redis 超時命令

      package com.artisan.redis.expire; import java.util.Date; import java.util.concurrent.TimeUnit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; public class SpringRedisExpireDemo { @SuppressWarnings({ "unchecked", "rawtypes", "resource" }) public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/spring-redis-string.xml"); RedisTemplate redisTemplate = ctx.getBean(RedisTemplate.class); redisTemplate.execute((RedisOperations ops) -> { ops.boundValueOps("key1").set("value1"); String value = (String) ops.boundValueOps("key1").get(); System.out.println("value=" + value); long expSecond = ops.getExpire("key1"); System.out.println("expSecond:" + expSecond); // 設置120秒 Boolean flag = ops.expire("key1", 120L, TimeUnit.SECONDS); System.out.println("設置超時時間:" + flag); System.out.println("過期時間:" + ops.getExpire("key1") + "秒"); // 持久化 key,取消超時時間 flag = ops.persist("key1"); System.out.println("取消超時時間:" + flag); System.out.println("過期時間:" + ops.getExpire("key1")); Date date = new Date(); date.setTime(System.currentTimeMillis() + 120000); // 設置超時時間點 flag = ops.expireAt("key1", date); System.out.println("設置超時時間:" + flag); System.out.println("過期時間:" + ops.getExpire("key1")); return null; }); } }

      1

      2

      3

      4

      5

      6

      7

      Redis-14Redis超時命令

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      INFO : org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@73a8dfcc: startup date [Fri Sep 28 12:57:39 CST 2018]; root of context hierarchy INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [spring/spring-redis-string.xml] value=value1 expSecond:-1 設置超時時間:true 過期時間:120秒 取消超時時間:true 過期時間:-1 設置超時時間:true 過期時間:155

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      如果 key, 超時了, Redis 會回收 key 的存儲空間嗎 ?

      Redis 的 key 超時不會被其自動回收,它只會標識哪些鍵值對超時了

      好處: 如果一個很大的鍵值對超時,比如一個列表或者哈希結構,存在數以百萬個元素,要對其回收需要很長的時間 如果采用超時回收,則可能產生停頓

      壞處: 超時的鍵值對會浪費比較多的空間。

      Redis對超時鍵值對的回收策略

      Redis 提供兩種方式回收這些超 時鍵值對, 它們是定時回收和惰性回收。

      定時回收是指在確定的某個時間觸發一段代碼,回收超時的鍵值對 。

      惰性回收則是 當 一個超時的鍵,被再次用 get 命令訪問時,將觸發 Redis 將其從內

      存中清空。

      定時回收

      定時回收可以完全回收那些超時的鍵值對,但是缺點也很明顯,如果這些鍵值對比較多, 則 Redis 需要運行較長的時間,從而導致停頓。所以系統設計者一般會選擇在沒有業務發生的時刻觸發 Redis 的定時回收,以便清理超時的鍵值對

      惰性回收

      對于惰性回收而言,它的優勢是可以指定回收超時的鍵值對。 它的缺點是要執行一個莫名其妙的 get 操作,或者在某些時候,我們也難以判斷哪些鍵值對已經超時。

      小結

      無論是定時回收還是惰性回收,都要依據自身的特點去定制策略,如果一個鍵值對,存儲的是數 以千萬的數據 ,使用 expire 命令使其到達一個時間超時,然后用 get 命令訪問觸發其回收,顯然會付出停頓代價,這是現實中需要考慮的 。

      代碼

      代碼托管到了 https://github.com/yangshangwei/redis_learn

      Java Redis

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Python教程之正則表達式詳解(基礎篇)
      下一篇:《Java編程創造營》學習體會總結
      相關文章
      亚洲国产一区明星换脸| 亚洲第一页在线观看| 亚洲国产精品白丝在线观看| 亚洲AV无码一区二区二三区入口 | 亚洲精品私拍国产福利在线| 亚洲精品少妇30p| 亚洲乱码国产一区三区| 国产AV无码专区亚洲AV手机麻豆| 亚洲美日韩Av中文字幕无码久久久妻妇| 亚洲www77777| 亚洲综合在线一区二区三区 | 亚洲综合av一区二区三区不卡| 亚洲国产av美女网站| 亚洲一级毛片免费观看| 亚洲制服丝袜一区二区三区| 亚洲激情视频图片| 亚洲最大无码中文字幕| 亚洲人成色99999在线观看| 亚洲高清乱码午夜电影网| 亚洲精品GV天堂无码男同| 亚洲日韩在线中文字幕综合| 欧美亚洲国产SUV| 亚洲国产精品成人一区| 中文字幕中韩乱码亚洲大片| 国产亚洲色婷婷久久99精品| 久久国产精品亚洲综合| 亚洲韩国在线一卡二卡| 亚洲伊人久久大香线蕉| 日本亚洲免费无线码| 精品亚洲视频在线| 亚洲日本va午夜中文字幕久久| 国产精品亚洲αv天堂无码| 亚洲中文字幕无码日韩| 久久亚洲精品成人| 亚洲欧洲高清有无| 亚洲欧洲日韩极速播放| 亚洲av色香蕉一区二区三区 | 亚洲精品无码av天堂| 亚洲乱码中文字幕综合| 亚洲人成依人成综合网| 亚洲一区二区三区久久|