Redis:06---數據庫管理


一、服務器中的數據庫

  • Redis服務器將所有數據庫都保存在服務器狀態redis.h/redisServer結構的db數組中,db數組的每個項都是一個redis.h/redisDb結構,每個redisDb結構代表一個數據庫:

struct redisServer {// ...redisDb *db; // 一個數組,保存著服務器中的所有數據庫// ...};

? ? ? ? 數據庫數量(dbnum屬性、database選項)

  • 數據庫的數量:在初始化服務器時,程序會根據服務器狀態的dbnum屬性來決定應該創建多少個數據庫:

struct redisServer {// ...int dbnum;//服務器的數據庫數量// ...};
  • dbnum屬性的值由服務器配置的database選項決定,默認情況下,該選項的值為16,所以Redis服務器默認會創建16個數據庫,如下圖所示:

  • dbsize命令可以返回當前數據庫中鍵的數量

 

二、數據庫的切換(SELECT命令)

  • 每個Redis客戶端都有自己的目標數據庫,每當客戶端執行數據庫寫命令或者數據庫讀命令的時候,目標數據庫就會成為這些命令的操作對象

  • 默認情況下,Redis客戶端的目標數據庫為0號數據庫,但客戶端可以通過執行SELECT命令來切換目標數據庫

  • 以下代碼示例演示了客戶端在0號數據庫設置并讀取鍵msg,之后切換到2號數據庫并執行類似操作的過程:

  • 這個推薦給大家一個好用的redis客戶端 RedisDesktopManager

