redis——基本概述、數據結構

 

一   基本概述、

(1)

redis基本命令的時間複雜度如下:

可以看到,keys命令是一個比較重的命令,所以在開發環境中我們一般不使用(因爲redis是單線程的,如果你keys一個一百萬的命令,可能就會在這個命令上耗費10秒,那後面所有的命令都會需要等10秒鐘)

(2)

下圖是redis的數據結構與內部編碼

數據結構是對外呈現的,而數據結構的底層就是內部編碼,可以看到,每個數據結構都有幾個內部編碼,這是爲了優化,比如hash,當我們需要使用時間換取空間的話,我們就可以使用如ziplist的壓縮結構,而當我的數據量不多,需要以空間換取時間的話,我們就可以使用hashtable的數據結構。

(3)

對於redis內部源碼中,有一個redisObject的結構對象:

(4)

單線程爲什麼這麼快:

  1. 純內存(主要原因)
  2. 非阻塞IO
  3. 避免線程切換和競態消耗

單線程需要注意的幾點是:

  • 一次只運行一條命名
  • 拒絕長(慢)命令:keys,flushall,flushdb,slow lua script,mutil/exec,operate big value(collection)
  • 有些命令不是單線程,如:fysnc file descriptor,close file descriptor

 

二  數據結構

 

2.1  字符串

字符串中的value可以是字符串,數字,二進制,甚至是json串。value最大大小限度是512MB

字符串結構在緩存,技術器,分佈式鎖等場景使用。

 

2.2  hash

hash結構如下圖所示

 

下面我們比較下使用字符串和hash來存儲用戶屬性的優劣

1.字符串方式1

2.字符串方式2

3.hash方式

三種方式的比較

 

2.3  List

數據結構如下

比如我們平時用的微博,裏面有個按時間順序排列的列表

這個就是通過redis裏面的list的結構來完成,我們把微博內容存在list裏,當有人新發了微博,我們就將此條微博的內容放入list(LPUSH)

 

2.4  set

數據結構如下

集合不僅支持集合內的操作,還支持集合間的操作

 

2.5  zset(有序集合)

有序集合可以用在排行榜

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