Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。面試
Redis 全部的數據結構都是以惟一的 key 字符串做爲名稱,而後經過這個惟一 key 值來獲取相應的 value 數據。不一樣類型的數據結 構的差別就在於 value 的結構不同。redis
使用桌面工具查看,默認有16個庫,Redis支持多個數據庫,而且每一個數據庫的數據是隔離的不能共享,而且基於單機纔有,若是是集羣就沒有數據庫的概念。spring
string 是 redis 最基本的類型,你能夠理解成與 Memcached 如出一轍的類型,一個 key 對應一個 value。mongodb
string 類型是二進制安全的。意思是 redis 的 string 能夠包含任何數據。好比jpg圖片或者序列化的對象。數據庫
Redis 的字符串是動態字符串,是能夠修改的字符串,內部結構實現上相似於 Java 的 ArrayList,採用預分配冗餘空間的方式來減小內存的頻繁分配,如圖中所示,內部爲當前字符串實際分配的空間 capacity 通常要高於實際字符串長度 len。當字符串長度小於 1M 時, 擴容都是加倍現有的空間,若是超過 1M,擴容時一次只會多擴 1M 的空間。須要注意的是 字符串最大長度爲 512M。數組
使用基本命令 便可安全
set keyname test get keyname
桌面工具查看結構數據結構
key-value異步
Redis hash 是一個鍵值(key=>value[k-v])對集合。工具
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象。
Redis 的字典至關於 Java 語言裏面的 HashMap,它是無序字典。內部實現結構上同 Java 的 HashMap 也是一致的,一樣的數組 + 鏈表二維結構。第一維 hash 的數組位置碰撞 時,就會將碰撞的元素使用鏈表串接起來。
每一個 hash 能夠存儲 232 -1 鍵值對(40多億)。
hmset myhash field1 "Hello" field2 "World" hget myhash field1 hget myhash field2
桌面工具查看結構
key field1 value field2 value
Redis 列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
Redis 的列表至關於 Java 語言裏面的 LinkedList,注意它是鏈表而不是數組。這意味着 list 的插入和刪除操做很是快,時間複雜度爲 O(1),可是索引定位很慢,時間複雜度爲 O(n).
當列表彈出了最後一個元素以後,該數據結構自動被刪除,內存被回收。
列表最多可存儲 232 - 1 元素 (4294967295, 每一個列表可存儲40多億)。
lpush mylist redis lpush mylist rabbitmq lpush mylist spring lrange mylist 0 10
桌面工具查看結構【鏈表】
key value1 value2
用途:Redis 的列表結構經常使用來作異步隊列使用。將須要延後處理的任務結構體序列化成字符 串塞進 Redis 的列表,另外一個線程從這個列表中輪詢數據進行處理。
Redis的Set是string類型的無序集合。
集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。
Redis 的集合至關於 Java 語言裏面的 HashSet,它內部的鍵值對是無序的惟一的。它的 內部實現至關於一個特殊的字典,字典中全部的 value 都是一個值 NULL。
當集合中最後一個元素移除以後,數據結構自動刪除,內存被回收。 set 結構能夠用來 存儲活動中獎的用戶 ID,由於有去重功能,能夠保證同一個用戶不會中獎兩次。
集合中最大的成員數爲 232 - 1(4294967295, 每一個集合可存儲40多億個成員)。
添加一個 string 元素到 key 對應的 set 集合中,成功返回1,若是元素已經在集合中返回 0,若是 key 對應的 set 不存在則返回錯誤。
sadd key member
127.0.0.1:6379> sadd myset redis (integer) 1 127.0.0.1:6379> sadd myset spring (integer) 1 127.0.0.1:6379> sadd myset rabbitmq (integer) 1 127.0.0.1:6379> sadd myset rabbitmq (integer) 0 127.0.0.1:6379> smembers myset 1) "redis" 2) "rabbitmq" 3) "spring"
注意:以上實例中 rabitmq 添加了兩次,但根據集合內元素的惟一性,第二次插入的元素將被忽略。
桌面工具查看結構【無序不重複集合】
key value1 value2
Redis zset 和 set 同樣也是string類型元素的集合,且不容許重複的成員。
zset 多是 Redis 提供的最爲特點的數據結構,它也是在面試中面試官最愛問的數據結 構。它相似於 Java 的 SortedSet 和 HashMap 的結合體,一方面它是一個 set,保證了內部 value 的惟一性,另外一方面它能夠給每一個 value 賦予一個 score,表明這個 value 的排序權 重。它的內部實現用的是一種叫着「跳躍列表」的數據結構。
zset 中最後一個 value 被移除後,數據結構自動刪除,內存被回收。
不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
zset的成員是惟一的,但分數(score)卻能夠重複。
添加元素到集合,元素在集合中存在則更新對應score
zadd key score member
127.0.0.1:6379> zadd myzset 0 redis (integer) 1 127.0.0.1:6379> zadd myzset 0 mongodb (integer) 1 127.0.0.1:6379> zadd myzset 0 rabbitmq (integer) 1 127.0.0.1:6379> zadd myzset 1 basic (integer) 1 127.0.0.1:6379> zadd myzset 0 rabbitmq (integer) 0 127.0.0.1:6379> zrangebyscore myzset 0 1000 1) "mongodb" 2) "rabbitmq" 3) "redis" 4) "basic"
桌面工具查看結構【有序不重複集合】
key value2 0 value3 0 value1 1
list/set/hash/zset 這四種數據結構是容器型數據結構,它們共享下面兩條通用規則:
若是容器不存在,那就建立一個,再進行操做。好比 rpush 操做剛開始是沒有列表的,Redis 就會自動建立一個,而後再 rpush 進去新元素。
若是容器裏元素沒有了,那麼當即刪除元素,釋放內存。這意味着 lpop 操做到最後一個元素,列表就消失了。
Redis 全部的數據結構均可以設置過時時間,時間到了,Redis 會自動刪除相應的對象。 須要注意的是過時是以對象爲單位,好比一個 hash 結構的過時是整個 hash 對象的過時, 而不是其中的某個子 key。
特別注意:若是一個字符串已經設置了過時時間,而後你調用了set 方法修改了它,它的過時時間會消失。