  • 在服務器內部,客戶端狀態redisClient結構的db屬性記錄了客戶端當前的目標數據庫,這個屬性是一個指向redisDb結構的指針:

typedef struct redisClient {// ...redisDb *db;//記錄客戶端當前正在使用的數據庫// ...} redisClient;
  • redisClient.db指針指向redisServer.db數組的其中一個元素,而被指向的元素就是客戶端的目標數據庫

演示案例

  • 比如說,如果某個客戶端的目標數據庫為1號數據庫,那么這個客戶端所對應的客戶端狀態和服務器狀態之間的關系如下圖所示

  • 如果這時客戶端執行命令SELECT 2,將目標數據庫改為2號數據庫,那么客戶端狀態和服務器狀態之間的關系將更新成下圖所示

  • 通過修改redisClient.db指針,讓它指向服務器中的不同數據庫,從而實現切換目標數據庫的功能——這就是SELECT命令的實現原理

多數據庫功能已經逐漸弱化了

  • 那么能不能像使用測試數據庫和正式數據庫一樣,把正式的數據放在0號數據庫,測試的數據庫放在1號數據庫,那么兩者在數據上就不會彼此受影響了。事實真有那么好嗎?

  • Redis3.0中已經逐漸弱化這個功能,例如Redis的分布式實現Redis Cluster只允許使用0號數據庫,只不過為了向下兼容老版本的數據庫功能, 該功能沒有完全廢棄掉,下面分析一下為什么要廢棄掉這個“優秀”的功能 呢?總結起來有三點:

    • ·Redis是單線程的。如果使用多個數據庫,那么這些數據庫仍然是使用 一個CPU,彼此之間還是會受到影響的

    • 多數據庫的使用方式,會讓調試和運維不同業務的數據庫變的困難, 假如有一個慢查詢存在,依然會影響其他數據庫,這樣會使得別的業務方定 位問題非常的困難

    • 部分Redis的客戶端根本就不支持這種方式。即使支持,在開發的時候 來回切換數字形式的數據庫,很容易弄亂

  • 個人建議如果要使用多個數據庫功能,完全可以在一臺機器上部署多個Redis實例,彼此用端口來做區分,因為現代計算機或者服務器通常是有多 個CPU的。這樣既保證了業務之間不會受到影響,又合理地使用了CPU資源

三、清除數據庫(flushdb、flushall)

  • flushdb/flushall命令用于清除數據庫,兩者的區別的是:flushdb只清除當前數據庫,flushall會清除所有數據庫(老板最怕的就是刪庫跑路的員工了,所以最怕的技術是只會rm -rf的和刪庫的)

這兩個命令使用需要謹慎

  • flushdb/flushall命令會將所有數據清除,一旦誤操作后果不堪設想,后面的文章會介紹rename-command配置規避這個問題,以及如何在誤操作后快速恢復數據

  • 如果當前數據庫鍵值數量比較多,flushdb/flushall存在阻塞Redis的可能性

演示案例

  • 例如下面0號數據庫中有2個鍵,1號數據庫有1個鍵,我們使用flushdb只清空1號數據庫中的鍵

  • 我們在1號數據庫中使用flushall命令,此時會清除所有數據庫中的鍵

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444498.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444498.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444498.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode95. 不同的二叉搜索樹 II

給定一個整數 n,生成所有由 1 ... n 為節點所組成的二叉搜索樹。 示例: 輸入: 3 輸出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解釋: 以上的輸出對應以下 5 種不同結構的二叉搜索樹: 1 3 …

在同一局域網下連接共享文件夾失敗,提示:你不能訪問共享文件夾,因為你組織的安全策略阻止未經身份驗證的來賓訪問

1.嘗試打開guest訪問。 (1)使用鍵盤 win R 鍵,打開運行窗口,并輸入 gpedit.msc 打開本地組策略編輯器窗口 (2)選擇計算機配置------->管理模板-------->網絡-------->Lanman工作站。 &#…

(十五)深入淺出TCPIP之Hello CDN

什么是CDNCDN 其實是 Content Delivery Network 的縮寫,即“內容分發網絡”。CDN是將媒體資源,動靜態圖片(Flash) ,HTML, CSS, JS等等內容緩存到距離你更近的互聯網數據中心,從而讓用戶進行共享資源,實現縮減站點間的響…

Redis:07---Redis數據結構

一、五大數據結構Redis可以存儲鍵與5種不同數據結構類型之間的映射,這5種數據結構類型分別為:STRING:字符串LIST:列表SET:集合HASH:散列ZSET:有序集合TYPE命令用來獲得鍵的數據類型,…

C++:14---虛繼承,虛函數,多態

一、多級混合繼承 下面先介紹菱形繼承 //菱形繼承 class A { public: int data; }; class B:public A { public: int data; }; class C:public A { public: int data; }; class D:public B,public C { public: int data; };int main() { D c; D.data=1; D.B::data=2;//訪問B中的…

(十四)nodejs循序漸進-高性能游戲服務器框架pomelo之開發Treasures游戲

#Tutorial 2 -- Treasures ##描述 Treasures 游戲是從 LordOfPomelo 中抽取出來,去掉了大量的游戲邏輯,用以更好的展示 Pomelo 框架的用法以及運作機制。 Treasures 很簡單,輸入一個用戶名后,會隨機得到一個游戲角色,…

leetcode243. 最短單詞距離(vip題)好像挺簡單?

給定一個單詞列表和兩個單詞 word1 和 word2,返回列表中這兩個單詞之間的最短距離。 示例: 假設 words ["practice", "makes", "perfect", "coding", "makes"] 輸入: word1 “coding”, word2 “practice”…

談談蘋果應用內支付(IAP)的坑

一、請求商品 下面是請求商品的代碼: - (void)validateProductIdentifier:(NSArray *)productIdentifier {SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifier]];self.request = productRe…

leetcode204. 計數質數(vip題)

統計所有小于非負整數 n 的質數的數量。 示例: 輸入: 10 輸出: 4 解釋: 小于 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。 思路:篩法,見代碼。 class Solution {public int countPrimes(int n) {// 1. 給數加上標記byte[] nums new byte[n];for (i…

如何使得客戶端和服務器端完美配合做IOS應用內付費

配置Developer.apple.com 登錄到Developer.apple.com,然后進行以下步驟: 為應用建立建立一個不帶通配符的App ID用該App ID生成和安裝相應的Provisioning Profile文件。配置iTunes Connect 登錄到iTunes Connet,然后進行以下步驟: 用該App ID創建一個新的應用。在該應用中…

IOS內購流程從0-1手把手教會

蘋果掌握著可能是全球最重要的APP分發渠道,然而30%的抽成近年來也被人批評,現在蘋果似乎也看到反對意見了,從2021年1月1日開始,部分小型企業的分成費用降低到15%。 據報道,蘋果將于2021年1月1日啟動App Store小企業項目,會降低他們的抽成費用。針對年收入不足100萬美元的…

leetcode217. 存在重復元素(vip題)超簡單

給定一個整數數組,判斷是否存在重復元素。 如果任何值在數組中出現至少兩次,函數返回 true。如果數組中每個元素都不相同,則返回 false。 示例 1: 輸入: [1,2,3,1] 輸出: true 示例 2: 輸入: [1,2,3,4] 輸出: false 示例 3: 輸入: [1,1,…

訂單數據持久化和驗證相關解決方案

訂單數據持久化 有時候蘋果支付在支付完成后,從蘋果服務器返回收據的過程中可能會掉單(可能是網絡問題,可能是蘋果BUG,也有一部分是開發者自身埋的坑),因此我們需要一個訂單持久化的機制來保障。 首先根據內購商品ID(此商品ID是在蘋果后臺建好的內購商品)、用戶信息(…

IOS iap處理邏輯流程圖再次梳理

序言: 本文補全一下iOS iap處理邏輯。 iap處理邏輯 蘋果退單wiki:https://developer.apple.com/documentation/storekit/in-app_purchase/handling_refund_notifications 一、上圖主要處理了以下業務: 普通購買 自動續訂訂閱 補單處理 預防黑產 退單處理 二、除了上述業…

(十七)深入淺出TCPIP之HTTP和HTTPS

超文本傳輸協議HTTP協議被用于在Web瀏覽器和網站服務器之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此&…

leetcode283. 移動零 比官方更好的解法。

給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。 示例: 輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0] 說明: 必須在原數組上操作,不能拷貝額外的數組。 盡量減少操作次數。 思路:記錄0的個…

C++:15---異常機制

1.概念:異常處理是一種允許兩個獨立開發的程序組件在程序執行時遇到不正常的情況相互通信的工具 2.異常檢測和異常處理的方式throw表達式:程序遇到了錯誤或者無法處理的問題,使用throw引發異常try、catch語句塊:以關鍵字tyr開始,并以一個或多個catch子句結束。它們也被稱為…

Redis:08---字符串對象

一、字符串對象概述字符串類型是Redis最基礎的數據結構。首先鍵都是字符串類型,而且其他幾種數據結構都是在字符串類型基礎上構建的,所以字符串類型能為其他四種數據結構的學習奠定基礎字符串就是一個由字節組成的序列如下圖所示,字符串類型的…

leetcode252. 會議室

給定一個會議時間安排的數組&#xff0c;每個會議時間都會包括開始和結束的時間 [[s1,e1],[s2,e2],...] (si < ei)&#xff0c;請你判斷一個人是否能夠參加這里面的全部會議。 示例 1: 輸入: [[0,30],[5,10],[15,20]] 輸出: false 示例 2: 輸入: [[7,10],[2,4]] 輸出: tr…

(十八)深入淺出TCPIP之epoll的一些思考

Epoll基本介紹在linux的網絡編程中&#xff0c;很長的時間都在使用select來做事件觸發。在linux新的內核中&#xff0c;有了一種替換它的機制&#xff0c;就是epoll。相比于 select&#xff0c;epoll最大的好處在于它不會隨著監聽fd數目的增長而降低效率。因為在內核中的select…