真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

redis實(shí)現(xiàn)服務(wù)器崩潰宕機(jī)的數(shù)據(jù)恢復(fù)方法

今天小編給大家分享的是redis實(shí)現(xiàn)服務(wù)器崩潰宕機(jī)的數(shù)據(jù)恢復(fù)方法,相信很多人都不太了解,為了讓大家更加了解,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會(huì)有所收獲的哦。

創(chuàng)新互聯(lián)長(zhǎng)期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為拜城企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,拜城網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

redis實(shí)現(xiàn)服務(wù)器崩潰宕機(jī)的數(shù)據(jù)恢復(fù)方法

由于redis存儲(chǔ)在內(nèi)存中且提供一般編程語(yǔ)言常用的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)類型,所以經(jīng)常被用于做服務(wù)器崩潰宕機(jī)的數(shù)據(jù)恢復(fù)處理。

服務(wù)器可以在某些指定過(guò)程中將需要保存的數(shù)據(jù)以json對(duì)象等方式存儲(chǔ)到redis中,也就是我們常說(shuō)的快照,當(dāng)服務(wù)器運(yùn)行時(shí)讀取redis來(lái)判斷是否有待需要恢復(fù)數(shù)據(jù)繼續(xù)處理的業(yè)務(wù)。

當(dāng)一次業(yè)務(wù)處理結(jié)束后再刪除redis的數(shù)據(jù)即可。

redis提供兩種將內(nèi)存數(shù)據(jù)導(dǎo)出到硬盤實(shí)現(xiàn)數(shù)據(jù)備份的方法:

RDB方式(默認(rèn))

RDB方式的持久化是通過(guò)快照(snapshotting)完成的,當(dāng)符合一定條件時(shí)Redis會(huì)自動(dòng)將內(nèi)存中的所有數(shù)據(jù)進(jìn)行快照并存儲(chǔ)在硬盤上。進(jìn)行快照的條件可以由用戶在配置文件中自定義,由兩個(gè)參數(shù)構(gòu)成:時(shí)間和改動(dòng)的鍵的個(gè)數(shù)。當(dāng)在指定的時(shí)間內(nèi)被更改的鍵的個(gè)數(shù)大于指定的數(shù)值時(shí)就會(huì)進(jìn)行快照。RDB是redis默認(rèn)采用的持久化方式,在配置文件中已經(jīng)預(yù)置了3個(gè)條件:

save 900 1    # 900秒內(nèi)有至少1個(gè)鍵被更改則進(jìn)行快照

save 300 10   # 300秒內(nèi)有至少10個(gè)鍵被更改則進(jìn)行快照

save 60 10000 # 60秒內(nèi)有至少10000個(gè)鍵被更改則進(jìn)行快照

可以存在多個(gè)條件,條件之間是“或”的關(guān)系,只要滿足其中一個(gè)條件,就會(huì)進(jìn)行快照。 如果想要禁用自動(dòng)快照,只需要將所有的save參數(shù)刪除即可。

Redis默認(rèn)會(huì)將快照文件存儲(chǔ)在當(dāng)前目錄(可CONFIG GET dir來(lái)查看)的dump.rdb文件中,可以通過(guò)配置dir和dbfilename兩個(gè)參數(shù)分別指定快照文件的存儲(chǔ)路徑和文件名。

Redis實(shí)現(xiàn)快照的過(guò)程

Redis使用fork函數(shù)復(fù)制一份當(dāng)前進(jìn)程(父進(jìn)程)的副本(子進(jìn)程);

父進(jìn)程繼續(xù)接收并處理客戶端發(fā)來(lái)的命令,而子進(jìn)程開(kāi)始將內(nèi)存中的數(shù)據(jù)寫入硬盤中的臨時(shí)文件;

當(dāng)子進(jìn)程寫入完所有數(shù)據(jù)后會(huì)用該臨時(shí)文件替換舊的RDB文件,至此一次快照操作完成。

