最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis中的RDB用法原理及說(shuō)明

 更新時(shí)間:2025年09月29日 11:06:49   作者:你是橙子那我是誰(shuí)  
Redis RDB是通過(guò)fork子進(jìn)程生成內(nèi)存數(shù)據(jù)快照的持久化機(jī)制,采用寫(xiě)時(shí)復(fù)制(COW)技術(shù),確保數(shù)據(jù)一致性,優(yōu)點(diǎn):性能高、恢復(fù)快;缺點(diǎn):可能丟失最后一次持久化后的數(shù)據(jù),常用于備份,建議與AOF結(jié)合使用以兼顧安全與效率

開(kāi)篇:數(shù)據(jù)備份的日常比喻

想象一下,你正在玩一個(gè)電子游戲,游戲進(jìn)度非常重要。突然,電腦要重啟更新,你會(huì)怎么做?聰明的玩家都會(huì)先保存游戲進(jìn)度。Redis中的RDB(Redis Database)就像這個(gè)"保存游戲進(jìn)度"的功能,它能在特定時(shí)刻將內(nèi)存中的數(shù)據(jù)快照保存到磁盤(pán)上,確保數(shù)據(jù)安全。

就像我們拍照記錄重要時(shí)刻一樣,RDB是Redis的一種持久化方式,它通過(guò)創(chuàng)建數(shù)據(jù)快照來(lái)保存數(shù)據(jù)庫(kù)狀態(tài)。與另一種持久化方式AOF(Append Only File)不同,RDB更像是定期拍照,而AOF則像是記錄所有操作的日記本。今天,我們就來(lái)深入探討RDB的工作原理和實(shí)現(xiàn)細(xì)節(jié)。

小知識(shí): Redis默認(rèn)同時(shí)支持RDB和AOF兩種持久化方式,但生產(chǎn)環(huán)境中通常建議同時(shí)開(kāi)啟兩者,以獲得更好的數(shù)據(jù)安全性和恢復(fù)能力。

RDB的整體執(zhí)行流程

理解了RDB的基本概念后,我們來(lái)看它的整體執(zhí)行流程。RDB的創(chuàng)建過(guò)程可以比作給一個(gè)快速移動(dòng)的物體拍照——我們需要在瞬間捕捉完整狀態(tài),同時(shí)盡量減少對(duì)正常操作的影響。

以上流程圖說(shuō)明了RDB保存的基本過(guò)程:首先由某個(gè)條件觸發(fā)保存操作,然后主進(jìn)程fork出一個(gè)子進(jìn)程專(zhuān)門(mén)負(fù)責(zé)將數(shù)據(jù)寫(xiě)入RDB文件,寫(xiě)入完成后替換舊的RDB文件,最后清理臨時(shí)文件。

觸發(fā)RDB保存的條件

Redis提供了多種觸發(fā)RDB保存的方式,就像我們可以設(shè)置鬧鐘提醒自己定期備份重要文件一樣:

  1. 手動(dòng)觸發(fā): 通過(guò)執(zhí)行SAVE或BGSAVE命令
  2. 自動(dòng)觸發(fā): 根據(jù)配置文件中的save規(guī)則自動(dòng)執(zhí)行
  3. 其他情況: 如主從復(fù)制時(shí)、執(zhí)行shutdown命令時(shí)等

注意: SAVE命令會(huì)阻塞Redis服務(wù)器進(jìn)程,直到RDB文件創(chuàng)建完畢,期間不能處理任何命令請(qǐng)求。而B(niǎo)GSAVE命令會(huì)派生一個(gè)子進(jìn)程來(lái)創(chuàng)建RDB文件,服務(wù)器進(jìn)程可以繼續(xù)處理命令請(qǐng)求。

RDB的技術(shù)實(shí)現(xiàn)原理

了解了整體流程后,我們深入看看RDB的技術(shù)實(shí)現(xiàn)細(xì)節(jié)。Redis的RDB持久化功能主要通過(guò)以下幾個(gè)關(guān)鍵組件實(shí)現(xiàn):

