認(rèn)識(shí)Redis與Redis的數(shù)據(jù)類(lèi)型

本文作為Redis的入門(mén)教程,旨在讓大家對(duì)Redis有一個(gè)概念性和整體性的認(rèn)識(shí),并且可以快速上手,為深入Redis打下基礎(chǔ)。

文章概要:

  1. Redis的介紹
  2. Redis與其他數(shù)據(jù)庫(kù)的對(duì)比
  3. Redis與其他緩存實(shí)現(xiàn)對(duì)比
  4. Redis的數(shù)據(jù)結(jié)構(gòu)類(lèi)型
  5. Redis命令操作幾種數(shù)據(jù)類(lèi)型
  6. Spring Data Redis操作幾種數(shù)據(jù)類(lèi)型
  7. ZSET(有序集合)保證順序
  8. SET(集合)隨機(jī)獲取元素

目錄

  • Redis的介紹
    • Redis與其他數(shù)據(jù)的對(duì)比
    • Redis與其他緩存實(shí)現(xiàn)對(duì)比
  • Redis的數(shù)據(jù)類(lèi)型
    • Redis 5種數(shù)據(jù)類(lèi)型概覽
    • Redis命令操作5種數(shù)據(jù)類(lèi)型
      • STRING命令
        • 字符串操作
        • SETEX與SETNX
        • 數(shù)字操作
        • 批量操作
        • BIT操作
      • LIST命令
      • SET命令
      • HASH命令
      • ZSET命令
  • 總結(jié)
  • 相關(guān)鏈接
    • 作者資源
    • 參考資源
  • 相關(guān)資源
    • charts
    • books

Redis的介紹

Redis是一種非關(guān)系型數(shù)據(jù)庫(kù)(non-relational database, 簡(jiǎn)稱(chēng)nosql)。

Redis是一個(gè)遠(yuǎn)程內(nèi)存數(shù)據(jù)庫(kù),Redis客戶(hù)端可以通過(guò)TCP協(xié)議請(qǐng)求服務(wù)端。

Redis性能強(qiáng)勁,且支持持久化和復(fù)制,可以方便地存儲(chǔ)和讀取海量數(shù)據(jù)。

那么Redis到底有多快? Redis 自帶了一個(gè)叫 redis-benchmark 的工具來(lái)模擬 N 個(gè)客戶(hù)端同時(shí)發(fā)出 M 個(gè)請(qǐng)求,你可以使用 redis-benchmark -h 來(lái)查看參數(shù)。

下面測(cè)試了100萬(wàn)次SET和GET操作的性能:

$ redis-benchmark -n 1000000 -t set,get -P 16 –q
SET: 198098.27 requests per second
GET: 351988.72 requests per second

Redis與其他數(shù)據(jù)庫(kù)的對(duì)比

如果僅僅局限于一處,容易“只見(jiàn)樹(shù)木,不見(jiàn)森林”,或者“手里拿個(gè)錘子,看什么都像釘子”。

因此,我們首先與市場(chǎng)上常用的數(shù)據(jù)庫(kù)系統(tǒng)做下橫向?qū)Ρ?,這樣你可以更直觀(guān)地感受Redis的特點(diǎn)。

Redis與其他緩存實(shí)現(xiàn)對(duì)比

同時(shí)Redis作為常用的緩存實(shí)現(xiàn),我們也比較一下常用的緩存實(shí)現(xiàn)的優(yōu)缺點(diǎn)。

Redis的數(shù)據(jù)類(lèi)型

Redis 5 帶來(lái)了新的流數(shù)據(jù)類(lèi)型(Stream data type),在這之前,Redis可以存儲(chǔ)鍵(key)與5種不同數(shù)據(jù)結(jié)構(gòu)類(lèi)型之間的映射,這5種數(shù)據(jù)結(jié)構(gòu)類(lèi)型分別為STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)。

RedisDataType

Redis 5種數(shù)據(jù)類(lèi)型概覽

