开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開APP
          userphoto
          未登錄

          開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

          開通VIP
          Redis快速入門


          Redis的優(yōu)點(diǎn)

          以下是Redis的一些優(yōu)點(diǎn)。

          • 異???/strong> - Redis非常快,每秒可執(zhí)行大約110000次的設(shè)置(SET)操作,每秒大約可執(zhí)行81000次的讀取/獲取(GET)操作。
          • 支持豐富的數(shù)據(jù)類型 - Redis支持開發(fā)人員常用的大多數(shù)數(shù)據(jù)類型,例如列表,集合,排序集和散列等等。這使得Redis很容易被用來解決各種問題,因?yàn)槲覀冎滥男﹩栴}可以更好使用地哪些數(shù)據(jù)類型來處理解決。
          • 操作具有原子性 - 所有Redis操作都是原子操作,這確保如果兩個客戶端并發(fā)訪問,Redis服務(wù)器能接收更新的值。
          • 多實(shí)用工具 - Redis是一個多實(shí)用工具,可用于多種用例,如:緩存,消息隊(duì)列(Redis本地支持發(fā)布/訂閱),應(yīng)用程序中的任何短期數(shù)據(jù),例如,web應(yīng)用程序中的會話,網(wǎng)頁命中計(jì)數(shù)等。

          Redis與其他鍵值存儲系統(tǒng)

          • Redis是鍵值數(shù)據(jù)庫系統(tǒng)的不同進(jìn)化路線,它的值可以包含更復(fù)雜的數(shù)據(jù)類型,可在這些數(shù)據(jù)類型上定義原子操作。

          • Redis是一個內(nèi)存數(shù)據(jù)庫,但在磁盤數(shù)據(jù)庫上是持久的,因此它代表了一個不同的權(quán)衡,在這種情況下,在不能大于存儲器(內(nèi)存)的數(shù)據(jù)集的限制下實(shí)現(xiàn)非常高的寫和讀速度。

          • 內(nèi)存數(shù)據(jù)庫的另一個優(yōu)點(diǎn)是,它與磁盤上的相同數(shù)據(jù)結(jié)構(gòu)相比,復(fù)雜數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中存儲表示更容易操作。 因此,Redis可以做很少的內(nèi)部復(fù)雜性。

          1. Redis環(huán)境安裝配置

          在本章中,您將了解和學(xué)習(xí)Redis的環(huán)境安裝設(shè)置。

          在Ubuntu上安裝Redis

          要在Ubuntu上安裝Redis,打開終端并鍵入以下命令 -

          [yiibai@ubuntu:~]$ sudo apt-get update [yiibai@ubuntu:~]$ sudo apt-get install redis-server
          Shell

          這將在Ubuntu機(jī)器上安裝Redis。

          啟動Redis

          [yiibai@ubuntu:~]$ redis-server[2988] 07 Feb 17:09:42.485 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf[2988] 07 Feb 17:09:42.488 # Unable to set the max number of files limit to 10032 (Operation not permitted), setting the max clients configuration to 3984.[2988] 07 Feb 17:09:42.490 # Warning: 32 bit instance detected but no memory lim _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 2.8.4 (00000000/0) 32 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in stand alone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 2988 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-'[2988] 07 Feb 17:09:42.581 # Server started, Redis version 2.8.4[2988] 07 Feb 17:09:42.582 # WARNING overcommit_memory is set to 0! Background s ' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_m[2988] 07 Feb 17:09:42.582 * The server is now ready to accept connections on po
          Shell

          檢查Redis是否正在工作

          [yiibai@ubuntu:~]$ redis-cli
          Shell

          這將打開一個redis提示,如下所示 -

          redis 127.0.0.1:6379>
          Shell

          在上面的提示中,127.0.0.1是計(jì)算機(jī)的IP地址,6379是運(yùn)行Redis服務(wù)器的端口。 現(xiàn)在鍵入以下PING命令。

          redis 127.0.0.1:6379> ping PONG
          Shell

          這表明Redis已成功在您的計(jì)算機(jī)上安裝了。

          在Ubuntu上安裝Redis桌面管理

          要在Ubuntu上安裝Redis桌面管理器,可從 http://redisdesktop.com/download 下載該軟件包,安裝即可。

          打開下載的軟件包并安裝。

          Redis桌面管理器將提供用于管理Redis的鍵和數(shù)據(jù)的UI。

          2. Redis配置

          在Redis中,在Redis的根目錄下有一個配置文件(redis.conf)。當(dāng)然您可以通過Redis CONFIG命令獲取和設(shè)置所有的Redis配置。

          語法
          以下是Redis中的CONFIG命令的基本語法。

          redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
          Shell

          示例

          redis 127.0.0.1:6379> CONFIG GET loglevel 1) 'loglevel' 2) 'notice'
          Shell

          要獲取所有配置設(shè)置,請使用*代替CONFIG_SETTING_NAME

          示例

          redis 127.0.0.1:6379> CONFIG GET * 1) 'dbfilename' 2) 'dump.rdb' 3) 'requirepass' 4) '' 5) 'masterauth' 6) '' 7) 'unixsocket' 8) '' 9) 'logfile' 10) '/var/log/redis/redis-server.log' 11) 'pidfile' 12) '/var/run/redis/redis-server.pid' 13) 'maxmemory' 14) '3221225472' 15) 'maxmemory-samples' 16) '3' 17) 'timeout' 18) '0' 19) 'tcp-keepalive' 20) '0' 21) 'auto-aof-rewrite-percentage' 22) '100' 23) 'auto-aof-rewrite-min-size' 24) '67108864' 25) 'hash-max-ziplist-entries' 26) '512' 27) 'hash-max-ziplist-value' 28) '64' 29) 'list-max-ziplist-entries' 30) '512' 31) 'list-max-ziplist-value' 32) '64' 33) 'set-max-intset-entries' 34) '512' 35) 'zset-max-ziplist-entries' 36) '128' 37) 'zset-max-ziplist-value' 38) '64' 39) 'lua-time-limit' 40) '5000' 41) 'slowlog-log-slower-than' 42) '10000' 43) 'slowlog-max-len' 44) '128' 45) 'port' 46) '6379' 47) 'databases' 48) '16' 49) 'repl-ping-slave-period' 50) '10' 51) 'repl-timeout' 52) '60' 53) 'repl-backlog-size' 54) '1048576' 55) 'repl-backlog-ttl' 56) '3600' 57) 'maxclients' 58) '3984' 59) 'watchdog-period' 60) '0' 61) 'slave-priority' 62) '100' 63) 'min-slaves-to-write' 64) '0' 65) 'min-slaves-max-lag' 66) '10' 67) 'hz' 68) '10' 69) 'no-appendfsync-on-rewrite' 70) 'no' 71) 'slave-serve-stale-data' 72) 'yes' 73) 'slave-read-only' 74) 'yes' 75) 'stop-writes-on-bgsave-error' 76) 'yes' 77) 'daemonize' 78) 'yes' 79) 'rdbcompression' 80) 'yes' 81) 'rdbchecksum' 82) 'yes' 83) 'activerehashing' 84) 'yes' 85) 'repl-disable-tcp-nodelay' 86) 'no' 87) 'aof-rewrite-incremental-fsync' 88) 'yes' 89) 'appendonly' 90) 'no' 91) 'dir' 92) '/var/lib/redis' 93) 'maxmemory-policy' 94) 'noeviction' 95) 'appendfsync' 96) 'everysec' 97) 'save' 98) '900 1 300 10 60 10000' 99) 'loglevel'100) 'notice'101) 'client-output-buffer-limit'102) 'normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60'103) 'unixsocketperm'104) '0'105) 'slaveof'106) ''107) 'notify-keyspace-events'108) ''109) 'bind'110) '127.0.0.1'
          Shell

          編輯配置

          要更新配置,可以直接編輯redis.conf文件,也可以通過CONFIG set命令更新配置。

          語法
          以下是CONFIG SET命令的基本語法。

          redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
          Shell

          示例

          redis 127.0.0.1:6379> CONFIG SET loglevel 'notice' OK redis 127.0.0.1:6379> CONFIG GET loglevel 1) 'loglevel' 2) 'notice'
          Shell

          3. Redis數(shù)據(jù)類型

          Redis支持5種數(shù)據(jù)類型。

          字符串

          Redis中的字符串是一個字節(jié)序列。Redis中的字符串是二進(jìn)制安全的,這意味著它們的長度不由任何特殊的終止字符決定。因此,可以在一個字符串中存儲高達(dá)512兆字節(jié)的任何內(nèi)容。

          示例

          redis 127.0.0.1:6379> set name 'yiibai.com' OK redis 127.0.0.1:6379> get name 'yiibai.com'
          Shell

          在上面的示例中,setget是Redis命令,name是Redis中使用的鍵,yiibai.com是存儲在Redis中的字符串的值。

          注 - Redis命令不區(qū)分大小寫,如SET,Setset都是同一個命令。字符串值的最大長度為 512MB。

          散列/哈希

          Redis散列/哈希(Hashes)是鍵值對的集合。Redis散列/哈希是字符串字段和字符串值之間的映射。因此,它們用于表示對象。

          示例

          redis 127.0.0.1:6379> HMSET ukey username 'yiibai' password 'passswd123' points 200
          Shell

          在上述示例中,散列/哈希數(shù)據(jù)類型用于存儲包含用戶的基本信息的用戶對象。這里HMSET,HGETALL是Redis的命令,而ukey是鍵的名稱。

          每個散列/哈??梢源鎯Χ噙_(dá)2^32 - 1個健-值對(超過40億個)。

          列表

          Redis列表只是字符串列表,按插入順序排序。您可以向Redis列表的頭部或尾部添加元素。

          示例

          redis 127.0.0.1:6379> lpush alist redis (integer) 1 redis 127.0.0.1:6379> lpush alist mongodb (integer) 2 redis 127.0.0.1:6379> lpush alist sqlite (integer) 3 redis 127.0.0.1:6379> lrange alist 0 10 1) 'sqlite' 2) 'mongodb' 3) 'redis'
          Shell

          列表的最大長度為2^32 - 1個元素(4294967295,每個列表可容納超過40億個元素)。

          集合

          Redis集合是字符串的無序集合。在Redis中,您可以添加,刪除和測試成員存在的時間O(1)復(fù)雜性。

          示例

          redis 127.0.0.1:6379> sadd yiibailist redis (integer) 1 redis 127.0.0.1:6379> sadd yiibailist mongodb (integer) 1 redis 127.0.0.1:6379> sadd yiibailist sqlite (integer) 1 redis 127.0.0.1:6379> sadd yiibailist sqlite (integer) 0 redis 127.0.0.1:6379> smembers yiibailist 1) 'sqlite' 2) 'mongodb' 3) 'redis'
          Shell

          注意 - 在上面的示例中,sqlite被添加了兩次,但是由于集合的唯一屬性,所以它只算添加一次。

          一個集合中的最大成員數(shù)量為2^32 - 1(即4294967295,每個集合中元素?cái)?shù)量可達(dá)40億個)個。

          可排序集合

          Redis可排序集合類似于Redis集合,是不重復(fù)的字符集合。 不同之處在于,排序集合的每個成員都與分?jǐn)?shù)相關(guān)聯(lián),這個分?jǐn)?shù)用于按最小分?jǐn)?shù)到最大分?jǐn)?shù)來排序的排序集合。雖然成員是唯一的,但分?jǐn)?shù)值可以重復(fù)。

          示例

          redis 127.0.0.1:6379> zadd yiibaiset 0 redis(integer) 1 redis 127.0.0.1:6379> zadd yiibaiset 0 mongodb(integer) 1 redis 127.0.0.1:6379> zadd yiibaiset 1 sqlite(integer) 1 redis 127.0.0.1:6379> zadd yiibaiset 1 sqlite(integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE yiibaiset 0 1000 1) 'mongodb' 2) 'redis' 3) 'sqlite'
          Shell

          因?yàn)?‘sqlite‘ 的排序值是 1 ,其它兩個元素的排序值是 0 ,所以 ‘sqlite‘ 排在最后一個位置上。

          4. Redis命令

          Redis命令是用于在Redis服務(wù)器上執(zhí)行一些操作。
          要在Redis服務(wù)器上運(yùn)行命令,需要一個Redis客戶端。Redis客戶端在Redis包中有提供,這個包在我們前面的安裝教程中就有安裝過了。

          語法
          以下是Redis客戶端的基本語法。

          [yiibai@ubuntu:~]$ redis-cli
          Shell

          示例
          以下示例說明了如何啟動Redis客戶端。

          要啟動Redis客戶端,請打開終端并鍵入命令redis-cli。 這將連接到您的本地Redis服務(wù)器,現(xiàn)在可以運(yùn)行任何的Redis命令了。

          [yiibai@ubuntu:~]$redis-cli redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING PONG
          Shell

          在上面的示例中,連接到到在本地機(jī)器上運(yùn)行的Redis服務(wù)器并執(zhí)行PING命令,該命令檢查服務(wù)器是否正在運(yùn)行。

          在遠(yuǎn)程服務(wù)器上運(yùn)行命令

          要在Redis遠(yuǎn)程服務(wù)器上運(yùn)行命令,需要通過客戶端redis-cli連接到服務(wù)器

          語法

          [yiibai@ubuntu:~]$ redis-cli -h host -p port -a password
          Shell

          示例
          以下示例顯示如何連接到Redis遠(yuǎn)程服務(wù)器,在主機(jī)(host)127.0.0.1,端口(port)6379上運(yùn)行,并使用密碼為 mypass。

          [yiibai@ubuntu:~]$ redis-cli -h 127.0.0.1 -p 6379 -a 'mypass' redis 127.0.0.1:6379> redis 127.0.0.1:6379> PING PONG
          Shell

          5. Redis鍵命令

          Redis鍵命令用于管理Redis中的鍵。以下是使用redis鍵命令的語法。

          語法

          redis 127.0.0.1:6379> COMMAND KEY_NAME
          Shell

          示例

          redis 127.0.0.1:6379> SET akey redisOK redis 127.0.0.1:6379> DEL akey(integer) 1127.0.0.1:6379> GET akey(nil)
          Shell

          在上面的例子中,DEL是Redis的命令,而akey是鍵的名稱。如果鍵被刪除,則命令的輸出將為(integer) 1,否則為(integer) 0。

          Redis鍵命令

          下表列出了與鍵相關(guān)的一些基本命令。

          編號命令描述
          1DEL key此命令刪除一個指定鍵(如果存在)。
          2DUMP key此命令返回存儲在指定鍵的值的序列化版本。
          3EXISTS key此命令檢查鍵是否存在。
          4EXPIRE key seconds設(shè)置鍵在指定時間秒數(shù)之后到期/過期。
          5EXPIREAT key timestamp設(shè)置在指定時間戳之后鍵到期/過期。這里的時間是Unix時間戳格式。
          6PEXPIRE key milliseconds設(shè)置鍵的到期時間(以毫秒為單位)。
          7PEXPIREAT key milliseconds-timestamp以Unix時間戳形式來設(shè)置鍵的到期時間(以毫秒為單位)。
          8KEYS pattern查找與指定模式匹配的所有鍵。
          9MOVE key db將鍵移動到另一個數(shù)據(jù)庫。
          10PERSIST key刪除指定鍵的過期時間,得永生。
          11PTTL key獲取鍵的剩余到期時間。
          12RANDOMKEY從Redis返回一個隨機(jī)的鍵。
          13RENAME key newkey更改鍵的名稱。
          14PTTL key獲取鍵到期的剩余時間(以毫秒為單位)。
          15RENAMENX key newkey如果新鍵不存在,重命名鍵。
          16TYPE key返回存儲在鍵中的值的數(shù)據(jù)類型。

          6. Redis字符串

          Redis字符串命令用于管理Redis中的字符串值。以下是使用Redis字符串命令的語法。

          redis 127.0.0.1:6379> COMMAND KEY_NAME
          Shell

          示例

          redis 127.0.0.1:6379> SET mykey 'redis' OK redis 127.0.0.1:6379> GET mykey 'redis'
          Shell

          在上面的例子中,SETGET是redis中的命令,而mykey是鍵的名稱。

          Redis字符串命令

          下表列出了一些用于在Redis中管理字符串的基本命令。

          編號命令描述說明
          1SET key value此命令設(shè)置指定鍵的值。
          2GET key獲取指定鍵的值。
          3GETRANGE key start end獲取存儲在鍵上的字符串的子字符串。
          4GETSET key value設(shè)置鍵的字符串值并返回其舊值。
          5GETBIT key offset返回在鍵處存儲的字符串值中偏移處的位值。
          6MGET key1 [key2..]獲取所有給定鍵的值
          7SETBIT key offset value存儲在鍵上的字符串值中設(shè)置或清除偏移處的位
          8SETEX key seconds value使用鍵和到期時間來設(shè)置值
          9SETNX key value設(shè)置鍵的值,僅當(dāng)鍵不存在時
          10SETRANGE key offset value在指定偏移處開始的鍵處覆蓋字符串的一部分
          11STRLEN key獲取存儲在鍵中的值的長度
          12MSET key value [key value …]為多個鍵分別設(shè)置它們的值
          13MSETNX key value [key value …]為多個鍵分別設(shè)置它們的值,僅當(dāng)鍵不存在時
          14PSETEX key milliseconds value設(shè)置鍵的值和到期時間(以毫秒為單位)
          15INCR key將鍵的整數(shù)值增加1
          16INCRBY key increment將鍵的整數(shù)值按給定的數(shù)值增加
          17INCRBYFLOAT key increment將鍵的浮點(diǎn)值按給定的數(shù)值增加
          18DECR key將鍵的整數(shù)值減1
          19DECRBY key decrement按給定數(shù)值減少鍵的整數(shù)值
          20APPEND key value將指定值附加到鍵

          7. Redis哈希

          Redis Hashes是字符串字段和字符串值之間的映射(類似于PHP中的數(shù)組類型)。 因此,它們是表示對象的完美數(shù)據(jù)類型。

          在Redis中,每個哈希(散列)可以存儲多達(dá)4億個鍵-值對。

          示例

          redis 127.0.0.1:6379> HMSET myhash name 'redis tutorial' description 'redis basic commands for caching' likes 20 visitors 23000 OK 127.0.0.1:6379> HGETALL myhash1) 'field1'2) 'Hello'3) 'field2'4) 'World'5) 'name'6) 'redis tutorial'
          Shell

          在上面的例子中,在名稱為’myhash‘的哈希中設(shè)置了Redis教程的詳細(xì)信息(名稱,描述,喜歡,訪問者)。

          8. Redis列表

          Redis列表只是字符串列表,按插入順序排序??梢栽诹斜淼念^部或尾部添加Redis列表中的元素。

          列表的最大長度為2^32 - 1個元素(即4294967295,每個列表可存儲超過40億個元素)。

          示例

          redis 127.0.0.1:6379> LPUSH mylist 'redis' (integer) 1 redis 127.0.0.1:6379> LPUSH mylist 'mongodb'(integer) 2 redis 127.0.0.1:6379> LPUSH mylist 'mysql'(integer) 3 redis 127.0.0.1:6379> LRANGE mylist 0 10 1) 'mysql' 2) 'mongodb' 3) 'redis'
          Shell

          在上面的示例中,通過命令LPUSH將三個值插入到名稱為“mylist”的Redis列表中。

          8. Redis集合

          Redis集合是唯一字符串的無序集合。 唯一值表示集合中不允許鍵中有重復(fù)的數(shù)據(jù)。

          在Redis中設(shè)置添加,刪除和測試成員的存在(恒定時間O(1),而不考慮集合中包含的元素?cái)?shù)量)。列表的最大長度為2^32 - 1個元素(即4294967295,每組集合超過40億個元素)。

          示例

          redis 127.0.0.1:6379> SADD myset 'redis' (integer) 1 redis 127.0.0.1:6379> SADD myset 'mongodb' (integer) 1 redis 127.0.0.1:6379> SADD myset 'mysql' (integer) 1 redis 127.0.0.1:6379> SADD myset 'mysql' (integer) 0 redis 127.0.0.1:6379> SMEMBERS 'myset' 1) 'mysql' 2) 'mongodb' 3) 'redis'
          Shell

          在上面的示例中,通過命令SADD將三個值插入到名稱為“myset”的Redis集合中。

          9. Redis發(fā)送訂閱

          Redis發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息。
          Redis 發(fā)布訂閱(pub/sub)實(shí)現(xiàn)了消息系統(tǒng),發(fā)送者(在redis術(shù)語中稱為發(fā)布者)在接收者(訂閱者)接收消息時發(fā)送消息。傳送消息的鏈路稱為信道。

          在Redis中,客戶端可以訂閱任意數(shù)量的信道。

          示例

          以下示例說明了發(fā)布用戶概念的工作原理。 在以下示例中,一個客戶端訂閱名為“redisChat”的信道。

          redis 127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) 'subscribe' 2) 'redisChat' 3) (integer) 1
          Shell

          現(xiàn)在,兩個客戶端在名稱為“redisChat”的相同信道上發(fā)布消息,并且上述訂閱的客戶端接收消息。

          redis 127.0.0.1:6379> PUBLISH redisChat 'Redis is a great caching technique' (integer) 1 redis 127.0.0.1:6379> PUBLISH redisChat 'Learn redis by yiibai' (integer) 1 1) 'message' 2) 'redisChat' 3) 'Redis is a great caching technique' 1) 'message' 2) 'redisChat' 3) 'Learn redis by yiibai'
          Shell

          10. Redis事務(wù)

          Redis事務(wù)允許在單個步驟中執(zhí)行一組命令。以下是事務(wù)的兩個屬性:

          • 事務(wù)中的所有命令作為單個隔離操作并按順序執(zhí)行。不可以在執(zhí)行Redis事務(wù)的中間向另一個客戶端發(fā)出的請求。
          • Redis事務(wù)也是原子的。原子意味著要么處理所有命令,要么都不處理。

          語法示例

          Redis事務(wù)由命令MULTI命令啟動,然后需要傳遞一個應(yīng)該在事務(wù)中執(zhí)行的命令列表,然后整個事務(wù)由EXEC命令執(zhí)行。

          redis 127.0.0.1:6379> MULTI OK List of commands here redis 127.0.0.1:6379> EXEC
          Shell

          示例

          以下示例說明了如何啟動和執(zhí)行Redis事務(wù)。

          redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET mykey 'redis' QUEUED redis 127.0.0.1:6379> GET mykey QUEUED redis 127.0.0.1:6379> INCR visitors QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) 'redis' 3) (integer) 1
          Shell

          11. Redis腳本

          Redis腳本用于使用Lua解釋器來執(zhí)行腳本。從Redis 2.6.0版開始內(nèi)置到Redis中。使用腳本的命令是EVAL命令。

          語法

          以下是EVAL命令的基本語法。

          redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]
          Shell

          示例

          以下示例說明了Redis腳本的工作原理。

          redis 127.0.0.1:6379> EVAL 'return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}' 2 key1 key2 first second 1) 'key1' 2) 'key2' 3) 'first' 4) 'second'
          Shell

          12. Redis連接

          Redis中的連接命令基本上是用于管理與Redis服務(wù)器的客戶端連接。

          示例

          以下示例說明客戶端如何向Redis服務(wù)器驗(yàn)證自身,并檢查服務(wù)器是否正在運(yùn)行。

          redis 127.0.0.1:6379> AUTH 'password' OK redis 127.0.0.1:6379> PING PONG
          Shell

          Redis連接命令

          下表列出了與Redis連接相關(guān)的一些基本命令。

          序號命令說明
          1AUTH password使用給定的密碼驗(yàn)證服務(wù)器
          2ECHO message打印給定的字符串信息
          3PING檢查服務(wù)器是否正在運(yùn)行
          4QUIT關(guān)閉當(dāng)前連接
          5SELECT index更改當(dāng)前連接的所選數(shù)據(jù)庫

          13. Redis服務(wù)器

          Redis服務(wù)器命令基本上是用于管理Redis服務(wù)器。

          示例

          以下示例說明了如何獲取有關(guān)服務(wù)器的所有統(tǒng)計(jì)信息和信息。

          127.0.0.1:6379> info# Serverredis_version:2.8.4redis_git_sha1:00000000redis_git_dirty:0redis_build_id:8f6097d7914679caredis_mode:standaloneos:Linux 3.19.0-25-generic i686arch_bits:32multiplexing_api:epollgcc_version:4.8.2process_id:1004run_id:1e53acea2aa628199c4e438a3ed815d96eebc036tcp_port:6379uptime_in_seconds:888450uptime_in_days:10hz:10lru_clock:1861984config_file:/etc/redis/redis.conf# Clientsconnected_clients:1client_longest_output_list:0client_biggest_input_buf:0blocked_clients:0# Memoryused_memory:424872used_memory_human:414.91Kused_memory_rss:6709248used_memory_peak:424464used_memory_peak_human:414.52Kused_memory_lua:22528mem_fragmentation_ratio:15.79mem_allocator:jemalloc-3.4.1# Persistenceloading:0rdb_changes_since_last_save:0rdb_bgsave_in_progress:0rdb_last_save_time:1486607123rdb_last_bgsave_status:okrdb_last_bgsave_time_sec:0rdb_current_bgsave_time_sec:-1aof_enabled:0aof_rewrite_in_progress:0aof_rewrite_scheduled:0aof_last_rewrite_time_sec:-1aof_current_rewrite_time_sec:-1aof_last_bgrewrite_status:ok# Statstotal_connections_received:1total_commands_processed:263instantaneous_ops_per_sec:0rejected_connections:0sync_full:0sync_partial_ok:0sync_partial_err:0expired_keys:0evicted_keys:0keyspace_hits:257keyspace_misses:0pubsub_channels:0pubsub_patterns:0latest_fork_usec:4793# Replicationrole:masterconnected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0# CPUused_cpu_sys:24.65used_cpu_user:15.84used_cpu_sys_children:0.08used_cpu_user_children:0.00# Keyspacedb0:keys=14,expires=0,avg_ttl=0db1:keys=1,expires=0,avg_ttl=0127.0.0.1:6379>
          Shell

          14. Redis備份

          Redis數(shù)據(jù)庫可以使用安全的方案,使得進(jìn)行連接的任何客戶端在執(zhí)行命令之前都需要進(jìn)行身份驗(yàn)證。要保護(hù)Redis安全,需要在配置文件中設(shè)置密碼。

          示例

          下面的示例顯示了保護(hù)Redis實(shí)例的步驟。

          127.0.0.1:6379> CONFIG get requirepass 1) 'requirepass' 2) ''
          Shell

          默認(rèn)情況下,此屬性為空,這表示還沒有為此實(shí)例設(shè)置密碼。您可以通過執(zhí)行以下命令更改此屬性。

          127.0.0.1:6379> CONFIG set requirepass 'yiibai' OK 127.0.0.1:6379> CONFIG get requirepass 1) 'requirepass' 2) 'yiibai'
          Shell

          設(shè)置密碼后,如果任何客戶端運(yùn)行命令而不進(jìn)行身份驗(yàn)證,則會返回一個(error) NOAUTH Authentication required.的錯誤信息。 因此,客戶端需要使用AUTH命令來驗(yàn)證。

          語法

          以下是AUTH命令的基本語法。

          127.0.0.1:6379> AUTH password
          Shell

          示例

          127.0.0.1:6379> AUTH 'yiibai' OK 127.0.0.1:6379> SET mykey 'Test value' OK 127.0.0.1:6379> GET mykey 'Test value'
          Shell

          15. Redis客戶端連接

          Redis在配置的監(jiān)聽TCP端口和Unix套接字上等待和接受客戶端的連接(如果已啟用)。 當(dāng)接受新的客戶端連接時,執(zhí)行以下操作 -

          • 由于Redis使用復(fù)用和非阻塞I/O,因此客戶端套接字處于非阻塞狀態(tài)。
          • 設(shè)置TCP_NODELAY選項(xiàng)是為了確保連接不延遲。
          • 創(chuàng)建可讀文件事件,以便Redis能夠在套接字上讀取新數(shù)據(jù)時收集客戶端查詢。

          最大客戶數(shù)

          在Redis配置文件(redis.conf)中,有一個名稱為maxclients的屬性,它描述了可以連接到Redis的客戶端的最大數(shù)量。

          以下是命令的基本語法。

          127.0.0.1:6379> config get maxclients1) 'maxclients'2) '3984'
          Shell

          默認(rèn)情況下,此屬性設(shè)置為10000(取決于操作系統(tǒng)的文件描述符限制的最大數(shù)量),但您可以更改此屬性。

          示例

          在以下示例中,我們已將客戶端的最大數(shù)目設(shè)置為100000,并啟動服務(wù)器。

          yiibai@ubuntu:~$ redis-server --maxclients 100000
          Shell

          客戶端命令

          編號命令描述
          1CLIENT LIST返回連接到Redis服務(wù)器的客戶端列表
          2CLIENT SETNAME為當(dāng)前連接分配/設(shè)置新的名稱
          3CLIENT GETNAME返回由CLIENT SETNAME設(shè)置的當(dāng)前連接的名稱
          4CLIENT PAUSE這是一個連接控制命令,能夠?qū)⑺蠷edis客戶端按指定的時間量(以毫秒為單位)掛起
          5CLIENT KILL此命令關(guān)閉指定的客戶端連接。

          16. Redis管道

          Redis是一個TCP服務(wù)器,支持請求/響應(yīng)協(xié)議。 在Redis中,請求通過以下步驟完成:

          • 客戶端向服務(wù)器發(fā)送查詢,并從套接字讀取,通常以阻塞的方式,用于服務(wù)器響應(yīng)。
          • 服務(wù)器處理命令并將響應(yīng)發(fā)送回客戶端。

          管道的意義

          管道的基本含義是,客戶端可以向服務(wù)器發(fā)送多個請求,而不必等待回復(fù),并最終在一個步驟中讀取回復(fù)。

          示例

          要檢查Redis管道,只需啟動Redis實(shí)例,并在終端中鍵入以下命令。

          $(echo -en 'PING\r\n SET tutorial redis\r\nGET tutorial\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n'; sleep 10) | nc localhost 6379 PONG OK redis :1 :2 :3
          Shell

          在上面的例子中,我們將使用PING命令檢查Redis連接。這里設(shè)置了一個名稱為tutorial的字符串,值為redis。 然后得到鍵值,并增加 visitor 數(shù)量三次。 在結(jié)果中,我們可以看到所有命令都提交到Redis一次,Redis在一個步驟中提供所有命令的輸出。

          管道的好處

          這種技術(shù)的好處是大大提高了協(xié)議性能。通過管道從連接到本地主機(jī)速度增加五倍,因特網(wǎng)連接的至少快一百倍。

          17. Redis分區(qū)

          分區(qū)是將數(shù)據(jù)拆分為多個Redis實(shí)例的過程,因此每個實(shí)例只包含一部分鍵。

          分區(qū)的優(yōu)點(diǎn)

          • 它允許更大的數(shù)據(jù)庫,使用更多計(jì)算機(jī)的內(nèi)存總和。如果沒有分區(qū),則限制為單個計(jì)算機(jī)可以支持的內(nèi)存量。
          • 它允許將計(jì)算能力擴(kuò)展到多個核心和多個計(jì)算機(jī),并將網(wǎng)絡(luò)帶寬擴(kuò)展到多個計(jì)算機(jī)和網(wǎng)絡(luò)適配器。

          分區(qū)的缺點(diǎn)

          • 通常不支持涉及多個鍵的操作。 例如,如果兩個集合存儲在映射到不同Redis實(shí)例的鍵中,則不能執(zhí)行兩個集合之間的交集操作。
          • 不能使用涉及多個鍵的Redis事務(wù)。
          • 分區(qū)粒度是關(guān)鍵,因此不可能使用單個巨大的鍵(如非常大的排序集合)來分割數(shù)據(jù)集。
          • 使用分區(qū)時,數(shù)據(jù)處理更復(fù)雜。 例如,必須處理多個RDB/AOF文件,并獲得數(shù)據(jù)的備份,您需要聚合來自多個實(shí)例和主機(jī)的持久性文件。
          • 添加和刪除容量可能很復(fù)雜。 例如,Redis Cluster支持大多數(shù)透明的數(shù)據(jù)重新平衡,具有在運(yùn)行時添加和刪除節(jié)點(diǎn)的能力。但是,其他系統(tǒng)(如客戶端分區(qū)和代理)不支持此功能。但可以使用一種叫作Presharding的技術(shù)來處理這方面的問題。

          分區(qū)類型

          Redis中有兩種類型的分區(qū)。假設(shè)有四個Redis實(shí)例:R0,R1R2,R3以許多代表用戶的鍵,如user:1,user:2,…等等。

          范圍分區(qū)

          范圍分區(qū)通過將對象的范圍映射到特定的Redis實(shí)例來實(shí)現(xiàn)。假設(shè)在上面示例中,從ID 0到ID 10000的用戶將進(jìn)入實(shí)例R0,而從ID 10001到ID 20000的用戶將進(jìn)入實(shí)例R1,以此類推。

          哈希分區(qū)

          在這種類型的分區(qū)中,使用散列函數(shù)(例如,模函數(shù))將鍵轉(zhuǎn)換成數(shù)字,然后將數(shù)據(jù)存儲在不同的Redis實(shí)例中。

          18. Java連接Redis

          在Java程序中使用Redis之前,需要確保在機(jī)器上安裝了Redis的Java驅(qū)動程序和Java環(huán)境??梢韵仍趯ava電腦上并配置好環(huán)境。

          安裝

          現(xiàn)在,讓我們看看如何設(shè)置Redis Java驅(qū)動程序。

          Java連接到Redis服務(wù)器

          請參考以下一個簡單的示例代碼 -

          import redis.clients.jedis.Jedis; public class RedisJava { public static void main(String[] args) { //Connecting to Redis server on localhost Jedis jedis = new Jedis('localhost'); System.out.println('Connection to server sucessfully'); //check whether server is running or not System.out.println('Server is running: ' jedis.ping()); } }
          Java

          現(xiàn)在,編譯并運(yùn)行上面的程序來測試與Redis服務(wù)器的連接??梢愿鶕?jù)需要更改路徑。假設(shè)jedis.jar的當(dāng)前版本在當(dāng)前路徑中可以使用。
          執(zhí)行上面代碼,將生成以下結(jié)果 -

          $javac RedisJava.java $java RedisJava Connection to server sucessfully Server is running: PONG
          Java

          Redis Java字符串示例

          import redis.clients.jedis.Jedis; public class RedisStringJava { public static void main(String[] args) { //Connecting to Redis server on localhost Jedis jedis = new Jedis('localhost'); System.out.println('Connection to server sucessfully'); //set the data in redis string jedis.set('tutorial-name', 'Redis tutorial'); // Get the stored data and print it System.out.println('Stored string in redis:: ' jedis.get('tutorialname')); } }
          Java

          執(zhí)行上面代碼,將生成以下結(jié)果 -

          $javac RedisStringJava.java $java RedisStringJava Connection to server sucessfully Stored string in redis:: Redis tutorial
          Java

          Redis Java列表示例

          import redis.clients.jedis.Jedis; public class RedisListJava { public static void main(String[] args) { //Connecting to Redis server on localhost Jedis jedis = new Jedis('localhost'); System.out.println('Connection to server sucessfully'); //store data in redis list jedis.lpush('tutorial-list', 'Redis'); jedis.lpush('tutorial-list', 'Mongodb'); jedis.lpush('tutorial-list', 'Mysql'); // Get the stored data and print it List<String> list = jedis.lrange('tutorial-list', 0 ,5); for(int i = 0; i<list.size(); i ) { System.out.println('Stored string in redis:: ' list.get(i)); } } }
          Java

          執(zhí)行上面代碼,將生成以下結(jié)果 -

          $javac RedisListJava.java $java RedisListJava Connection to server sucessfully Stored string in redis:: Redis Stored string in redis:: Mongodb Stored string in redis:: Mysql
          Java

          Redis Java鍵示例

          import redis.clients.jedis.Jedis; public class RedisKeyJava { public static void main(String[] args) { //Connecting to Redis server on localhost Jedis jedis = new Jedis('localhost'); System.out.println('Connection to server sucessfully'); //store data in redis list // Get the stored data and print it List<String> list = jedis.keys('*'); for(int i = 0; i<list.size(); i ) { System.out.println('List of stored keys:: ' list.get(i)); } } }
          Java

          執(zhí)行上面代碼,將生成以下結(jié)果 -

          $javac RedisKeyJava.java $java RedisKeyJava Connection to server sucessfully List of stored keys:: tutorial-name List of stored keys:: tutorial-list
          Java

          19. PHP連接Redis

          在php程序中使用Redis之前,需要確保在機(jī)器上安裝了Redis的PHP驅(qū)動程序和PHP環(huán)境??梢韵仍趯HP電腦上并配置好環(huán)境。

          安裝

          現(xiàn)在,讓我們看看如何設(shè)置Redis PHP驅(qū)動程序。
          從github庫下載phpredis=> http://github.com/nicolasff/phpredis。 當(dāng)下載它之后,提取文件到phpredis目錄。在Ubuntu上,安裝以下擴(kuò)展。

          cd phpredis sudo phpize sudo ./configure sudo make sudo make install
          Shell

          現(xiàn)在,將“modules”文件夾的內(nèi)容復(fù)制并粘貼到PHP擴(kuò)展目錄中,并在php.ini中添加以下行。

          extension = redis.so
          Shell

          現(xiàn)在,Redis PHP安裝完成!

          使用連接到Redis服務(wù)器

          <?php //Connecting to Redis server on localhost $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo 'Connection to server sucessfully'; //check whether server is running or not echo 'Server is running: '.$redis->ping(); ?>
          PHP

          當(dāng)程序執(zhí)行時,將產(chǎn)生以下結(jié)果。

          Connection to server sucessfully Server is running: PONG
          Shell

          Redis PHP字符串示例

          <?php //Connecting to Redis server on localhost $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo 'Connection to server sucessfully'; //set the data in redis string $redis->set('tutorial-name', 'Redis tutorial'); // Get the stored data and print it echo 'Stored string in redis:: ' .$redisget('tutorial-name'); ?>
          PHP

          執(zhí)行上面代碼,將生成以下結(jié)果 -

          Connection to server sucessfully Stored string in redis:: Redis tutorial
          Java

          Redis php列表示例

          <?php //Connecting to Redis server on localhost $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo 'Connection to server sucessfully'; //store data in redis list $redis->lpush('tutorial-list', 'Redis'); $redis->lpush('tutorial-list', 'Mongodb'); $redis->lpush('tutorial-list', 'Mysql'); // Get the stored data and print it $arList = $redis->lrange('tutorial-list', 0 ,5); echo 'Stored string in redis:: '; print_r($arList); ?>
          PHP

          執(zhí)行上面代碼,將生成以下結(jié)果 -

          Connection to server sucessfully Stored string in redis:: Redis Mongodb Mysql
          PHP

          Redis php鍵示例

          <?php //Connecting to Redis server on localhost $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo 'Connection to server sucessfully'; // Get the stored keys and print it $arList = $redis->keys('*'); echo 'Stored keys in redis:: ' print_r($arList); ?>
          PHP

          執(zhí)行上面代碼,將生成以下結(jié)果 -

          Connection to server sucessfully Stored string in redis:: tutorial-name tutorial-list
          PHP

          20. C#連接Redis

          前面我們已經(jīng)準(zhǔn)備成功開啟Redis服務(wù),其端口號為6379,接下來我們就看看如何使用C#語言來操作Redis。就如MongoDB一樣,要操作Redis服務(wù),自然就需要下載C#的客戶端,這里通過Nuget下載了“ServiceStack.Redis”客戶端,引入成功之后,就可以使用C#來對Redis服務(wù)進(jìn)行操作了。

          由于Redis一般是用來作為緩存的,也就是一般我們把一些不經(jīng)常改變的數(shù)據(jù)通過Redis緩存起來,之后用戶的請求就不需要再訪問數(shù)據(jù)庫,而可以直接從Redis緩存中直接獲取,這樣就可以減輕數(shù)據(jù)庫服務(wù)器的壓力以及加快響應(yīng)速度。既然是用來做緩存的,也就是通過指定key值來把對應(yīng)Value保存起來,之后再根據(jù)key值來獲得之前緩存的值。具體的操作代碼如下所示,這里就不過多介紹了。

          請參考以下代碼 -

          class Program { static void Main(string[] args) { //在Redis中存儲常用的5種數(shù)據(jù)類型:String,Hash,List,SetSorted set var client = new RedisClient('127.0.0.1', 6379); //AddString(client); //AddHash(client); //AddList(client); //AddSet(client); AddSetSorted(client); Console.ReadLine(); } private static void AddString(RedisClient client) { var timeOut = new TimeSpan(0,0,0,30); client.Add('Test', 'Learninghard', timeOut); while (true) { if (client.ContainsKey('Test')) { Console.WriteLine('String Key: Test -Value: {0}, 當(dāng)前時間: {1}', client.Get<string>('Test'), DateTime.Now); Thread.Sleep(10000); } else { Console.WriteLine('Value 已經(jīng)過期了,當(dāng)前時間:{0}', DateTime.Now); break; } } var person = new Person() {Name = 'Learninghard', Age = 26}; client.Add('lh', person); var cachePerson = client.Get<Person>('lh'); Console.WriteLine('Person's Name is : {0}, Age: {1}', cachePerson.Name, cachePerson.Age); } private static void AddHash(RedisClient client) { if (client == null) throw new ArgumentNullException('client'); client.SetEntryInHash('HashId', 'Name', 'Learninghard'); client.SetEntryInHash('HashId', 'Age', '26'); client.SetEntryInHash('HashId', 'Sex', '男'); var hashKeys = client.GetHashKeys('HashId'); foreach (var key in hashKeys) { Console.WriteLine('HashId--Key:{0}', key); } var haskValues = client.GetHashValues('HashId'); foreach (var value in haskValues) { Console.WriteLine('HashId--Value:{0}', value); } var allKeys = client.GetAllKeys(); //獲取所有的key。 foreach (var key in allKeys) { Console.WriteLine('AllKey--Key:{0}', key); } } private static void AddList(RedisClient client) { if (client == null) throw new ArgumentNullException('client'); client.EnqueueItemOnList('QueueListId', '1.Learnghard'); //入隊(duì) client.EnqueueItemOnList('QueueListId', '2.張三'); client.EnqueueItemOnList('QueueListId', '3.李四'); client.EnqueueItemOnList('QueueListId', '4.王五'); var queueCount = client.GetListCount('QueueListId'); for (var i = 0; i < queueCount; i ) { Console.WriteLine('QueueListId出隊(duì)值:{0}', client.DequeueItemFromList('QueueListId')); //出隊(duì)(隊(duì)列先進(jìn)先出) } client.PushItemToList('StackListId', '1.Learninghard'); //入棧 client.PushItemToList('StackListId', '2.張三'); client.PushItemToList('StackListId', '3.李四'); client.PushItemToList('StackListId', '4.王五'); var stackCount = client.GetListCount('StackListId'); for (var i = 0; i < stackCount; i ) { Console.WriteLine('StackListId出棧值:{0}', client.PopItemFromList('StackListId')); //出棧(棧先進(jìn)后出) } } //它是string類型的無序集合。set是通過hash table實(shí)現(xiàn)的,添加,刪除和查找,對集合我們可以取并集,交集,差集 private static void AddSet(RedisClient client) { if (client == null) throw new ArgumentNullException('client'); client.AddItemToSet('Set1001', 'A'); client.AddItemToSet('Set1001', 'B'); client.AddItemToSet('Set1001', 'C'); client.AddItemToSet('Set1001', 'D'); var hastset1 = client.GetAllItemsFromSet('Set1001'); foreach (var item in hastset1) { Console.WriteLine('Set無序集合Value:{0}', item); //出來的結(jié)果是無須的 } client.AddItemToSet('Set1002', 'K'); client.AddItemToSet('Set1002', 'C'); client.AddItemToSet('Set1002', 'A'); client.AddItemToSet('Set1002', 'J'); var hastset2 = client.GetAllItemsFromSet('Set1002'); foreach (var item in hastset2) { Console.WriteLine('Set無序集合ValueB:{0}', item); //出來的結(jié)果是無須的 } var hashUnion = client.GetUnionFromSets(new string[] { 'Set1001', 'Set1002' }); foreach (var item in hashUnion) { Console.WriteLine('求Set1001和Set1002的并集:{0}', item); //并集 } var hashG = client.GetIntersectFromSets(new string[] { 'Set1001', 'Set1002' }); foreach (var item in hashG) { Console.WriteLine('求Set1001和Set1002的交集:{0}', item); //交集 } var hashD = client.GetDifferencesFromSet('Set1001', new string[] { 'Set1002' }); //[返回存在于第一個集合,但是不存在于其他集合的數(shù)據(jù)。差集] foreach (var item in hashD) { Console.WriteLine('求Set1001和Set1002的差集:{0}', item); //差集 } } /* sorted set 是set的一個升級版本,它在set的基礎(chǔ)上增加了一個順序的屬性,這一屬性在添加修改.元素的時候可以指定, * 每次指定后,zset(表示有序集合)會自動重新按新的值調(diào)整順序??梢岳斫鉃橛辛械谋?,一列存 value,一列存順序。操作中key理解為zset的名字. */ private static void AddSetSorted(RedisClient client) { if (client == null) throw new ArgumentNullException('client'); client.AddItemToSortedSet('SetSorted1001', 'A'); client.AddItemToSortedSet('SetSorted1001', 'B'); client.AddItemToSortedSet('SetSorted1001', 'C'); var listSetSorted = client.GetAllItemsFromSortedSet('SetSorted1001'); foreach (var item in listSetSorted) { Console.WriteLine('SetSorted有序集合{0}', item); } client.AddItemToSortedSet('SetSorted1002', 'A', 400); client.AddItemToSortedSet('SetSorted1002', 'D', 200); client.AddItemToSortedSet('SetSorted1002', 'B', 300); // 升序獲取第一個值:'D' var list = client.GetRangeFromSortedSet('SetSorted1002', 0, 0); foreach (var item in list) { Console.WriteLine(item); } //降序獲取第一個值:'A' list = client.GetRangeFromSortedSetDesc('SetSorted1002', 0, 0); foreach (var item in list) { Console.WriteLine(item); } } } class Person { public string Name { get; set; } public int Age { get; set; } }
          C#

          如何要想查看自己操作是否成功,也可以像MongoDB那樣下載一個客戶端工具,這里推薦一款Redis Desktop Manager。這個工具就相當(dāng)于SQL Server的客戶端工具一樣。通過這款工具可以查看Redis服務(wù)器中保存的數(shù)據(jù)和對應(yīng)格式。其使用也非常簡單,只需要添加一個Redis服務(wù)連接即可。該工具的下載地址為:http://pan.baidu.com/s/1sjp55Ul

          本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
          打開APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          生活服務(wù)
          分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
          綁定賬號成功
          后續(xù)可登錄賬號暢享VIP特權(quán)!
          如果VIP功能使用有故障,
          可點(diǎn)擊這里聯(lián)系客服!

          聯(lián)系客服