這個(gè)類(lèi)圖展示了Redis中與RDB持久化相關(guān)的主要組件及其關(guān)系。

RedisServer包含多個(gè)數(shù)據(jù)庫(kù)(db)和保存參數(shù)(saveparams),通過(guò)rdbSaveBackground()或rdbSave()方法將數(shù)據(jù)寫(xiě)入RDBFile。

RedisObject則是Redis中所有數(shù)據(jù)類(lèi)型的基類(lèi),負(fù)責(zé)數(shù)據(jù)的序列化。

RDB文件格式解析

RDB文件是一個(gè)二進(jìn)制文件,其格式設(shè)計(jì)得非常緊湊。我們可以把它想象成一本書(shū),有特定的章節(jié)和排版規(guī)則:

        +-------+---------+--------+-------+-------+---------+------+-------+
        | REDIS | RDB版本 | 數(shù)據(jù)庫(kù) | 鍵值對(duì) | 更多鍵值對(duì) | ... | 結(jié)束符 | 校驗(yàn)和 |
        +-------+---------+--------+-------+-------+---------+------+-------+
    

讓我們用Java代碼模擬一下RDB文件的寫(xiě)入過(guò)程(雖然實(shí)際Redis是用C實(shí)現(xiàn)的,但原理相同):

public class RDBWriter {
    private OutputStream out;
    
    public void writeRedisDB(Map<String, Object> db) throws IOException {
        // 寫(xiě)入REDIS魔數(shù)
        out.write("REDIS".getBytes());
        
        // 寫(xiě)入RDB版本號(hào)
        writeLength(6);  // 假設(shè)版本是0006
        
        // 寫(xiě)入數(shù)據(jù)庫(kù)內(nèi)容
        for (Map.Entry<String, Object> entry : db.entrySet()) {
            // 寫(xiě)入鍵值對(duì)
            writeString(entry.getKey());
            writeObject(entry.getValue());
        }
        
        // 寫(xiě)入結(jié)束符
        out.write(0xFF);
        
        // 寫(xiě)入校驗(yàn)和
        writeCRC64();
    }
    
    private void writeObject(Object value) throws IOException {
        if (value instanceof String) {
            writeString((String) value);
        } else if (value instanceof List) {
            writeList((List<?>) value);
        }
        // 其他類(lèi)型處理...
    }
    
    // 其他輔助方法...
}

上述代碼模擬了RDB文件的基本寫(xiě)入過(guò)程:首先寫(xiě)入魔數(shù)和版本號(hào),然后依次寫(xiě)入數(shù)據(jù)庫(kù)中的每個(gè)鍵值對(duì),最后寫(xiě)入結(jié)束符和校驗(yàn)和。實(shí)際Redis的實(shí)現(xiàn)要復(fù)雜得多,包括各種數(shù)據(jù)類(lèi)型的優(yōu)化編碼等。

RDB持久化的詳細(xì)步驟解析

現(xiàn)在,讓我們像拆解時(shí)鐘一樣,一步步分析RDB持久化的詳細(xì)過(guò)程。這個(gè)過(guò)程可以分為準(zhǔn)備階段、數(shù)據(jù)寫(xiě)入階段和收尾階段。

這個(gè)序列圖展示了BGSAVE命令的執(zhí)行過(guò)程:

  1. 客戶端發(fā)送BGSAVE命令
  2. Redis服務(wù)器fork出子進(jìn)程
  3. 子進(jìn)程負(fù)責(zé)將數(shù)據(jù)寫(xiě)入臨時(shí)RDB文件
  4. 完成后通知主進(jìn)程
  5. 主進(jìn)程原子性地重命名文件替換舊RDB文件
  6. 最后向客戶端返回成功

1. 準(zhǔn)備階段

