redis介紹redis
redis存儲結構類型:字符串類型、散列型、列表型、集合型、有序集合型。數據庫
redis內存存儲和持久化:redis數據庫中的數據都存儲在內存中,內存的讀寫速度快於硬盤,所以redis相對於那些將數據存儲在硬盤上數據庫有明顯的優點。redis能夠在一秒鐘內讀寫十萬個鍵值。redis提供持久化的支持,將內存中的數據異步寫入到硬盤中,使數據不會丟失,同時不影響業務繼續提供服務。緩存
redis豐富的功能:Redis雖然是做爲數據庫開發的,但因爲其提供了豐富的功能,愈來愈多的人將其用做緩存、隊列系統等。Redis可謂是名副其實的多面手。Redis能夠爲每一個鍵設置生存時間(Time To Live,TTL),生存時間到期後鍵會自動被刪除。這一功能配合出色的性能讓Redis能夠做爲緩存系統來使用,並且因爲Redis支持持久化和豐富的數據類型,使其成爲了另外一個很是流行的緩存系統Memcached的有力競爭者。討論 關於Redis和Memcached優劣的討論一直是一個熱門的話題。在性能上Redis是單線程模型,而Memcached支持多線程,因此在多核服務器上後者的性能更高一些。然而,前面已經介紹過,Redis的性能已經足夠優異,在絕大部分場合下其性能都不會成爲瓶頸。因此在使用時更應該關心的是兩者在功能上的區別,若是須要用到高級的數據類型或是持久化等功能,Redis將會是Memcached很好的替代品。做爲緩存系統,Redis還能夠限定數據佔用的最大內存空間,在數據達到空間限制後能夠按照必定的規則自動淘汰不須要的鍵。除此以外,Redis的列表類型鍵能夠用來實現隊列,而且支持阻塞式讀取,能夠很容易地實現一個高性能的優先級隊列。同時在更高層面上,Redis還支持「發佈/訂閱」的消息模式,能夠基於此構建聊天室① 等系統。服務器
系統環境:多線程
[root@DBSERVER ~]# uname -a Linux DBSERVER 2.6.18-274.el5 #1 SMP Fri Jul 8 17:36:59 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux [root@DBSERVER ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 5.7 (Tikanga)
安裝redis:app
tar -xf redis-3.0.0.tar.gz cd redis-3.0.0 make make install
編輯redis配置文件redis.conf,添加以下內容:異步
cp redis.conf /etc/redis.conf性能
logfile "/var/log/redis.log" port 6380 #默認redis的端口爲6379 pidfile /var/run/redis.pid
啓動redis:編碼
redis-server /etc/redis.conf &
查看進程:spa
[root@ORACLE ~]# ps -ef|grep redis root 6635 3519 0 11:42 pts/0 00:00:00 redis-server *:6380 root 6641 6537 0 11:43 pts/1 00:00:00 redis-cli -p 6380 root 6677 3519 0 12:23 pts/0 00:00:00 grep redis
使用redis-cli客戶端鏈接redis:
[root@ORACLE ~]# redis-cli -p 6380 127.0.0.1:6380> echo hi "hi" 127.0.0.1:6380> set foo 1 OK 127.0.0.1:6380>
關閉redis:
redis-cli -p 6380 shutdown
回覆類型
1.狀態回覆
狀態回覆(status reply)是最簡單的一種回覆,好比向Redis發送SET命令設置某個鍵的值時,Redis會回覆狀態OK表示設置成功。另外以前演示的對PING命令的回覆PONG也是狀態回覆。狀態回覆直接顯示狀態信息,例如:
redis>PING
PONG
2.錯誤回覆
當出現命令不存在或命令格式有錯誤等狀況時Redis會返回錯誤回覆(error reply)。錯誤回覆以(error)開頭,並在後面跟上錯誤信息。如執行一個不存在的命令:
redis>ERRORCOMMEND
(error) ERR unknown command 'ERRORCOMMEND'
3.整數回覆
Redis雖然沒有整數類型,可是卻提供了一些用於整數操做的命令,如遞增鍵值的INCR命令會以整數形式返回遞增後的鍵值。除此以外,一些其餘命令也會返回整數,如能夠獲取當前數據庫中鍵的數量的DBSIZE命令等。整數回覆(integer reply)以(integer)開頭,並在後面跟上整數數據:
redis>INCR foo
(integer) 1
4.字符串回覆字符串回覆(bulk reply)是最多見的一種回覆類型,當請求一個字符串類型鍵的鍵值或一個其餘類型鍵中的某個元素時就會獲得一個字符串回覆。字符串回覆以雙引號包裹:
redis>GET foo
"1"
特殊狀況是當請求的鍵值不存在時會獲得一個空結果,顯示爲(nil)。如:
redis>GET noexists
(nil)
5.多行字符串回覆
多行字符串回覆(multi-bulk reply)一樣很常見,如當請求一個非字符串類型鍵的元素列表時就會收到多行字符串回覆。多行字符串回覆中的每行字符串都以一個序號開頭,如:
redis> KEYS *
1) "bar"
2) "foo"
命令
字符類型
一個字符類型鍵容許存儲的數據的最大容量是512MB
一、賦值與取值
set key value
get key
127.0.0.1:6380> set foo 1 OK 127.0.0.1:6380> get foo "1" 127.0.0.1:6380> get name (nil) 127.0.0.1:6380>
當鍵不存在時,返回一個空值。
二、遞增數字
INCR key
127.0.0.1:6380> incr num (integer) 1 127.0.0.1:6380> incr num (integer) 2 127.0.0.1:6380> get num "2" 127.0.0.1:6380> set foo cheeron OK 127.0.0.1:6380> incr foo (error) ERR value is not an integer or out of range
當操做的鍵不存在時會默認鍵值爲0,因此第一次遞增爲1,當鍵值不是整數時,redis會提示錯誤。
三、增長指定的整數
INCRBY key increment
減小指定的整數
DECR key
DECRBY key decrement
127.0.0.1:6380> get num "2" 127.0.0.1:6380> incrby num 3 (integer) 5 127.0.0.1:6380> get num "5" 127.0.0.1:6380> decr num (integer) 4 127.0.0.1:6380> decrby num 2 (integer) 2 127.0.0.1:6380> get num "2" 127.0.0.1:6380>
四、增長指定浮點數
INCRBYFLOAT key increment
127.0.0.1:6380> get num "2" 127.0.0.1:6380> incrbyfloat num 2.4 "4.4" 127.0.0.1:6380> get num "4.4" 127.0.0.1:6380>
五、向尾部追加值
APPEND key value
獲取字符串長度
STRLEN key
127.0.0.1:6380> set key hello OK 127.0.0.1:6380> append key world (integer) 10 127.0.0.1:6380> get key "helloworld" 127.0.0.1:6380> strlen key (integer) 10 127.0.0.1:6380> set key 我是青銅 OK 127.0.0.1:6380> strlen key (integer) 12
當鍵值不存在時,返回長度爲0,redis接收到的是UTF-8編碼的中文,UTF-8編碼的中文的長度是3
六、同時得到/設置多個值
MSET key value key value ...
MGET key1 key2 key3
127.0.0.1:6380> mset num1 1 num2 2 num3 3 OK 127.0.0.1:6380> mget num1 num2 num3 1) "1" 2) "2" 3) "3" 127.0.0.1:6380>
散列類型
一、賦值與取值
HSET key field value
HGET key field
HMSET key field1 value field2 value ...
HMGET key field1 field2...
HGETALL key
127.0.0.1:6380> hget car price "500" 127.0.0.1:6380> hget car (error) ERR wrong number of arguments for 'hget' command 127.0.0.1:6380> hmset car price 500 color red date 20150213 OK 127.0.0.1:6380> hmget car price color date 1) "500" 2) "red" 3) "20150213" 127.0.0.1:6380> hgetall car 1) "price" 2) "500" 3) "color" 4) "red" 5) "date" 6) "20150213"
HSET命令的方便之處在於不區分插入和更新操做,這意味着修改數據時不用事先判斷字段是否存在來決定要執行的是插入操做(update)仍是更新操做(insert)。當執行的是插入操做時(即以前字段不存在)HSET命令會返回1,當執行的是更新操做時(即以前字段已經存在)HSET命令會返回0。更進一步,當鍵自己不存在時,HSET命令還會自動創建它。
127.0.0.1:6380> hset car price 600 (integer) 0 127.0.0.1:6380> hget car price "600" 127.0.0.1:6380> set car benz OK 127.0.0.1:6380> get car "benz" 127.0.0.1:6380> hget car price (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6380>
SET命令能夠覆蓋已經存在的鍵而不論原來鍵是什麼類型
二、判斷字段是否存在
HEXISTS key field
三、當字段不存在時賦值
HSETNX key field value
127.0.0.1:6380> hexists car model (integer) 0 127.0.0.1:6380> hset car model C200 (integer) 1 127.0.0.1:6380> hexists car model (integer) 1 127.0.0.1:6380> hexists car color (integer) 0 127.0.0.1:6380> hgetall car 1) "model" 2) "C200" 127.0.0.1:6380> hsetnx car color red (integer) 1 127.0.0.1:6380> hget car color "red" 127.0.0.1:6380>
四、增長數字
HINCRBY key field increment
刪除字段
HDEL key field1 field2...
127.0.0.1:6380> hincrby car num 100 (integer) 100 127.0.0.1:6380> hget car num "100" 127.0.0.1:6380> hgetall car 1) "model" 2) "C200" 3) "color" 4) "red" 5) "num" 6) "100" 127.0.0.1:6380> hdel car model (integer) 1 127.0.0.1:6380> hgetall car 1) "color" 2) "red" 3) "num" 4) "100" 127.0.0.1:6380> hdel car color num (integer) 2 127.0.0.1:6380> hgetall car (empty list or set)
只獲取字段名或字段值
HKEYS key
HVALS key
127.0.0.1:6380> HGETALL car 1) "price" 2) "100" 3) "color" 4) "red" 5) "model" 6) "C200" 127.0.0.1:6380> hkeys car 1) "price" 2) "color" 3) "model" 127.0.0.1:6380> hvals car 1) "100" 2) "red" 3) "C200"
獲取字段數量
HLEN key
127.0.0.1:6380> hgetall car 1) "price" 2) "100" 3) "color" 4) "red" 5) "model" 6) "C200" 127.0.0.1:6380> hlen car (integer) 3
列表
LPUSH key value1 value2 ... 從左邊插入
RPUSH key value1 value2 ... 從右邊插入
LPOP key 從左邊彈出
RPOP key 從右邊彈出
LLEN key 獲取key的長度
LRANGE key start stop 獲取某個範圍的值
LREM key count value 刪除某個值
(1)若是start的索引位置比stop的索引位置靠後,則會返回空列表。
(2)若是stop大於實際的索引範圍,則會返回到列表最右邊的元素
●當count>0時LREM命令會從列表左邊開始刪除前count個值爲value的元素;
●當count<0時LREM 命令會從列表右邊開始刪除前count個值爲value的元素;
●當count=0是LREM命令會刪除全部值爲value的元素。
127.0.0.1:6380> lpush aa 1 2 3 0 (integer) 4 127.0.0.1:6380> llen aa (integer) 4 127.0.0.1:6380> lrange aa 0 -1 1) "0" 2) "3" 3) "2" 4) "1" 127.0.0.1:6380> rpush -1 -2 -3 (integer) 2 127.0.0.1:6380> rpush aa -1 -2 -3 (integer) 7 127.0.0.1:6380> lrange aa 0 -1 1) "0" 2) "3" 3) "2" 4) "1" 5) "-1" 6) "-2" 7) "-3" 127.0.0.1:6380> lpop aa "0" 127.0.0.1:6380> lrange aa 0 -1 1) "3" 2) "2" 3) "1" 4) "-1" 5) "-2" 6) "-3" 127.0.0.1:6380> rpop aa "-3" 127.0.0.1:6380> lrange aa 0 -1 1) "3" 2) "2" 3) "1" 4) "-1" 5) "-2" 127.0.0.1:6380> lrange aa 2 4 1) "1" 2) "-1" 3) "-2" 127.0.0.1:6380> lrange aa 0 -1 1) "3" 2) "2" 3) "1" 4) "-1" 5) "-2" 127.0.0.1:6380> lrem aa 1 -1 (integer) 1 127.0.0.1:6380> lrange aa 0 -1 1) "3" 2) "2" 3) "1" 4) "-2" 127.0.0.1:6380>