一 基本概述、
(1)
redis基本命令的時間複雜度如下:
可以看到,keys命令是一個比較重的命令,所以在開發環境中我們一般不使用(因爲redis是單線程的,如果你keys一個一百萬的命令,可能就會在這個命令上耗費10秒,那後面所有的命令都會需要等10秒鐘)
(2)
下圖是redis的數據結構與內部編碼
數據結構是對外呈現的,而數據結構的底層就是內部編碼,可以看到,每個數據結構都有幾個內部編碼,這是爲了優化,比如hash,當我們需要使用時間換取空間的話,我們就可以使用如ziplist的壓縮結構,而當我的數據量不多,需要以空間換取時間的話,我們就可以使用hashtable的數據結構。
(3)
對於redis內部源碼中,有一個redisObject的結構對象:
(4)
單線程爲什麼這麼快:
- 純內存(主要原因)
- 非阻塞IO
- 避免線程切換和競態消耗
單線程需要注意的幾點是:
- 一次只運行一條命名
- 拒絕長(慢)命令: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(有序集合)
有序集合可以用在排行榜