當(dāng)Redis需要執(zhí)行RDB持久化時(shí)(無(wú)論是自動(dòng)還是手動(dòng)觸發(fā)),首先會(huì)進(jìn)行以下準(zhǔn)備工作:

  1. 檢查是否有其他RDB或AOF持久化操作正在進(jìn)行,避免沖突
  2. 調(diào)用fork()創(chuàng)建子進(jìn)程(如果是BGSAVE)
  3. 準(zhǔn)備臨時(shí)文件用于寫(xiě)入數(shù)據(jù)

2. 數(shù)據(jù)寫(xiě)入階段

子進(jìn)程開(kāi)始將內(nèi)存中的數(shù)據(jù)寫(xiě)入磁盤(pán),這個(gè)過(guò)程需要考慮以下幾點(diǎn):

  • 數(shù)據(jù)一致性: fork出的子進(jìn)程擁有父進(jìn)程的內(nèi)存快照,保證數(shù)據(jù)一致性
  • 漸進(jìn)式掃描: 不是一次性掃描所有數(shù)據(jù),而是分批處理避免長(zhǎng)時(shí)間阻塞
  • 壓縮存儲(chǔ): 對(duì)數(shù)據(jù)進(jìn)行壓縮存儲(chǔ),節(jié)省磁盤(pán)空間

3. 收尾階段

當(dāng)所有數(shù)據(jù)寫(xiě)入完成后,還需要進(jìn)行一些收尾工作:

  1. 將臨時(shí)文件原子性地重命名為正式的RDB文件
  2. 更新lastsave時(shí)間戳和dirty計(jì)數(shù)器
  3. 清理舊的臨時(shí)文件(如果有)

性能提示: RDB文件寫(xiě)入過(guò)程中,Redis采用了Copy-on-Write(寫(xiě)時(shí)復(fù)制)技術(shù)。這意味著只有在數(shù)據(jù)被修改時(shí)才會(huì)真正復(fù)制內(nèi)存,大大減少了fork操作的開(kāi)銷(xiāo)。

RDB的優(yōu)缺點(diǎn)分析

了解了RDB的實(shí)現(xiàn)原理后,我們有必要像評(píng)估工具一樣分析它的優(yōu)缺點(diǎn),以便在實(shí)際應(yīng)用中做出合理選擇。

RDB的優(yōu)點(diǎn)詳解

1. 性能高: RDB持久化通過(guò)fork子進(jìn)程處理,主進(jìn)程幾乎不受影響,可以繼續(xù)提供服務(wù)。

2. 文件緊湊: RDB文件是二進(jìn)制格式,經(jīng)過(guò)壓縮,占用空間小。

3. 恢復(fù)速度快: 相比AOF需要重放所有操作,RDB恢復(fù)只需加載一次文件,速度更快。

4. 適合備份: 緊湊的二進(jìn)制文件非常適合用于備份和災(zāi)難恢復(fù)。

RDB的缺點(diǎn)詳解

1. 可能丟失數(shù)據(jù): 如果兩次RDB持久化之間Redis崩潰,這段時(shí)間的數(shù)據(jù)會(huì)丟失。

2. fork可能阻塞: 當(dāng)數(shù)據(jù)集很大時(shí),fork操作可能會(huì)阻塞主進(jìn)程,尤其是在虛擬內(nèi)存不足的情況下。

3. 大數(shù)據(jù)量時(shí)耗時(shí): 數(shù)據(jù)集很大時(shí),RDB持久化過(guò)程可能較耗時(shí),影響備份頻率。

生產(chǎn)環(huán)境建議: 對(duì)于不能容忍數(shù)據(jù)丟失的場(chǎng)景,建議將RDB和AOF持久化結(jié)合使用。RDB用于定期備份和快速恢復(fù),AOF用于保證數(shù)據(jù)安全性。

RDB相關(guān)配置參數(shù)

就像調(diào)整相機(jī)參數(shù)可以獲得更好的照片一樣,我們可以通過(guò)配置Redis參數(shù)來(lái)優(yōu)化RDB持久化的行為。以下是幾個(gè)重要的配置參數(shù):

