1、redis服務(wù)器中的數(shù)據(jù)庫,都保存在服務(wù)器狀態(tài)redisserver結(jié)構(gòu)的db數(shù)組中,每一個(gè)項(xiàng)都是redisdb
dbnum : 服務(wù)器數(shù)據(jù)庫數(shù)量,默認(rèn)創(chuàng)建16個(gè)數(shù)據(jù)庫
2、切換數(shù)據(jù)庫
redisclient 保存著數(shù)據(jù)庫的指針 select 2 ,切換到下標(biāo)為2的數(shù)據(jù)庫,通過修改Redisclient.db指針實(shí)現(xiàn)
3、數(shù)據(jù)庫鍵空間
redisdb結(jié)構(gòu)的dict字典保存了數(shù)據(jù)庫中的所有鍵值對(duì),將這個(gè)字典稱為鍵空間(key space)
鍵空間中的鍵是一個(gè)字符串對(duì)象,值可以是字符串對(duì)象,列表對(duì)象,hash對(duì)象,集合對(duì)象,有序集合對(duì)象任意一種redis對(duì)象
3.1、redis支持 添加新鍵,刪除鍵,對(duì)鍵取值,清空數(shù)據(jù)庫
4、讀寫鍵空間時(shí)的維護(hù)
讀取一個(gè)鍵后,服務(wù)器會(huì)根據(jù)鍵是否存在來更新服務(wù)器鍵空間命中(hit)次數(shù)或鍵空間不命中(miss)次數(shù),值可以通過info stats 命令查詢keyspace_hits 屬性和keyspace_misses屬性
讀取后悔更新lru,最后一次使用時(shí)間,這個(gè)值可以用于計(jì)算鍵的空置時(shí)間,使用objectidletime key來查看key閑置時(shí)間
如果服務(wù)器讀取一個(gè)鍵時(shí)發(fā)現(xiàn)該鍵過期,會(huì)先刪除這個(gè)過期鍵,然后執(zhí)行余下操作
如果客戶端使用watch命令監(jiān)視了某個(gè)鍵,那么服務(wù)器被監(jiān)視的鍵修改之后,會(huì)將這個(gè)鍵標(biāo)記為臟,從而讓事務(wù)程序注意到已經(jīng)被修改,每次修改,都會(huì)對(duì)臟鍵計(jì)數(shù)器增1
5、設(shè)置鍵的生存時(shí)間或過期時(shí)間 expire pexpire expireat pexpireat
5.1、保存過期時(shí)間,redisdb結(jié)構(gòu)的expires字典保存了數(shù)據(jù)庫中所有鍵的過期時(shí)間,我們稱為字典的過期字典,鍵是一個(gè)指針,指向鍵空間中某個(gè)鍵對(duì)象,值是一個(gè)long類型整數(shù),保存了鍵所指向的數(shù)據(jù)庫的過期時(shí)間
6、移除過期時(shí)間 persist
7、過期鍵刪除
定時(shí)刪除,設(shè)置過期時(shí)間同時(shí),創(chuàng)建一個(gè)定時(shí)器,讓定時(shí)器在鍵的過期時(shí)間來臨時(shí),刪除鍵,主動(dòng)刪除,耗CPU,節(jié)省內(nèi)存
惰性刪除,放任鍵過期不管,但是每次從鍵空間中獲取時(shí),都檢查取得的鍵是否過期,如果過期就刪除該鍵,如果沒有過期,就返回該鍵,被動(dòng)刪除,耗內(nèi)存,省CPU
定期刪除:每個(gè)一段時(shí)間,就對(duì)數(shù)據(jù)庫進(jìn)行一次檢查,刪除里面的過期鍵,至于刪除多少個(gè)數(shù)據(jù)庫,則由算法決定 ,需要合理設(shè)置執(zhí)行時(shí)長和執(zhí)行頻率
可以配合使用第一種和第二種
8、aof rdb 和復(fù)制功能對(duì)過期鍵的處理
執(zhí)行save或者bgsave命令創(chuàng)建一個(gè)新的rdb文件時(shí),程序會(huì)對(duì)數(shù)據(jù)庫中的鍵進(jìn)行檢查,已過期鍵不會(huì)被保存到rdb文件中
當(dāng)啟動(dòng)redis服務(wù)器時(shí)候,如果開啟了rdb功能,,服務(wù)器將載入rdb文件
當(dāng)服務(wù)器以aof持久化模式運(yùn)行,某個(gè)過期鍵被刪除,aof文件會(huì)追加(append)一條del命令,來顯式地記錄該鍵已被刪除
復(fù)制
主服務(wù)器命令會(huì)同步到從服務(wù)器
9、數(shù)據(jù)庫通知