1. thinkphp redis 怎麼選擇資料庫
1、redis 中的每一個資料庫,都由一個 redisDb 的結構存儲。其中,redisDb.id 存儲著 redis 資料庫以整數表示的號碼。redisDb.dict 存儲著該庫所有的鍵值對數據。redisDb.expires 保存著每一個鍵的過期時間。
2、當redis 伺服器初始化時,會預先分配 16 個資料庫(該數量可以通過配置文件配置),所有資料庫保存到結構 redisServer 的一個成員 redisServer.db 數組中。當我們選擇資料庫 select number 時,程序直接通過 redisServer.db[number] 來切換資料庫。有時候當程序需要知道自己是在哪個資料庫時,直接讀取 redisDb.id 即可。
3、既然我們知道一個資料庫的所有鍵值都存儲在redisDb.dict中,那麼我們要知道如果找到key的位置,就有必要了解一下dict 的結構了:
typedef struct dict {
// 特定於類型的處理函數
dictType *type;
// 類型處理函數的私有數據
void *privdata;
// 哈希表(2個)
dictht ht[2];
// 記錄 rehash 進度的標志,值為-1 表示 rehash 未進行
int rehashidx;
// 當前正在運作的安全迭代器數量
int iterators;
} dict;
由上述的結構可以看出,redis 的字典使用哈希表作為其底層實現。dict 類型使用的兩個指向哈希表的指針,其中 0 號哈希表(ht[0])主要用於存儲資料庫的所有鍵值,而1號哈希表主要用於程序對 0 號哈希表進行 rehash 時使用,rehash 一般是在添加新值時會觸發,這里不做過多的贅述。所以redis 中查找一個key,其實就是對進行該dict 結構中的 ht[0] 進行查找操作。
4、既然是哈希,那麼我們知道就會有哈希碰撞,那麼當多個鍵哈希之後為同一個值怎麼辦呢?redis採取鏈表的方式來存儲多個哈希碰撞的鍵。也就是說,當根據key的哈希值找到該列表後,如果列表的長度大於1,那麼我們需要遍歷該鏈表來找到我們所查找的key。當然,一般情況下鏈表長度都為是1,所以時間復雜度可看作o(1)。
二、當redis 拿到一個key 時,如果找到該key的位置。
了解了上述知識之後,我們就可以來分析redis如果在內存找到一個key了。
1、當拿到一個key後, redis 先判斷當前庫的0號哈希表是否為空,即:if (dict->ht[0].size == 0)。如果為true直接返回NULL。
2、判斷該0號哈希表是否需要rehash,因為如果在進行rehash,那麼兩個表中者有可能存儲該key。如果正在進行rehash,將調用一次_dictRehashStep方法,_dictRehashStep 用於對資料庫字典、以及哈希鍵的字典進行被動 rehash,這里不作贅述。
3、計算哈希表,根據當前字典與key進行哈希值的計算。
4、根據哈希值與當前字典計算哈希表的索引值。
5、根據索引值在哈希表中取出鏈表,遍歷該鏈表找到key的位置。一般情況,該鏈表長度為1。
6、當 ht[0] 查找完了之後,再進行了次rehash判斷,如果未在rehashing,則直接結束,否則對ht[1]重復345步驟。
到此我們就找到了key在內存中的位置了。
2. php問題-選擇資料庫
你這些語句都不是選擇資料庫的,標題好像不合適:)
明明那麼多句,你問這句話是什麼意思,你究竟是指的哪句:)
言歸正傳,你的程序段是一般資料庫操作的基本模板,學懂了這幾句以後寫什麼資料庫操作都不難了,我把你這些語句一一注釋一下:
$sql="select sum(num) as total_num from vote";
//這一句第一層意思從PHP角度理解,就是定義一個字元串變數,值是引號裡面的那些,無論那些字元串是什麼命令,此時僅僅是賦值,並不運行
//從MYSQL的角度理解,這是一個資料庫命令,獲取資料庫裡面vote表的記錄數量,並作為名total_num返回
$result=mysql_query($sql);
//這一句讓MYSQL資料庫運行變數$sql裡面的語句,結果存入$result中
$myarray=mysql_fetch_array($result);
//這一句獲取執行結果$result裡面的一行返回數據,取到數組$myarray中
$total_num=$myarray["total_num"];
//這一句把數組變數$myarray裡面名字叫做total_num的元素賦給變數$total_num
3. php中選擇打開資料庫的方法是
在mysql資料庫中,創建一個test資料庫,用於測試。
總結:
1、創建一個test資料庫。
2、使用mysql_connect()函數創建一個資料庫的連接。
3、再使用mysql_select_db()函數選擇要操作的資料庫test,並通過if語句判斷結果。
4. php 用什麼資料庫最好,最穩定
mysql資料庫和oracle的區別和選擇:LAMP大會的時候我跟Yahoo的一個技術高管聊的時候,我問他Yahoo在選擇MySQL還是Oracle的時候是怎麼考慮,他的答案令我非常驚訝。他說大部分的時候我們是會用MySQL的,因為它的性能已經達到我們的要求。但是什麼時候我們會選用Oracle呢,就是當我們需要存儲收費用戶的數據的時候。我就問為什麼,難道Oracle比MySQL穩定嗎?他說,這個倒沒有特別考慮。關鍵是如果使用Oracle的話,當出現問題的時候我們可以找到負責人,Oracle會負責事故的處理,但是如果用MySQL的話,我們找誰去?
5. thinkphp 用redis 怎麼選擇資料庫
再配置一個資料庫連接,設置默認資料庫是redis,第二個資料庫可選使用,比如:
$model=newModel();
$data=$model->db(1,'db2')->query($sql);//db2是在配置里的另外一個資料庫連接