這個(gè)用戶旅程圖展示了RDB的主要配置參數(shù)及其作用。我們可以設(shè)置多個(gè)save條件,配置壓縮和校驗(yàn)和選項(xiàng),以及決定bgsave出錯(cuò)時(shí)的行為。

關(guān)鍵配置說(shuō)明

1. save <seconds> <changes>:設(shè)置觸發(fā)RDB保存的條件。可以配置多個(gè)save指令,只要滿足任意一個(gè)就會(huì)觸發(fā)保存。

2. rdbcompression yes/no:是否對(duì)RDB文件進(jìn)行壓縮。壓縮可以節(jié)省磁盤(pán)空間,但會(huì)增加CPU使用率。

3. rdbchecksum yes/no:是否在RDB文件末尾添加校驗(yàn)和。啟用后Redis加載RDB文件時(shí)會(huì)驗(yàn)證校驗(yàn)和。

4. stop-writes-on-bgsave-error yes/no:當(dāng)bgsave出錯(cuò)時(shí)是否停止接收寫(xiě)入操作。建議設(shè)置為yes以保證數(shù)據(jù)一致性。

下面是一個(gè)典型的Redis配置文件中RDB相關(guān)的部分:

# 每900秒(15分鐘)如果至少有1個(gè)鍵改變,則保存
save 900 1

# 每300秒(5分鐘)如果至少有10個(gè)鍵改變,則保存
save 300 10

# 每60秒如果至少有10000個(gè)鍵改變,則保存
save 60 10000

# RDB文件名
dbfilename dump.rdb

# 工作目錄(RDB文件會(huì)保存在這里)
dir /var/lib/redis

# 啟用RDB文件壓縮
rdbcompression yes

# 啟用RDB文件校驗(yàn)和
rdbchecksum yes

# 當(dāng)bgsave出錯(cuò)時(shí)停止寫(xiě)入
stop-writes-on-bgsave-error yes

這個(gè)配置示例展示了生產(chǎn)環(huán)境中常見(jiàn)的RDB配置。通過(guò)合理設(shè)置這些參數(shù),我們可以在數(shù)據(jù)安全性和性能之間取得平衡。

RDB與AOF的對(duì)比

就像選擇相機(jī)拍照還是錄像一樣,我們需要根據(jù)場(chǎng)景選擇合適的持久化方式。Redis提供了RDB和AOF兩種持久化機(jī)制,它們各有特點(diǎn)。

這個(gè)實(shí)體關(guān)系圖展示了Redis持久化的兩種實(shí)現(xiàn)方式RDB和AOF及其特性對(duì)比。RDB采用二進(jìn)制快照格式,恢復(fù)快但可能丟失數(shù)據(jù);AOF采用文本追加格式,數(shù)據(jù)安全性高但恢復(fù)慢。

RDB與AOF的主要區(qū)別

特性RDBAOF
持久化方式定時(shí)快照記錄每個(gè)寫(xiě)操作
數(shù)據(jù)安全性可能丟失最后一次持久化后的數(shù)據(jù)根據(jù)fsync策略,最多丟失1秒數(shù)據(jù)
恢復(fù)速度慢(需要重放所有操作)
文件大小小(二進(jìn)制壓縮)大(文本格式)
性能影響fork時(shí)可能有短暫阻塞取決于fsync策略

混合持久化: Redis 4.0引入了RDB-AOF混合持久化模式,結(jié)合了兩者的優(yōu)點(diǎn)。在這種模式下,AOF文件包含兩部分:RDB格式的全量數(shù)據(jù)和后續(xù)的增量AOF數(shù)據(jù)。

RDB的最佳實(shí)踐

就像攝影師需要掌握拍照技巧一樣,我們需要了解RDB的最佳使用方式。以下是我在實(shí)際工作中總結(jié)的一些經(jīng)驗(yàn):

這個(gè)流程圖展示了使用RDB持久化的最佳實(shí)踐流程:從評(píng)估數(shù)據(jù)重要性開(kāi)始,配置合理的save規(guī)則,監(jiān)控執(zhí)行情況,定期備份文件,最后測(cè)試恢復(fù)流程確保一切正常。