編號(hào) 結(jié)構(gòu)類(lèi)型 結(jié)構(gòu)存儲(chǔ)的值 結(jié)構(gòu)的讀寫(xiě)能力
1 STRING 字符串、整數(shù)、浮點(diǎn)數(shù) 對(duì)整個(gè)字符串或者字符串的其中一部分執(zhí)行操作;
對(duì)整數(shù)和浮點(diǎn)數(shù)執(zhí)行自增(increment)或者自減(decrement)操作
2 LIST 一個(gè)鏈表,鏈表上的每個(gè)節(jié)點(diǎn)都包含了一個(gè)字符串 從鏈表的兩端推入或者彈出元素(隊(duì)列操作);
根據(jù)偏移量對(duì)鏈表進(jìn)行修剪(trim);
讀取單個(gè)或者多個(gè)元素;根據(jù)值查找或者移除元素
3 SET 包含字符串的無(wú)序收集器(unordered collection)且不可重復(fù) 添加、獲取、移除單個(gè)元素;
檢查一個(gè)元素是否存在于集合中;
計(jì)算交集、并集、差集;
從集合里面隨機(jī)獲取元素
4 HASH 包含鍵值對(duì)的無(wú)序散列表 添加、獲取、移除單個(gè)鍵值對(duì);
獲取所有鍵值
5 ZSET 字符串成員(member)與浮點(diǎn)數(shù)分值(score)之間的有序映射,元素的排列順序由分值的大小決定 添加、獲取、刪除單個(gè)元素;
根據(jù)分值范圍(range)或者成員來(lái)獲取元

Redis命令操作5種數(shù)據(jù)類(lèi)型

STRING命令

字符串操作

對(duì)于字符串,Redis支持最基礎(chǔ)的SET GETDEL操作。也支持很多復(fù)雜的操作,下面簡(jiǎn)要介紹一下。

編號(hào) 命令 描述
1 SET key value 設(shè)置指定 key 的值
2 GET key 獲取指定 key 的值
3 DEL key 刪除此key以及其對(duì)應(yīng)的value,這個(gè)命令對(duì)5種數(shù)據(jù)類(lèi)型都適用
4 GETRANGE key start end 返回 key 中字符串值的子字符
5 SETRANGE key offset value 用 value 參數(shù)覆寫(xiě)給定 key 所儲(chǔ)存的字符串值,從偏移量 offset 開(kāi)始
6 STRLEN key 返回 key 所儲(chǔ)存的字符串值的長(zhǎng)度

下面簡(jiǎn)單演示一下Command操作字符串:

127.0.0.1:6379> GET key-string
(nil)
127.0.0.1:6379> SET key-str "my string value"
OK
127.0.0.1:6379> GET key-str
"my string value"
127.0.0.1:6379> DEL key-str
(integer) 1
127.0.0.1:6379> GET key-str
(nil)
127.0.0.1:6379>

SETEX與SETNX

SETEX與SETNX在做分布式鎖的時(shí)候很有用。

編號(hào) 命令 描述
1 SETEX key seconds value 將值 value 關(guān)聯(lián)到 key ,并將 key 的過(guò)期時(shí)間設(shè)為 seconds (以秒為單位)
2 SETNX key value 只有在 key 不存在時(shí)設(shè)置 key 的值

SETEX演示:

127.0.0.1:6379> SETEX a 5 2
OK
127.0.0.1:6379> MGET a
1) "2"

5秒后使用MGET命令獲取

127.0.0.1:6379> MGET a
1) (nil)

SETNX演示:

127.0.0.1:6379> SETNX a 1
(integer) 1
127.0.0.1:6379> MGET a
1) "1"

SETEX 的應(yīng)用場(chǎng)景:

在實(shí)現(xiàn)分布式session時(shí),當(dāng)用戶(hù)登錄時(shí)設(shè)置指定的過(guò)期時(shí)間。每當(dāng)用戶(hù)請(qǐng)求一個(gè)接口,就重新設(shè)置一下過(guò)期時(shí)間。當(dāng)在指定的時(shí)間內(nèi)未調(diào)用任何接口時(shí),分布式session就失效了。

數(shù)字操作

對(duì)于數(shù)字,支持如下操作:

編號(hào) 命令 描述
1 INCR key 將 key 中儲(chǔ)存的數(shù)字值增一
2 INCRBY key increment 將 key 所儲(chǔ)存的值加上給定的增量值(increment)
3 INCRBYFLOAT key increment 將 key 所儲(chǔ)存的值加上給定的浮點(diǎn)增量值(increment)
4 DECR key 將 key 中儲(chǔ)存的數(shù)字值減一
5 DECRBY key decrement key 所儲(chǔ)存的值減去給定的減量值(decrement)

下面簡(jiǎn)單演示一下Command:

127.0.0.1:6379> SET key-num 0
OK
127.0.0.1:6379> INCR key-num
(integer) 1
127.0.0.1:6379> GET key-num
"1"
127.0.0.1:6379> INCR key-num
(integer) 2
127.0.0.1:6379> GET key-num
"2"
127.0.0.1:6379> INCR key-num
(integer) 3
127.0.0.1:6379> GET key-num
"3"
127.0.0.1:6379> INCRBY key-num 100
(integer) 103
127.0.0.1:6379> GET key-num
"103"
127.0.0.1:6379> INCRBY key-num 100
(integer) 203
127.0.0.1:6379> DECR key-num
(integer) 202
127.0.0.1:6379> DECRBY key-num 100
(integer) 102
127.0.0.1:6379> DECRBY key-num 100
(integer) 2
127.0.0.1:6379> DECRBY key-num 100
(integer) -98

批量操作

編號(hào) 命令 描述
1 MGET key1 [key2..] 獲取所有(一個(gè)或多個(gè))給定 key 的值
2 MSET key value [key value ...] 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì)
3 MSETNX key value [key value ...] 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對(duì),當(dāng)且僅當(dāng)所有給定 key 都不存在
127.0.0.1:6379> MSET a 1 b 2 c 3
OK
127.0.0.1:6379> MGET a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> MSETNX a 1 b 2 c 3
(integer) 0
127.0.0.1:6379> MSETNX a 1 b 2 d 4
(integer) 0
127.0.0.1:6379> MSETNX d 4 e 5
(integer) 1
127.0.0.1:6379>

BIT操作

編號(hào) 命令 描述
1 GETBIT key offset 對(duì) key 所儲(chǔ)存的字符串值,獲取指定偏移量上的位(bit)
2 SETBIT key offset value 對(duì) key 所儲(chǔ)存的字符串值,設(shè)置或清除指定偏移量上的位(bit)
3 BITCOUNT key [start] [end] 計(jì)算字符串中的設(shè)置位數(shù)
4 BITOP operation destkey key [key ...] 在多個(gè)鍵(包含字符串值)之間執(zhí)行按位操作并將結(jié)果存儲(chǔ)在目標(biāo)鍵中。

LIST命令

Redis的獨(dú)特之處之一就在于它支持一個(gè)鏈表結(jié)構(gòu),下面是對(duì)鏈表結(jié)構(gòu)的操作命令,熟悉這些命令對(duì)于你掌握Redis的鏈表結(jié)構(gòu)十分重要。

編號(hào) 命令 描述
1 BLPOP key1 [key2 ] timeout 移出并獲取列表的第一個(gè)元素, 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
2 BRPOP key1 [key2 ] timeout 移出并獲取列表的最后一個(gè)元素, 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
3 BRPOPLPUSH source destination timeout 從列表中彈出一個(gè)值,將彈出的元素插入到另外一個(gè)列表中并返回它; 如果列表沒(méi)有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
4 LINDEX key index 通過(guò)索引獲取列表中的元素
5 `LINSERT key BEFORE AFTER pivot value` 在列表的元素前或者后插入元素
6 LLEN key 獲取列表長(zhǎng)度
7 LPOP key 移出并獲取列表的第一個(gè)元素
8 LPUSH key value1 [value2] 將一個(gè)或多個(gè)值插入到列表頭部
9 LPUSHX key value 將一個(gè)值插入到已存在的列表頭部
10 LRANGE key start stop 獲取列表指定范圍內(nèi)的元素
11 LREM key count value 移除列表元素
12 LSET key index value 通過(guò)索引設(shè)置列表元素的值
13 LTRIM key start stop 對(duì)一個(gè)列表進(jìn)行修剪(trim),就是說(shuō),讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。
14 RPOP key 移除列表的最后一個(gè)元素,返回值為移除的元素。
15 RPOPLPUSH source destination 移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回
16 RPUSH key value1 [value2] 在列表中添加一個(gè)或多個(gè)值
17 RPUSHX key value 為已存在的列表添加值
127.0.0.1:6379> LPUSH list1 1
(integer) 1
127.0.0.1:6379> RPOP list1
"1"
127.0.0.1:6379> RPOP list1
(nil)
127.0.0.1:6379> BRPOP list1 10
(nil)
(10.10s)
127.0.0.1:6379>
127.0.0.1:6379> LPUSH list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LSET list1 4 50
OK
127.0.0.1:6379> LSET list1 5 50
(error) ERR index out of range

其中BLPOP BRPOP BRPOPLPUSH 是阻塞式的,通常用在消息隊(duì)列中。

SET命令

