一、redis和平常寫的數據結構的區別
最大的區別,redis 作為緩存組件,可以獨立部署。這也是為什么本地內存很快,但還是要用 redis 這類緩存的原因。Redis是基于c語言編寫的開源非關系型內存數據庫,可以用作數據庫、緩存、消息中間件。
redis是一個開源的使用C語言編寫的一個kv存儲系統,是一個速度非常快的非關系遠程內存數據庫。它支持包括String、List、Set、Zset、hash五種數據結構。除此之外,通過復制、持久化和客戶端分片等特性,用戶可以很方便地將redis擴展成一個能夠包含數百GB數據和每秒處理上百萬次的請求的系統。目前支持多種語言的api,方便用戶使用。
redis同時也內置了事務、LUA腳本、復制等功能,提供兩種持久化選項,一種是每隔一段時間將數據導入到磁盤(快照模式),另一種是追加命令到日志中(AOF模式)。如果只是作為高效的內存數據庫使用也可以關閉持久化功能。通過哨兵(sentinel)和自動分區(Cuuster)的方式可以提高redis服務器的高可用性。
與關系型數據庫相比,redis的命令請求不需要經過查詢分析器或查詢優化器進行處理,也避免了更新數據時引起的隨機讀\寫,這些慢操作。它直接讀寫內存中的數據,并且數據是按照一定的數據結構存儲的。所以它的速度非常快。
延伸閱讀:
二、字符串(String)
與其它編程語言或其它鍵值存儲提供的字符串非常相似,鍵(key)——值(value) (字符串格式),字符串擁有一些操作命令,如:get set del 還有一些比如自增或自減操作等等。redis是使用C語言開發,但C中并沒有字符串類型,只能使用指針或符數組的形式表示一個字符串,所以redis設計了一種簡單動態字符串(SDS[Simple Dynamic String])作為底實現:
定義SDS對象,此對象中包含三個屬性:
len buf中已經占有的長度(表示此字符串的實際長度)
free buf中未使用的緩沖區長度
buf[] 實際保存字符串數據的地方
所以取字符串的長度的時間復雜度為O(1),另,buf[]中依然采用了C語言的以\0結尾可以直接使用C語言的部分標準C字符串庫函數。
空間分配原則:當len小于IMB(1024*1024)時增加字符串分配空間大小為原來的2倍,當len大于等于1M時每次分配 額外多分配1M的空間。