在執(zhí)行fork的時(shí)候操作系統(tǒng)(類Unix操作系統(tǒng))會(huì)使用寫時(shí)復(fù)制(copy-on-write)策略,即fork函數(shù)發(fā)生的一刻父子進(jìn)程共享同一內(nèi)存數(shù)據(jù),當(dāng)父進(jìn)程要更改其中某片數(shù)據(jù)時(shí)(如執(zhí)行一個(gè)寫命令 ),操作系統(tǒng)會(huì)將該片數(shù)據(jù)復(fù)制一份以保證子進(jìn)程的數(shù)據(jù)不受影響,所以新的RDB文件存儲(chǔ)的是執(zhí)行fork一刻的內(nèi)存數(shù)據(jù)。

Redis在進(jìn)行快照的過(guò)程中不會(huì)修改RDB文件,只有快照結(jié)束后才會(huì)將舊的文件替換成新的,也就是說(shuō)任何時(shí)候RDB文件都是完整的。這使得我們可以通過(guò)定時(shí)備份RDB文件來(lái)實(shí) 現(xiàn)Redis數(shù)據(jù)庫(kù)備份。RDB文件是經(jīng)過(guò)壓縮(可以配置rdbcompression參數(shù)以禁用壓縮節(jié)省CPU占用)的二進(jìn)制格式,所以占用的空間會(huì)小于內(nèi)存中的數(shù)據(jù)大小,更加利于傳輸。

除了自動(dòng)快照,還可以手動(dòng)發(fā)送SAVE或BGSAVE命令讓Redis執(zhí)行快照,兩個(gè)命令的區(qū)別在于,前者是由主進(jìn)程進(jìn)行快照操作,會(huì)阻塞住其他請(qǐng)求,后者會(huì)通過(guò)fork子進(jìn)程進(jìn)行快照操作。 Redis啟動(dòng)后會(huì)讀取RDB快照文件,將數(shù)據(jù)從硬盤載入到內(nèi)存。根據(jù)數(shù)據(jù)量大小與結(jié)構(gòu)和服務(wù)器性能不同,這個(gè)時(shí)間也不同。通常將一個(gè)記錄一千萬(wàn)個(gè)字符串類型鍵、大小為1GB的快照文件載入到內(nèi) 存中需要花費(fèi)20~30秒鐘。 通過(guò)RDB方式實(shí)現(xiàn)持久化,一旦Redis異常退出,就會(huì)丟失最后一次快照以后更改的所有數(shù)據(jù)。這就需要開(kāi)發(fā)者根據(jù)具體的應(yīng)用場(chǎng)合,通過(guò)組合設(shè)置自動(dòng)快照條件的方式來(lái)將可能發(fā)生的數(shù)據(jù)損失控制在能夠接受的范圍。如果數(shù)據(jù)很重要以至于無(wú)法承受任何損失,則可以考慮使用AOF方式進(jìn)行持久化。

AOF方式

默認(rèn)情況下Redis沒(méi)有開(kāi)啟AOF(append only file)方式的持久化,可以在redis.conf中通過(guò)appendonly參數(shù)開(kāi)啟:

appendonly yes

在啟動(dòng)時(shí)Redis會(huì)逐個(gè)執(zhí)行AOF文件中的命令來(lái)將硬盤中的數(shù)據(jù)載入到內(nèi)存中,載入的速度相較RDB會(huì)慢一些

開(kāi)啟AOF持久化后每執(zhí)行一條會(huì)更改Redis中的數(shù)據(jù)的命令,Redis就會(huì)將該命令寫入硬盤中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通過(guò)dir參數(shù)設(shè)置的,默認(rèn)的文件名是appendonly.aof,可以通過(guò)appendfilename參數(shù)修改:

appendfilename appendonly.aof

配置redis自動(dòng)重寫AOF文件的條件

auto-aof-rewrite-percentage 100  # 當(dāng)目前的AOF文件大小超過(guò)上一次重寫時(shí)的AOF文件大小的百分之多少時(shí)會(huì)再次進(jìn)行重寫,如果之前沒(méi)有重寫過(guò),則以啟動(dòng)時(shí)的AOF文件大小為依據(jù)

auto-aof-rewrite-min-size 64mb   # 允許重寫的最小AOF文件大小

配置寫入AOF文件后,要求系統(tǒng)刷新硬盤緩存的機(jī)制