Redis 的 Set 是 String 類(lèi)型的無(wú)序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。

Redis 中集合是通過(guò)哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)。

Redis限制了每個(gè)key只能存儲(chǔ)512M數(shù)據(jù),集合中最大的成員數(shù)為 2^32 - 1 (4294967295, 每個(gè)集合可存儲(chǔ)40多億個(gè)成員)。

編號(hào) 命令 描述
1 SADD key member1 [member2] 向集合添加一個(gè)或多個(gè)成員
2 SCARD key 獲取集合的成員數(shù)
3 SDIFF key1 [key2] 返回給定所有集合的差集
4 SDIFFSTORE destination key1 [key2] 返回給定所有集合的差集并存儲(chǔ)在 destination 中
5 SINTER key1 [key2] 返回給定所有集合的交集
6 SINTERSTORE destination key1 [key2] 返回給定所有集合的交集并存儲(chǔ)在 destination 中
7 SISMEMBER key member 判斷 member 元素是否是集合 key 的成員
8 SMEMBERS key 返回集合中的所有成員
9 SMOVE source destination member 將 member 元素從 source 集合移動(dòng)到 destination 集合
10 SPOP key 移除并返回集合中的一個(gè)隨機(jī)元素
11 SRANDMEMBER key [count] 返回集合中一個(gè)或多個(gè)隨機(jī)數(shù)
12 SREM key member1 [member2] 移除集合中一個(gè)或多個(gè)成員
13 SUNION key1 [key2] 返回所有給定集合的并集
14 SUNIONSTORE destination key1 [key2] 所有給定集合的并集存儲(chǔ)在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素
127.0.0.1:6379> SADD set1 a b c d e
(integer) 5
127.0.0.1:6379> SCARD set
(integer) 0
127.0.0.1:6379> SCARD set1
(integer) 5
127.0.0.1:6379> SISMEMBER set1 f
(integer) 0
127.0.0.1:6379> SISMEMBER set1 e
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "c"
3) "a"
4) "b"
5) "e"
127.0.0.1:6379> SPOP set1
"d"
127.0.0.1:6379> SPOP set1
"a"
127.0.0.1:6379> SMOVE set1 set2 b
(integer) 1
127.0.0.1:6379> SMOVE set1 set2 c
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "b"
2) "c"

SPOP由于其隨機(jī)性,可以作為抽獎(jiǎng)程序等業(yè)務(wù)場(chǎng)景下的基礎(chǔ)實(shí)現(xiàn)。

HASH命令

Redis hash 是一個(gè)string類(lèi)型的field和value的映射表,類(lèi)似于Java語(yǔ)言中的Map結(jié)構(gòu),hash特別適合用于存儲(chǔ)對(duì)象。

編號(hào) 命令 描述
1 HDEL key field1 [field2] 刪除一個(gè)或多個(gè)哈希表字段
2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在
3 HGET key field 獲取存儲(chǔ)在哈希表中指定字段的值
4 HGETALL key 獲取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment 為哈希表 key 中的指定字段的整數(shù)值加上增量 increment
6 HINCRBYFLOAT key field increment 為哈希表 key 中的指定字段的浮點(diǎn)數(shù)值加上增量 increment
7 HKEYS key 獲取所有哈希表中的字段
8 HLEN key 獲取哈希表中字段的數(shù)量
9 HMGET key field1 [field2] 獲取所有給定字段的值
10 HMSET key field1 value1 [field2 value2 ] 同時(shí)將多個(gè) field-value (域-值)對(duì)設(shè)置到哈希表 key 中
11 HSET key field value 將哈希表 key 中的字段 field 的值設(shè)為 value
12 HSETNX key field value 只有在字段 field 不存在時(shí),設(shè)置哈希表字段的值。
13 HVALS key 獲取哈希表中所有值
14 HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對(duì)。
127.0.0.1:6379> HSET User001 name "Tom"
(integer) 1
127.0.0.1:6379> HSET User001 birthday "1990-01-20"
(integer) 1
127.0.0.1:6379> HSET User001 gender "Man"
(integer) 1
127.0.0.1:6379> HKEYS User001
1) "name"
2) "birthday"
3) "gender"
127.0.0.1:6379> HGETALL User001
1) "name"
2) "Tom"
3) "birthday"
4) "1990-01-20"
5) "gender"
6) "Man"

ZSET命令

