Redis持久化

1.Jedis連接redis服務(wù)器

注意事項(xiàng):必須要放開redis允許啟動主機(jī)訪問。
注釋/etc/redis.conf 的 bind 127.0.0.1 這個句話

image.png

1.1.項(xiàng)目結(jié)構(gòu)

image.png

1.2.Jedis連接redis服務(wù)端

import java.util.Set;     
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class TestJedis {
    @Test
    public void testJedisConnect(){
       // 連接redis服務(wù)器端(使用host)
       @SuppressWarnings("resource")
       Jedis jedis = new Jedis("192.168.56.128");
       System.out.println("連接redis服務(wù)端成功!");
       //測試redis服務(wù)器是否正在運(yùn)行
       System.out.println("redis服務(wù)器正在運(yùn)行嗎?"+ jedis.ping());
       System.out.println("redis服務(wù)器信息?\n"+ jedis.info());
    }
}

Tips:使用jedis連接redis可能會出現(xiàn)的問題及解決方案:
1)ip綁定問題
Connection refused: connect

image.png

把Redis的配置文件redis.conf里的
bind localhost(或者bind 127.0.0.1,表明只有該主機(jī)才能訪問)注釋掉。

image.png

或者修改為:
bind ip 表明,只能通過ip訪問。
2)、保護(hù)模式
DENIED Redis is running in protected mode because protected mode is enabled…
redis處于保護(hù)模式,只能本地鏈接,我們需要修改配置文件redis.conf,將protected-mode yes改成no

image.png

1.3.Key測試

@Test
    public void testKey(){
       @SuppressWarnings("resource")
       Jedis jedis = new Jedis("192.168.56.128");
       System.out.println("連接redis服務(wù)端成功!");
       //測試redis服務(wù)器是否正在運(yùn)行
       System.out.println("redis服務(wù)器正在運(yùn)行嗎?"+ jedis.ping());
       
       jedis.set("jediskey", "apple");
       
       String value = jedis.get("jediskey");
       
       System.out.println(value);
       
       Set<String> keys = jedis.keys("*");
       
       for (String string : keys) {
           System.out.println(string);
       }
       
    }

1.4.List測試

@Test
    public void testList(){
       @SuppressWarnings("resource")
       Jedis jedis = new Jedis("192.168.56.128");
       System.out.println("連接redis服務(wù)端成功!");
       //測試redis服務(wù)器是否正在運(yùn)行
       System.out.println("redis服務(wù)器正在運(yùn)行嗎?"+ jedis.ping());
       
       jedis.lpush("list01", "string1");
       jedis.lpush("list01", "string2");
       jedis.lpush("list01", "string3");
       List<String> listString = jedis.lrange("list01", 0, 2);
       for (String string : listString) {
           System.out.println(string);
       }
    }

1.5.Set測試

@Test
    public void testSet(){
       @SuppressWarnings("resource")
       Jedis jedis = new Jedis("192.168.56.128");
       System.out.println("連接redis服務(wù)端成功!");
       //測試redis服務(wù)器是否正在運(yùn)行
       System.out.println("redis服務(wù)器正在運(yùn)行嗎?"+ jedis.ping());
       
       jedis.sadd("jedisset", "mysql");
       jedis.sadd("jedisset", "oracle","mongodb");
       Set<String> set = jedis.sunion("jedisset");
       for (String string : set) {
           System.out.println(string);
       }
    }

1.6.Hash測試

@Test
    public void testHash(){
       @SuppressWarnings("resource")
       Jedis jedis = new Jedis("192.168.56.128");
       System.out.println("連接redis服務(wù)端成功!");
       //測試redis服務(wù)器是否正在運(yùn)行
       System.out.println("redis服務(wù)器正在運(yùn)行嗎?"+ jedis.ping());
       
       jedis.hset("hash01", "name", "zhangsan");
       jedis.hset("hash01", "age", "18");
       jedis.hset("hash01", "phone", "18627738874");
       List<String> hashString = jedis.hmget("hash01",      "name","age","phone");
       for (String string : hashString) {
           System.out.println(string);
       }
    }

