Redis的簡單實現之數據庫——Java

redis是一個鍵值對的數據庫服務器,本節將對redis的數據庫實現進行簡單介紹,並用java於語言進行簡單翻譯。說明服務器保存數據的方法,客戶端切換數據庫的方法,以及數據的添加、刪除、更新、查詢等操作。

1、服務器中的數據庫結構

redis服務器將所有的數據庫的數據狀態保存在redisServer類中,其中dbnum屬性表示數據庫的數量(默認爲16,改屬性可配置redis.conf),每一個db數組屬性對應着一個數據庫,java代碼如下:

class RedisServer {
	//數據庫的數量
	int dbnum;
	//所有的數據庫
	RedisDB[] db;
	//....
}

其中redis服務器中的每一個數據庫對應一個RedisDB對象,其中RedisDB類中的dict屬性保存了數據庫中的所有鍵值對,因此稱爲這個字典爲鍵空間。
因爲數據庫中的鍵總是字符串類型,而值有多種數據類型string、hash、list、set、zset等,因此在java中可以使用string表示鍵,object表示所有的值,java代碼如下:

class RedisDB {
	//因爲保存的是鍵值對,所有使用map進行存儲
	//數據庫中的鍵空間,保存着數據庫中所有的鍵值對
	Map<String, Object> dict;
	//.....
}

舉一個例子,當我們在redis的數據執行以下操作的時候:

在這裏插入圖片描述
鍵空間將會是如下結構的展示的樣子:
在這裏插入圖片描述
實際上對數據庫的鍵的添加、刪除、修改和查詢操作,其實都是對鍵空間dict的具體操作。從java代碼上看來,就是對Map數據的操作。

2. 對鍵的操作代碼實現

添加操作:添加一個鍵到數據庫,需要判斷鍵是否存在,如果存在則覆蓋原先的值,否則就添加一個新的鍵值對。
修改操作:其實也是添加操作的一種,只不過該鍵已存在,會覆蓋掉原來的值。
查詢操作:就是查詢具體的鍵。
刪除操作:刪除對應的鍵值對。
以上操作對應的java僞代碼如下:

public class RedisDB{
	....
	//簡單的添加一個鍵
    public String add(String key, Object value) {
        //其他業務操作
        dict.put(key, value);
        if (value instanceof String) {
            return "OK";
        } else if (value instanceof List) {
            List vals = (List) value;
            return "(integer) " + vals.size();
        }
        //其他類型判斷
        return "OK";
    }

    //刪除一個鍵
    public String del(String key) {
        //其他業務操作
        dict.remove(key);
        return "(integer) 1";
    }
    
    //更新操作
    public String update(String key, Object value){
        //其他業務操作
        return add(key, value);
    }
    
    //查詢操作
    public Object get(String key){
        //其他業務操作
        return dict.get(key);
    }
}

3. 鍵的添加操作

在java中,可以看做是向Map集合中添加一個key和value的操作,add方法。
舉個例子,鍵空間的狀態如上圖所示,那麼添加一個鍵的操作後:

redis> set date 2020-04-13
OK

添加之後的鍵空間狀態如下所示:
在這裏插入圖片描述

4. 刪除鍵

刪除數據庫的鍵的操作,實際上就是在鍵空間裏面刪除鍵對應的鍵值對對象。在java中,可以看做是對Map進行移除某個元素的操作,del方法。
舉個例子,鍵空間的狀態如上圖所示,那麼刪除一個鍵的操作後:

redis> del article
(integer) 1

刪除之後的鍵空間狀態如下所示:
在這裏插入圖片描述

5. 鍵的更新

對一個數據庫鍵進行更新,實際上就是對鍵空間裏面的鍵所對應的值進行更新,根據值的對象類型不同,更新的具體方法也不同。在java中,也可以看做是想Map中添加一個重複的元素,Map會把之前的元素值給替換掉,update方法。
舉個例子,鍵空間的狀態如上圖所示,那麼刪除一個鍵的操作後:

redis> set msg world
OK

msg的值對象之前包含的"hello"更新爲了"world",更新之後的鍵空間狀態如下所示:
在這裏插入圖片描述

6. 鍵的查詢

對一個數據庫鍵進行取值,實際上就是在鍵空間中取出鍵所對應的值對象,根據值對象的不同,具體的取值方法也不同。在java中,可以看做就是從Map集合中去,某一個元素的操作get方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章