# appendfsync always   # 每次執(zhí)行寫入都會(huì)執(zhí)行同步,最安全也最慢

appendfsync everysec   # 每秒執(zhí)行一次同步操作

# appendfsync no       # 不主動(dòng)進(jìn)行同步操作,而是完全交由操作系統(tǒng)來(lái)做(即每30秒一次),最快也最不安全

Redis允許同時(shí)開(kāi)啟AOF和RDB,既保證了數(shù)據(jù)安全又使得進(jìn)行備份等操作十分容易。此時(shí)重新啟動(dòng)Redis后Redis會(huì)使用AOF文件來(lái)恢復(fù)數(shù)據(jù),因?yàn)锳OF方式的持久化可能丟失的數(shù)據(jù)更少

redis = require('redis'),//導(dǎo)入js模塊
RDS_PORT = ,        //端口號(hào)
RDS_HOST = '',    //服務(wù)器IP
RDS_OPTS = {},            //設(shè)置項(xiàng)
redisdb = redis.createClient(RDS_PORT, RDS_HOST, RDS_OPTS);//創(chuàng)建連接
 
redisdb.select(20);//指定分區(qū)庫(kù)
 
redisdb.on('ready', function (res) {
    console.log('ready');
});
 
redisdb.on('connect', function () {
    console.log('connect');
});
exports.redisdb = redisdb;
 
function redis_opt(opt, key, value, callback) {
 
    if (opt == 'get') {
        redisdb.get(key, function (err, data) {
            if (err == null) {
                callback(data);
            }
            else {
                callback(err);
            }
        });
    }
    else if (opt == 'set')
    {
        redisdb.set(key,value, function (err,result) {
            if (err == null) {
                callback(result);
            }
            else {
                callback(err);
            }
        });
    }
    else if (opt == 'del')
    {
        redisdb.del(key, function (err, result) {
            if (err == null) {
                callback(result);
            }
            else {
                callback(err);
            }
        });
    }
    else
    {
        callback("error opt!");
    }
    
}
 
function update(key)
{
    redis_opt("get", key, null, function (data) {
        console.log("the redis data is " + data);
        if (data) {
            count = parseInt(data);
            redis_opt("set", key, ++count , function (data) {
                console.log("set " + count  + " " + data);
            });  
        }
        else {
            redis_opt("set", key, 10000, function (data) {
                console.log("set " + 10000 + " " + data);
            });  
        }
    });
 
 
 
 
 
    
 
 
   
 
 
}
 
function clear(key)
{
    redis_opt("del", key, null, function (ret) {
        console.log("del " + key + " " + ret);
    });  
}
 
 
 
function main()
{
 
    var key = "count_test";
 
    setInterval(function () { clear(key) }, 5000);
 
    setInterval(function () { update(key) }, 1000);
 
}
 
 
 
 
//testmain();
 
 
main();

以上代碼為簡(jiǎn)單的計(jì)時(shí)器函數(shù),即服務(wù)器啟動(dòng)后定時(shí)讀取redis的數(shù)據(jù),如果存在則累加修改,不存在則初始化,同時(shí)為了方便說(shuō)明,又設(shè)置了一個(gè)定時(shí)刪除數(shù)據(jù)的定時(shí)器。

redis實(shí)現(xiàn)服務(wù)器崩潰宕機(jī)的數(shù)據(jù)恢復(fù)方法

redis實(shí)現(xiàn)服務(wù)器崩潰宕機(jī)的數(shù)據(jù)恢復(fù)方法

關(guān)于redis實(shí)現(xiàn)服務(wù)器崩潰宕機(jī)的數(shù)據(jù)恢復(fù)方法就分享到這里了,當(dāng)然并不止以上和大家分析的辦法,不過(guò)小編可以保證其準(zhǔn)確性是絕對(duì)沒(méi)問(wèn)題的。希望以上內(nèi)容可以對(duì)大家有一定的參考價(jià)值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。


新聞名稱:redis實(shí)現(xiàn)服務(wù)器崩潰宕機(jī)的數(shù)據(jù)恢復(fù)方法
路徑分享:http://weahome.cn/article/pehsdh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部