2.Redis持久化

Redis持久化,就是將內(nèi)存中的數(shù)據(jù),永久保存到磁盤上。
Redis持久化有兩種方式:RDB(Redis DB)、AOF(AppendOnlyFile)

2.1.RDB(快照模式)

在默認(rèn)情況下,Redis 將數(shù)據(jù)庫快照保存在名字為dump.rdb的二進(jìn)制文件中,可以在redis.conf配置文件中修改持久化信息。

image.png

save 900 1 表示在900秒內(nèi),至少更新了1條數(shù)據(jù)。Redis就將數(shù)據(jù)持久化到硬盤
save 300 10 表示在300內(nèi),至少更新了10條數(shù)據(jù),Redis就會觸發(fā)將數(shù)據(jù)持久化到硬盤
save 60 10000 表示60秒內(nèi),至少更新了10000條數(shù)據(jù),Redis就會觸發(fā)將數(shù)據(jù)持久化到硬盤

2.1.1.策略

(1)自動:BGSAVE
按照配置文件中的條件滿足就執(zhí)行BGSAVE;
非阻塞,Redis服務(wù)正常接收處理客戶端請求;
Redis會folk()一個新的子進(jìn)程來創(chuàng)建RDB文件,子進(jìn)程處理完后會向父進(jìn)程發(fā)送一個信號,通知它處理完畢;
父進(jìn)程用新的dump.rdb替代舊文件。

image.png
image.png

(2)手動:SAVE
客戶端(redis-cli)發(fā)起SAVE命令;
n 阻塞Redis服務(wù),無法響應(yīng)客戶端請求;
n 創(chuàng)建新的dump.rdb替代舊文件。

image.png

2.1.2.優(yōu)點(diǎn)

(1)執(zhí)行效率高;
(2)恢復(fù)大數(shù)據(jù)集速度較AOF快。
3.
缺點(diǎn)
(1)會丟失最近寫入、修改的而未能持久化的數(shù)據(jù);
(2)folk過程非常耗時,會造成毫秒級不能響應(yīng)客戶端請求。
8.

2.2.AOF(追加模式、文本重演)

2.2.1特點(diǎn)

Append only file,采用追加的方式保存,默認(rèn)文件appendonly.aof;
記錄所有的寫操作命令,在服務(wù)啟動的時候使用這些命令就可以還原數(shù)據(jù)庫;
AOF默認(rèn)關(guān)閉,需要在配置文件中手動開啟。

image.png
image.png
image.png
image.png

2.2.2.寫入機(jī)制

說明:AOF機(jī)制,添加了一個內(nèi)存緩沖區(qū)(buffer)。
(1)將內(nèi)容寫入緩沖區(qū)
(2)當(dāng)緩沖區(qū)被填滿、或者用戶手動執(zhí)行fsync、或者系統(tǒng)根據(jù)指定的寫入磁盤策略自動調(diào)用fdatasync命令,才將緩沖區(qū)里的內(nèi)容真正寫入磁盤里。
(3)在緩沖區(qū)里的內(nèi)容未寫入磁盤之前,可能會丟失。

2.2.3.寫入磁盤的策略

n appendfsync選項(xiàng),這個選項(xiàng)的值可以是always、everysec或者no

image.png

Always:服務(wù)器每寫入一個命令,就調(diào)用一次fdatasync,將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器出現(xiàn)故障,也不會丟失任何已經(jīng)成功執(zhí)行的命令數(shù)據(jù)
Everysec(默認(rèn)):服務(wù)器每一秒重調(diào)用一次fdatasync,將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器出現(xiàn)故障,最多只丟失一秒鐘內(nèi)的執(zhí)行的命令數(shù)據(jù)
No:服務(wù)器不主動調(diào)用fdatasync,由操作系統(tǒng)決定何時將緩沖區(qū)里面的命令寫入到硬盤。這種模式下,服務(wù)器遭遇意外停機(jī)時,丟失命令的數(shù)量是不確定的
運(yùn)行速度:always的速度慢,everysec和no都很快

