以下是Redis的一些優(yōu)點(diǎn)。
110000
次的設(shè)置(SET
)操作,每秒大約可執(zhí)行81000
次的讀取/獲取(GET
)操作。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ù)雜性。
在本章中,您將了解和學(xué)習(xí)Redis的環(huán)境安裝設(shè)置。
要在Ubuntu上安裝Redis,打開終端并鍵入以下命令 -
[yiibai@ubuntu:~]$ sudo apt-get update [yiibai@ubuntu:~]$ sudo apt-get install redis-server
這將在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
檢查Redis是否正在工作
[yiibai@ubuntu:~]$ redis-cli
這將打開一個redis提示,如下所示 -
redis 127.0.0.1:6379>
在上面的提示中,127.0.0.1
是計(jì)算機(jī)的IP地址,6379
是運(yùn)行Redis服務(wù)器的端口。 現(xiàn)在鍵入以下PING
命令。
redis 127.0.0.1:6379> ping PONG
這表明Redis已成功在您的計(jì)算機(jī)上安裝了。
在Ubuntu上安裝Redis桌面管理
要在Ubuntu上安裝Redis桌面管理器,可從 http://redisdesktop.com/download 下載該軟件包,安裝即可。
打開下載的軟件包并安裝。
Redis桌面管理器將提供用于管理Redis的鍵和數(shù)據(jù)的UI。
在Redis中,在Redis的根目錄下有一個配置文件(redis.conf
)。當(dāng)然您可以通過Redis CONFIG
命令獲取和設(shè)置所有的Redis配置。
語法
以下是Redis中的CONFIG
命令的基本語法。
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
示例
redis 127.0.0.1:6379> CONFIG GET loglevel 1) 'loglevel' 2) 'notice'
要獲取所有配置設(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'
要更新配置,可以直接編輯redis.conf
文件,也可以通過CONFIG set
命令更新配置。
語法
以下是CONFIG SET
命令的基本語法。
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
示例
redis 127.0.0.1:6379> CONFIG SET loglevel 'notice' OK redis 127.0.0.1:6379> CONFIG GET loglevel 1) 'loglevel' 2) 'notice'
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'
在上面的示例中,set
和get
是Redis命令,name
是Redis中使用的鍵,yiibai.com
是存儲在Redis中的字符串的值。
注 - Redis命令不區(qū)分大小寫,如
SET
,Set
和set
都是同一個命令。字符串值的最大長度為 512MB。
Redis散列/哈希(Hashes)是鍵值對的集合。Redis散列/哈希是字符串字段和字符串值之間的映射。因此,它們用于表示對象。
示例
redis 127.0.0.1:6379> HMSET ukey username 'yiibai' password 'passswd123' points 200
在上述示例中,散列/哈希數(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'
列表的最大長度為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'
注意 - 在上面的示例中,
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'
因?yàn)?‘sqlite
‘ 的排序值是 1 ,其它兩個元素的排序值是 0 ,所以 ‘sqlite
‘ 排在最后一個位置上。
Redis命令是用于在Redis服務(wù)器上執(zhí)行一些操作。
要在Redis服務(wù)器上運(yùn)行命令,需要一個Redis客戶端。Redis客戶端在Redis包中有提供,這個包在我們前面的安裝教程中就有安裝過了。
語法
以下是Redis客戶端的基本語法。
[yiibai@ubuntu:~]$ redis-cli
示例
以下示例說明了如何啟動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
在上面的示例中,連接到到在本地機(jī)器上運(yùn)行的Redis服務(wù)器并執(zhí)行PING
命令,該命令檢查服務(wù)器是否正在運(yùn)行。
要在Redis遠(yuǎn)程服務(wù)器上運(yùn)行命令,需要通過客戶端redis-cli
連接到服務(wù)器
語法
[yiibai@ubuntu:~]$ redis-cli -h host -p port -a password
示例
以下示例顯示如何連接到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
Redis鍵命令用于管理Redis中的鍵。以下是使用redis鍵命令的語法。
語法
redis 127.0.0.1:6379> COMMAND KEY_NAME
示例
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)
在上面的例子中,DEL
是Redis的命令,而akey
是鍵的名稱。如果鍵被刪除,則命令的輸出將為(integer) 1
,否則為(integer) 0
。
下表列出了與鍵相關(guān)的一些基本命令。
編號 | 命令 | 描述 |
---|---|---|
1 | DEL key | 此命令刪除一個指定鍵(如果存在)。 |
2 | DUMP key | 此命令返回存儲在指定鍵的值的序列化版本。 |
3 | EXISTS key | 此命令檢查鍵是否存在。 |
4 | EXPIRE key seconds | 設(shè)置鍵在指定時間秒數(shù)之后到期/過期。 |
5 | EXPIREAT key timestamp | 設(shè)置在指定時間戳之后鍵到期/過期。這里的時間是Unix時間戳格式。 |
6 | PEXPIRE key milliseconds | 設(shè)置鍵的到期時間(以毫秒為單位)。 |
7 | PEXPIREAT key milliseconds-timestamp | 以Unix時間戳形式來設(shè)置鍵的到期時間(以毫秒為單位)。 |
8 | KEYS pattern | 查找與指定模式匹配的所有鍵。 |
9 | MOVE key db | 將鍵移動到另一個數(shù)據(jù)庫。 |
10 | PERSIST key | 刪除指定鍵的過期時間,得永生。 |
11 | PTTL key | 獲取鍵的剩余到期時間。 |
12 | RANDOMKEY | 從Redis返回一個隨機(jī)的鍵。 |
13 | RENAME key newkey | 更改鍵的名稱。 |
14 | PTTL key | 獲取鍵到期的剩余時間(以毫秒為單位)。 |
15 | RENAMENX key newkey | 如果新鍵不存在,重命名鍵。 |
16 | TYPE key | 返回存儲在鍵中的值的數(shù)據(jù)類型。 |
Redis字符串命令用于管理Redis中的字符串值。以下是使用Redis字符串命令的語法。
redis 127.0.0.1:6379> COMMAND KEY_NAME
示例
redis 127.0.0.1:6379> SET mykey 'redis' OK redis 127.0.0.1:6379> GET mykey 'redis'
在上面的例子中,SET
和GET
是redis中的命令,而mykey
是鍵的名稱。
下表列出了一些用于在Redis中管理字符串的基本命令。
編號 | 命令 | 描述說明 |
---|---|---|
1 | SET key value | 此命令設(shè)置指定鍵的值。 |
2 | GET key | 獲取指定鍵的值。 |
3 | GETRANGE key start end | 獲取存儲在鍵上的字符串的子字符串。 |
4 | GETSET key value | 設(shè)置鍵的字符串值并返回其舊值。 |
5 | GETBIT key offset | 返回在鍵處存儲的字符串值中偏移處的位值。 |
6 | MGET key1 [key2..] | 獲取所有給定鍵的值 |
7 | SETBIT key offset value | 存儲在鍵上的字符串值中設(shè)置或清除偏移處的位 |
8 | SETEX key seconds value | 使用鍵和到期時間來設(shè)置值 |
9 | SETNX key value | 設(shè)置鍵的值,僅當(dāng)鍵不存在時 |
10 | SETRANGE key offset value | 在指定偏移處開始的鍵處覆蓋字符串的一部分 |
11 | STRLEN key | 獲取存儲在鍵中的值的長度 |
12 | MSET key value [key value …] | 為多個鍵分別設(shè)置它們的值 |
13 | MSETNX key value [key value …] | 為多個鍵分別設(shè)置它們的值,僅當(dāng)鍵不存在時 |
14 | PSETEX key milliseconds value | 設(shè)置鍵的值和到期時間(以毫秒為單位) |
15 | INCR key | 將鍵的整數(shù)值增加1 |
16 | INCRBY key increment | 將鍵的整數(shù)值按給定的數(shù)值增加 |
17 | INCRBYFLOAT key increment | 將鍵的浮點(diǎn)值按給定的數(shù)值增加 |
18 | DECR key | 將鍵的整數(shù)值減1 |
19 | DECRBY key decrement | 按給定數(shù)值減少鍵的整數(shù)值 |
20 | APPEND key value | 將指定值附加到鍵 |
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'
在上面的例子中,在名稱為’myhash
‘的哈希中設(shè)置了Redis教程的詳細(xì)信息(名稱,描述,喜歡,訪問者)。
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'
在上面的示例中,通過命令LPUSH
將三個值插入到名稱為“mylist
”的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'
在上面的示例中,通過命令SADD
將三個值插入到名稱為“myset
”的Redis集合中。
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
現(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'
Redis事務(wù)允許在單個步驟中執(zhí)行一組命令。以下是事務(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
以下示例說明了如何啟動和執(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
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 ...]
以下示例說明了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'
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
下表列出了與Redis連接相關(guān)的一些基本命令。
序號 | 命令 | 說明 |
---|---|---|
1 | AUTH password | 使用給定的密碼驗(yàn)證服務(wù)器 |
2 | ECHO message | 打印給定的字符串信息 |
3 | PING | 檢查服務(wù)器是否正在運(yùn)行 |
4 | QUIT | 關(guān)閉當(dāng)前連接 |
5 | SELECT index | 更改當(dāng)前連接的所選數(shù)據(jù)庫 |
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>
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) ''
默認(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'
設(shè)置密碼后,如果任何客戶端運(yùn)行命令而不進(jìn)行身份驗(yàn)證,則會返回一個(error) NOAUTH Authentication required.的錯誤信息。 因此,客戶端需要使用AUTH命令來驗(yàn)證。
以下是AUTH命令的基本語法。
127.0.0.1:6379> AUTH password
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'
Redis在配置的監(jiān)聽TCP端口和Unix套接字上等待和接受客戶端的連接(如果已啟用)。 當(dāng)接受新的客戶端連接時,執(zhí)行以下操作 -
I/O
,因此客戶端套接字處于非阻塞狀態(tài)。TCP_NODELAY
選項(xiàng)是為了確保連接不延遲。在Redis配置文件(redis.conf
)中,有一個名稱為maxclients
的屬性,它描述了可以連接到Redis的客戶端的最大數(shù)量。
以下是命令的基本語法。
127.0.0.1:6379> config get maxclients1) 'maxclients'2) '3984'
默認(rèn)情況下,此屬性設(shè)置為10000
(取決于操作系統(tǒng)的文件描述符限制的最大數(shù)量),但您可以更改此屬性。
在以下示例中,我們已將客戶端的最大數(shù)目設(shè)置為100000
,并啟動服務(wù)器。
yiibai@ubuntu:~$ redis-server --maxclients 100000
編號 | 命令 | 描述 |
---|---|---|
1 | CLIENT LIST | 返回連接到Redis服務(wù)器的客戶端列表 |
2 | CLIENT SETNAME | 為當(dāng)前連接分配/設(shè)置新的名稱 |
3 | CLIENT GETNAME | 返回由CLIENT SETNAME 設(shè)置的當(dāng)前連接的名稱 |
4 | CLIENT PAUSE | 這是一個連接控制命令,能夠?qū)⑺蠷edis客戶端按指定的時間量(以毫秒為單位)掛起 |
5 | CLIENT KILL | 此命令關(guān)閉指定的客戶端連接。 |
Redis是一個TCP服務(wù)器,支持請求/響應(yīng)協(xié)議。 在Redis中,請求通過以下步驟完成:
管道的基本含義是,客戶端可以向服務(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
在上面的例子中,我們將使用PING命令檢查Redis連接。這里設(shè)置了一個名稱為tutorial
的字符串,值為redis
。 然后得到鍵值,并增加 visitor
數(shù)量三次。 在結(jié)果中,我們可以看到所有命令都提交到Redis一次,Redis在一個步驟中提供所有命令的輸出。
這種技術(shù)的好處是大大提高了協(xié)議性能。通過管道從連接到本地主機(jī)速度增加五倍,因特網(wǎng)連接的至少快一百倍。
分區(qū)是將數(shù)據(jù)拆分為多個Redis實(shí)例的過程,因此每個實(shí)例只包含一部分鍵。
Redis中有兩種類型的分區(qū)。假設(shè)有四個Redis實(shí)例:R0
,R1
,R2
,R3
以許多代表用戶的鍵,如user:1
,user:2
,…等等。
范圍分區(qū)通過將對象的范圍映射到特定的Redis實(shí)例來實(shí)現(xiàn)。假設(shè)在上面示例中,從ID 0到ID 10000的用戶將進(jìn)入實(shí)例R0
,而從ID 10001到ID 20000的用戶將進(jìn)入實(shí)例R1
,以此類推。
在這種類型的分區(qū)中,使用散列函數(shù)(例如,模函數(shù))將鍵轉(zhuǎn)換成數(shù)字,然后將數(shù)據(jù)存儲在不同的Redis實(shí)例中。
在Java程序中使用Redis之前,需要確保在機(jī)器上安裝了Redis的Java驅(qū)動程序和Java環(huán)境??梢韵仍趯ava電腦上并配置好環(huán)境。
現(xiàn)在,讓我們看看如何設(shè)置Redis Java驅(qū)動程序。
jedis.jar
- http://repo1.maven.org/maven2/redis/clients/jedis/2.1.0/jedis-2.1.0-sources.jar ,確保下載的jedis.jar
是最新版本。jedis.jar
包含到類路徑中。請參考以下一個簡單的示例代碼 -
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()); } }
現(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
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')); } }
執(zhí)行上面代碼,將生成以下結(jié)果 -
$javac RedisStringJava.java $java RedisStringJava Connection to server sucessfully Stored string in redis:: Redis tutorial
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)); } } }
執(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
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)); } } }
執(zhí)行上面代碼,將生成以下結(jié)果 -
$javac RedisKeyJava.java $java RedisKeyJava Connection to server sucessfully List of stored keys:: tutorial-name List of stored keys:: tutorial-list
在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
現(xiàn)在,將“modules
”文件夾的內(nèi)容復(fù)制并粘貼到PHP擴(kuò)展目錄中,并在php.ini
中添加以下行。
extension = redis.so
現(xiàn)在,Redis PHP安裝完成!
<?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(); ?>
當(dāng)程序執(zhí)行時,將產(chǎn)生以下結(jié)果。
Connection to server sucessfully Server is running: PONG
<?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:: ' .$redis→get('tutorial-name'); ?>
執(zhí)行上面代碼,將生成以下結(jié)果 -
Connection to server sucessfully Stored string in redis:: Redis tutorial
<?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); ?>
執(zhí)行上面代碼,將生成以下結(jié)果 -
Connection to server sucessfully Stored string in redis:: Redis Mongodb Mysql
<?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); ?>
執(zhí)行上面代碼,將生成以下結(jié)果 -
Connection to server sucessfully Stored string in redis:: tutorial-name tutorial-list
前面我們已經(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; } }
如何要想查看自己操作是否成功,也可以像MongoDB那樣下載一個客戶端工具,這里推薦一款Redis Desktop Manager。這個工具就相當(dāng)于SQL Server的客戶端工具一樣。通過這款工具可以查看Redis服務(wù)器中保存的數(shù)據(jù)和對應(yīng)格式。其使用也非常簡單,只需要添加一個Redis服務(wù)連接即可。該工具的下載地址為:http://pan.baidu.com/s/1sjp55Ul