有序集合和散列一樣,都用于存儲(chǔ)鍵值對(duì)。有序集合的鍵被稱(chēng)為成員(member),每個(gè)成員都是各不相同的;而有序集合的值則被稱(chēng)為分值(score),分值必須為浮點(diǎn)數(shù)。

編號(hào) 命令 描述
1 ZADD key score1 member1 [score2 member2] 向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù)
2 ZCARD key 獲取有序集合的成員數(shù)
3 ZCOUNT key min max 計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù)
4 ZINCRBY key increment member 有序集合中對(duì)指定成員的分?jǐn)?shù)加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...] 計(jì)算給定的一個(gè)或多個(gè)有序集的交集并將結(jié)果集存儲(chǔ)在新的有序集合 key 中
6 ZLEXCOUNT key min max 在有序集合中計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量
7 ZRANGE key start stop [WITHSCORES] 通過(guò)索引區(qū)間返回有序集合成指定區(qū)間內(nèi)的成員
8 ZRANGEBYLEX key min max [LIMIT offset count] 通過(guò)字典區(qū)間返回有序集合的成員
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通過(guò)分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員
10 ZRANK key member 返回有序集合中指定成員的索引
11 ZREM key member [member ...] 移除有序集合中的一個(gè)或多個(gè)成員
12 ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區(qū)間的所有成員
13 ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區(qū)間的所有成員
14 ZREMRANGEBYSCORE key min max 移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員
15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定區(qū)間內(nèi)的成員,通過(guò)索引,分?jǐn)?shù)從高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的成員,分?jǐn)?shù)從高到低排序
17 ZREVRANK key member 返回有序集合中指定成員的排名,有序集成員按分?jǐn)?shù)值遞減(從大到小)排序
18 ZSCORE key member 返回有序集中,成員的分?jǐn)?shù)值
19 ZUNIONSTORE destination numkeys key [key ...] 計(jì)算給定的一個(gè)或多個(gè)有序集的并集,并存儲(chǔ)在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成員和元素分值)
127.0.0.1:6379> ZADD Users 1 zhangsan 2 lisi 3 wangwu 4 maliu
(integer) 4
127.0.0.1:6379> ZCARD Users
(integer) 4
127.0.0.1:6379> ZRANK Users maliu
(integer) 3
127.0.0.1:6379> ZSCAN Users 0
1) "0"
2) 1) "zhangsan"
   2) "1"
   3) "lisi"
   4) "2"
   5) "wangwu"
   6) "3"
   7) "maliu"
   8) "4"
127.0.0.1:6379>

總結(jié)

本文帶大家認(rèn)識(shí)了Redis,并通過(guò)橫向?qū)Ρ鹊姆绞阶尨蠹覍?duì)Redis的特性和功能有了整體性的了解,然后我們依次介紹了Redis的5種基本數(shù)據(jù)結(jié)構(gòu),以及操作它的命令。作為Redis的入門(mén)教程,本文旨在讓大家對(duì)Redis有一個(gè)概念性和整體性的認(rèn)識(shí),為深入Redis打下基礎(chǔ)。

今天我僅帶大家了解了 Redis知識(shí)圖譜 的冰山一角,希望在我們共同的努力下,不斷完善我們的 技能圖譜,一起來(lái)搭建我們的 知識(shí)體系,笑傲在這個(gè)算法與智能的時(shí)代。

相關(guān)鏈接

作者資源

參考資源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • NOSQL類(lèi)型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,150評(píng)論 2 27
  • redis是一個(gè)以key-value存儲(chǔ)的非關(guān)系型數(shù)據(jù)庫(kù)。有五種數(shù)據(jù)類(lèi)型,string、hashes、list、s...
    林ze宏閱讀 1,095評(píng)論 0 0
  • 轉(zhuǎn)自:http://bbs.redis.cn/forum.php?mod=viewthread&tid=481 p...
    木十2036閱讀 1,166評(píng)論 0 7
  • Redis是啥 Redis是一個(gè)開(kāi)源的key-value存儲(chǔ)系統(tǒng),由于擁有豐富的數(shù)據(jù)結(jié)構(gòu),又被其作者戲稱(chēng)為數(shù)據(jù)結(jié)構(gòu)...
    一凡呀閱讀 1,232評(píng)論 0 5
  • 1.1 資料 ,最好的入門(mén)小冊(cè)子,可以先于一切文檔之前看,免費(fèi)。 作者Antirez的博客,Antirez維護(hù)的R...
    JefferyLcm閱讀 17,293評(píng)論 1 51

友情鏈接更多精彩內(nèi)容