具體實(shí)踐建議

1. 根據(jù)數(shù)據(jù)重要性配置save規(guī)則: 對(duì)于關(guān)鍵數(shù)據(jù),可以設(shè)置更頻繁的保存間隔,如"save 60 1000"表示60秒內(nèi)如果有1000次寫(xiě)入就保存。

2. 監(jiān)控RDB執(zhí)行情況: 通過(guò)Redis的INFO命令可以監(jiān)控RDB的執(zhí)行情況,包括上次成功保存時(shí)間、是否正在保存等。

3. 定期備份RDB文件: 即使開(kāi)啟了RDB持久化,也應(yīng)定期將RDB文件備份到其他位置,防止單點(diǎn)故障。

4. 測(cè)試恢復(fù)流程: 定期測(cè)試從RDB文件恢復(fù)數(shù)據(jù)的過(guò)程,確保在真正需要時(shí)能夠順利恢復(fù)。

5. 合理設(shè)置內(nèi)存: 確保系統(tǒng)有足夠的內(nèi)存,避免fork時(shí)因內(nèi)存不足導(dǎo)致問(wèn)題。

下面是一個(gè)Java示例,展示如何通過(guò)Jedis監(jiān)控RDB持久化狀態(tài):

import redis.clients.jedis.Jedis;

public class RDBSaveMonitor {
    public static void main(String[] args) {
        try (Jedis jedis = new Jedis("localhost")) {
            // 獲取持久化信息
            String info = jedis.info("persistence");
            
            // 解析相關(guān)信息
            String[] lines = info.split("\r\n");
            for (String line : lines) {
                if (line.startsWith("rdb_last_save_time") || 
                    line.startsWith("rdb_last_bgsave_status") ||
                    line.startsWith("rdb_last_bgsave_time_sec")) {
                    System.out.println(line);
                }
            }
            
            // 手動(dòng)觸發(fā)BGSAVE并檢查結(jié)果
            String bgsaveResult = jedis.bgsave();
            System.out.println("BGSAVE result: " + bgsaveResult);
        }
    }
}

這段代碼展示了如何通過(guò)Jedis獲取Redis的持久化信息,特別是RDB相關(guān)的狀態(tài)信息,以及如何手動(dòng)觸發(fā)BGSAVE操作。

在實(shí)際監(jiān)控系統(tǒng)中,我們可以定期檢查這些指標(biāo),確保RDB持久化正常工作。

總結(jié)