2.2.4.aof重寫機(jī)制

AOF文件過大,合并重復(fù)的操作,AOF會使用盡可能少的命令來記錄。

2.2.4.1重寫過程

(1)folk一個子進(jìn)程負(fù)責(zé)重寫AOF文件
(2)子進(jìn)程會創(chuàng)建一個臨時文件寫入AOF信息
n (3)父進(jìn)程會開辟一個內(nèi)存緩沖區(qū)接收新的寫命令
n (4)子進(jìn)程重寫完成后,父進(jìn)程會獲得一個信號,將父進(jìn)程接收到的新的寫操作由子進(jìn)程寫入到臨時文件中
n (5)新文件替代舊文件
重寫的本質(zhì):就是將操作同一個鍵的命令,合并。從而減小AOF文件的體積

image.png

2.2.4.2aof重寫觸發(fā)機(jī)制

(1)手動:
客戶端向服務(wù)器發(fā)送BGREWRITEAOF命令

image.png

(2)自動:
配置文件中的選項(xiàng),自動執(zhí)行BGREWRITEAOF命令
auto-aof-rewrite-min-size <size>,
觸發(fā)AOF重寫所需的最小體積:只要在AOF文件的體積大于等于size時,才會考慮是否需要進(jìn)行AOF重寫,這個選項(xiàng)用于避免對體積過小的AOF文件進(jìn)行重寫
auto-aof-rewrite-percentage <percent>
指定觸發(fā)重寫所需的AOF文件體積百分比:當(dāng)AOF文件的體積大于auto-aof-rewrite-min-size指定的體積,并且超過上一次重寫之后的AOF文件體積的percent %時,就會觸發(fā)AOF重寫。(如果服務(wù)器剛剛啟動不久,還沒有進(jìn)行過AOF重寫,那么使用服務(wù)器啟動時載入的AOF文件的體積來作為基準(zhǔn)值)。將這個值設(shè)置為0表示關(guān)閉自動AOF重寫。

2.2.5.優(yōu)點(diǎn)

寫入機(jī)制,默認(rèn)fysnc(手工同步)每秒執(zhí)行,性能很好不阻塞服務(wù),最多丟失一秒的數(shù)據(jù);
??重寫機(jī)制,優(yōu)化AOF文件;
??如果誤操作了(FLUSHALL等),只要AOF未被重寫,停止服務(wù)移除AOF文件尾部FLUSHALL命令,重啟Redis,可以將數(shù)據(jù)集恢復(fù)到FLUSHALL 執(zhí)行之前的狀態(tài)。

2.2.6.缺點(diǎn)

相同數(shù)據(jù)集,AOF文件體積較RDB大了很多;
恢復(fù)數(shù)據(jù)庫速度較RDB慢(文本,命令重演)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈...
  • 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈...
    失心的愜意閱讀 341評論 0 0
  • 很久之前,一個老師問我們,為什么那么多人喜歡看韓劇,他的理由是,因?yàn)轫n國人尊敬人,特別是長輩。人們在看劇過程中獲得...
    奇奇怪怪的阿清閱讀 192評論 0 0
  • 上周五跟女兒聊天。 女兒:我有個事想跟你說,可又不想說; 我:哦,那等你想說的時候再說; 女兒:算了,我還是跟你說...
    一瀟媽閱讀 222評論 0 0
  • std::move函數(shù)可以以非常簡單的方式將左值引用轉(zhuǎn)換為右值引用。通過std::move,可以避免不必要的拷貝操...
    宋大壯閱讀 958評論 0 0

友情鏈接更多精彩內(nèi)容