偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

RedisServer、RedisDB與數(shù)據(jù)字典Dict

數(shù)據(jù)庫(kù) Redis
本文通過(guò)講解 RedisServer、RedisDB與數(shù)據(jù)字典Dict之間的聯(lián)系,同時(shí)通過(guò)分析Set指令(v7.0 版本目前有240個(gè)命令)的執(zhí)行過(guò)程,可以對(duì)其底層原理有更深的認(rèn)知。

1、關(guān)于Redis

眾所周知Redis是流行的、開(kāi)源的,使用C語(yǔ)言開(kāi)發(fā)的高性能,基于內(nèi)存的key/value數(shù)據(jù)庫(kù)。它具有高效、精心設(shè)計(jì)的底層數(shù)據(jù)結(jié)構(gòu),同時(shí)支持多種數(shù)據(jù)類型(string、list、set、zset、hash、bitmap、geo、hyperloglog等),讓其能夠擁有100K+/s的讀寫性能。正是由于這些優(yōu)勢(shì)讓它在眾多數(shù)據(jù)庫(kù)中脫穎而出,支撐著眾多互聯(lián)網(wǎng)公司的海量業(yè)務(wù)。

那么你有沒(méi)有想過(guò),它的底層是如何運(yùn)作的?本文從RedisServer的底層結(jié)構(gòu)入手,并通過(guò)追溯Set指令操作過(guò)程與key的過(guò)期時(shí)間窺探一下運(yùn)行原理。

2、redisServer、redisDB與數(shù)據(jù)字典dict

Redis服務(wù)是常見(jiàn)的c/s架構(gòu)設(shè)計(jì),即:Redis client客戶端通過(guò)與Redis Server服務(wù)端建立連接后對(duì)存儲(chǔ)在Redis Server端的數(shù)據(jù)進(jìn)行操作。Redis Server作為一個(gè)單獨(dú)的進(jìn)程運(yùn)行在計(jì)算機(jī)上,其對(duì)數(shù)據(jù)進(jìn)行操作的工作線程為單線程,減少了鎖開(kāi)銷以及上下文的切換。

在Redis Server進(jìn)程內(nèi)部有一個(gè)全局變量redisServer,存儲(chǔ)著當(dāng)前Redis Server的所有數(shù)據(jù)庫(kù)、key/value數(shù)據(jù)以及其他眾多信息,在Redis Server完全啟動(dòng)并對(duì)外服務(wù)之前對(duì)其進(jìn)行初始化、賦予默認(rèn)值等操作,它是運(yùn)行時(shí)的一個(gè)重要數(shù)據(jù)入口。

從上圖可知,Redis Server默認(rèn)共擁有(0-15,自定義最大為0-255)16個(gè)數(shù)據(jù)庫(kù)(redisDB),每個(gè)數(shù)據(jù)庫(kù)包含有若干數(shù)據(jù)字典(dict),每個(gè)數(shù)據(jù)字典存儲(chǔ)不同意義的數(shù)據(jù)。例如:redisDb.dict 是存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)所有key/value的keyspace,redisDb.expires 是存儲(chǔ)當(dāng)前數(shù)據(jù)庫(kù)所有設(shè)置了過(guò)期時(shí)間的keyspace。

查詢數(shù)據(jù)時(shí)從數(shù)據(jù)字典 redisDb.dict 中獲取,判斷/獲取key的過(guò)期時(shí)間等操作時(shí)從數(shù)據(jù)字典 redisDb.expires 中獲取。每個(gè)數(shù)據(jù)字典存儲(chǔ)數(shù)據(jù)時(shí),考慮擴(kuò)容等因素會(huì)有用2個(gè) ht_table,在未擴(kuò)容時(shí)數(shù)據(jù)全部存儲(chǔ)在 ht_table[0],否則可能在 ht_table[0]ht_table[1] 都存有數(shù)據(jù),ht_table 使用 bucket+鏈表(不同key在經(jīng)過(guò)hash計(jì)算之后發(fā)生碰撞,會(huì)存儲(chǔ)在同一個(gè)bucket的鏈表中)的形式存儲(chǔ)具體的key/value。

3、redis client如何與數(shù)據(jù)庫(kù)建立聯(lián)系

每當(dāng)redis client客戶端與Redis Server服務(wù)端建立連接之后,Redis Server為該客戶端創(chuàng)建結(jié)構(gòu)體 client 用于存儲(chǔ)客戶端相關(guān)信息,其中就包含客戶端所使用的數(shù)據(jù)庫(kù)(默認(rèn)為0,可以通過(guò)select指令選擇其他數(shù)據(jù)庫(kù))。然后Redis Server服務(wù)端通過(guò)雙向鏈表把這些client連接起來(lái),存儲(chǔ)到全局變量redisServer的clients字段中。就這樣redis client客戶端與Redis數(shù)據(jù)庫(kù)建立了聯(lián)系,后續(xù)就能直接找到對(duì)應(yīng)數(shù)據(jù)庫(kù)進(jìn)行讀、寫等操作。

每當(dāng)redis client客戶端發(fā)送命令到服務(wù)端之后,Redis Server通過(guò) client.db 找到對(duì)應(yīng)的數(shù)據(jù)庫(kù),然后進(jìn)行相關(guān)操作。

4、Set指令執(zhí)行過(guò)程

5、小結(jié)

本文通過(guò)講解 redisServer、redisDB與數(shù)據(jù)字典dict之間的聯(lián)系,同時(shí)通過(guò)分析Set指令(v7.0 版本目前有240個(gè)命令)的執(zhí)行過(guò)程,可以對(duì)其底層原理有更深的認(rèn)知。

曾經(jīng)有一位技術(shù)大咖說(shuō)過(guò):若想學(xué)習(xí)一個(gè)好的開(kāi)源項(xiàng)目,那么首推Redis,無(wú)論從代碼功能、變量聲明,甚至從注釋來(lái)看都無(wú)可挑剔。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2015-07-22 17:21:34

Oracle數(shù)據(jù)字典

2023-03-06 07:48:01

數(shù)據(jù)字典Spring

2010-04-09 10:13:13

Oracle數(shù)據(jù)字典

2010-04-28 17:49:41

Oracle數(shù)據(jù)字典

2010-03-31 16:38:02

Oracle數(shù)據(jù)字典

2010-04-22 09:36:56

Oracle數(shù)據(jù)字典

2022-10-10 08:01:08

MySQL字典表

2010-04-06 17:17:16

Oracle數(shù)據(jù)字典

2010-04-27 16:18:26

Oracle數(shù)據(jù)字典

2010-05-10 15:22:34

Oracle數(shù)據(jù)字典

2010-07-14 13:50:48

SQL Server數(shù)

2023-03-04 20:50:19

MySQL字典InnoDB

2010-11-15 16:08:15

ORACLE系統(tǒng)表

2012-02-02 13:45:28

JavaJSP

2010-04-14 14:09:38

Oracle管理腳本

2018-03-16 15:30:45

數(shù)據(jù)庫(kù)MySQL數(shù)據(jù)字典

2010-04-06 17:36:15

Oracle數(shù)據(jù)字典

2010-04-22 10:00:41

Oracle數(shù)據(jù)字典

2024-07-26 10:50:51

SpringScrew數(shù)據(jù)庫(kù)

2009-10-22 16:35:48

Oracle系統(tǒng)管理員Oracle數(shù)據(jù)字典
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)