通過(guò)今天的探討,我們深入了解了Redis中RDB持久化的各個(gè)方面。讓我們回顧一下本文的主要內(nèi)容:

  1. RDB概述: 了解了RDB是什么以及它的基本工作原理,通過(guò)生活化的比喻理解了它的作用。
  2. 執(zhí)行流程: 分析了RDB持久化的整體流程,包括觸發(fā)條件、fork子進(jìn)程和文件替換過(guò)程。
  3. 技術(shù)實(shí)現(xiàn): 深入研究了RDB的技術(shù)實(shí)現(xiàn)細(xì)節(jié),包括文件格式、寫(xiě)入過(guò)程和關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
  4. 步驟解析: 詳細(xì)拆解了RDB持久化的每個(gè)步驟,從準(zhǔn)備階段到數(shù)據(jù)寫(xiě)入再到收尾工作。
  5. 優(yōu)缺點(diǎn)分析: 客觀評(píng)估了RDB的優(yōu)勢(shì)和局限性,幫助我們?cè)趯?shí)際應(yīng)用中做出合理選擇。
  6. 配置參數(shù): 介紹了RDB相關(guān)的關(guān)鍵配置參數(shù)及其調(diào)優(yōu)建議。
  7. 與AOF對(duì)比: 比較了RDB和AOF兩種持久化方式的區(qū)別,理解了各自的適用場(chǎng)景。
  8. 最佳實(shí)踐: 分享了在實(shí)際工作中使用RDB的經(jīng)驗(yàn)和技巧,幫助大家避免常見(jiàn)陷阱。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis如何實(shí)現(xiàn)分布式鎖

    Redis如何實(shí)現(xiàn)分布式鎖

    這篇文章主要介紹了Redis如何實(shí)現(xiàn)分布式鎖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • redis中RedissonLock如何實(shí)現(xiàn)等待鎖的

    redis中RedissonLock如何實(shí)現(xiàn)等待鎖的

    本文主要介紹了redis中RedissonLock如何實(shí)現(xiàn)等待鎖的,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Redis數(shù)據(jù)一致性詳解

    Redis數(shù)據(jù)一致性詳解

    文章主要討論了分布式系統(tǒng)中的數(shù)據(jù)一致性模型、緩存使用場(chǎng)景以及數(shù)據(jù)同步策略,一致性模型包括強(qiáng)一致性、弱一致性和最終一致性,緩存使用場(chǎng)景主要在高并發(fā)讀取數(shù)據(jù)時(shí)提升性能,數(shù)據(jù)同步策略分為先刪除緩存再更新數(shù)據(jù)庫(kù)和先更新數(shù)據(jù)庫(kù)再刪除緩存兩種
    2024-11-11
  • redis樂(lè)觀鎖與悲觀鎖的實(shí)戰(zhàn)?

    redis樂(lè)觀鎖與悲觀鎖的實(shí)戰(zhàn)?

    Redis提供了兩種鎖機(jī)制,即樂(lè)觀鎖和悲觀鎖。本文主要介紹了redis樂(lè)觀鎖與悲觀鎖的實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Redis數(shù)據(jù)庫(kù)安裝部署及基本操作詳解

    Redis數(shù)據(jù)庫(kù)安裝部署及基本操作詳解

    這篇文章主要介紹了Redis數(shù)據(jù)庫(kù)安裝部署及基本操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 淺析Redis中紅鎖RedLock的實(shí)現(xiàn)原理

    淺析Redis中紅鎖RedLock的實(shí)現(xiàn)原理

    RedLock?是一種分布式鎖的實(shí)現(xiàn)算法,由?Redis?的作者?Salvatore?Sanfilippo(也稱為?Antirez)提出,本文主要為大家詳細(xì)介紹了紅鎖RedLock的實(shí)現(xiàn)原理,感興趣的可以了解下
    2024-02-02
  • Redis排查大key的3種方法小結(jié)

    Redis排查大key的3種方法小結(jié)

    本文主要介紹了Redis排查大key的3種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Redis消息隊(duì)列的三種實(shí)現(xiàn)方式

    Redis消息隊(duì)列的三種實(shí)現(xiàn)方式

    本文主要介紹了Redis消息隊(duì)列的三種實(shí)現(xiàn)方式,主要包括List實(shí)現(xiàn)消息隊(duì)列,PubSub消息隊(duì)列,Stream消息隊(duì)列,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Redis中Redlock算法的具體使用

    Redis中Redlock算法的具體使用

    Redlock是Redis提供的分布式鎖算法,通過(guò)多個(gè)獨(dú)立Redis實(shí)例實(shí)現(xiàn)高可用的分布式鎖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-10-10
  • 解決redis啟動(dòng)的警告日志問(wèn)題

    解決redis啟動(dòng)的警告日志問(wèn)題

    這篇文章主要介紹了解決redis啟動(dòng)的警告日志問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

金山区| 颍上县| 潜山县| 榆中县| 黄陵县| 普宁市| 防城港市| 射洪县| 福鼎市| 包头市| 太保市| 株洲县| 区。| 无锡市| 承德市| 济源市| 贵南县| 呼和浩特市| 石泉县| 沙河市| 潮安县| 邵东县| 桂平市| 奎屯市| 会理县| 兰考县| 广河县| 夏河县| 比如县| 眉山市| 孟津县| 黄陵县| 敖汉旗| 潍坊市| 凌源市| 兰坪| 甘泉县| 塘沽区| 衢州市| 曲周县| 陆丰市|