標籤:
簡介
Remote Dictionary Server (Redis)
Redis是一個開源的高效能索引值對資料庫。它通過提供多種索引值資料類型來適應不同情境下的儲存需求,並藉助許多高層級的介面使其可以勝任如緩衝、隊列系統等不同的角色。
它跟memcached類似,不過資料可以持久化,而且支援的資料類型很豐富。
截止到2015年6月27日,發布的最新穩定版本是3.0.2。
3.0版本最大的提升就是redis叢集,一個分布式的redis樣本具有資料自動分區和高容錯性,以及在高負載的情況下的速度提升。
安裝、配置安裝
下載路徑: http://redis.io/download
安裝命令$ wget http://download.redis.io/releases/redis-3.0.2.tar.gz$ tar xzf redis-3.0.2.tar.gz$ cd redis-3.0.2$ make啟動$ src/redis-server用戶端$ src/redis-cliredis> set foo barOKredis> get foo"bar"
配置
redis的配置樣本檔案在%REDIS_HOME%下的redis.conf
裡麵包含很多預設配置
使用配置可以這樣:$ redis-server /etc/redis/6379.conf
daemonize 如果需要在後台運行,把該項改為yespidfile 配置多個pid的地址,預設在/var/run/redis.pidbind 綁定ip,設定後只接受自該ip的請求port 監聽連接埠,預設為6379timeout 設定用戶端串連時的逾時時間,單位為秒loglevel 分為4級,debug、verbose、notice、warninglogfile 配置log檔案地址databases 設定資料庫的個數,預設使用的資料庫為0save 設定redis進行資料庫鏡像的頻率,儲存快照的頻率。 第一個參數表示多長時間,第二個表示執行多少次寫操作。 在一定時間內執行一定數量的寫操作時,自動儲存快照。可設定多個條件。rdbcompression 在進行鏡像備份時,是否進行壓縮Dbfilename 鏡像備份檔案的檔案名稱Dir 資料庫鏡像備份的檔案放置路徑Slaveof 設定資料庫為其他資料庫的從資料庫 Masterauth 主要資料庫串連需要的密碼驗證Requirepass 設定登入時需要使用的密碼Maxclients 限制同時串連的客戶數量Maxmemory 設定redis能夠使用的最大記憶體Appendonly 開啟append only模式appendfsync 設定對appendonly.aof檔案同步的頻率vm-enabled 是否虛擬記憶體的支援vm-swap-file 設定虛擬記憶體的分頁檔路徑vm-max-memory 設定redis使用的最大實體記憶體大小vm-page-size 設定虛擬記憶體的頁大小vm-pages 設定分頁檔的總page數量vm-max-threads 設定VMIO同時使用的線程數量glueoutputbuf 把小的輸出緩衝存放在一起hash-max-zipmap-entries 設定hash的臨界值activerehashing 重新hash
詳情可參考:http://t.cn/8kr3HUw
資料結構及其使用情境
1 string 字元類型
2 hash 散列類型
3 list 清單類型
4 set 集合類型
5 sorted set 有序集合
string 字串類型
字串類型是redis最基礎的資料類型,是其他4中資料類型的基礎。
| 命令 |
描述 |
樣本 |
| SET key value |
賦值 |
set foo 5 ==> OK |
| GET key |
取值 |
get foo ==> "5" |
| INCR key |
遞增.鍵不存在時建立並賦0,否則+1 |
incr foo ==> 6 |
| DECR key |
遞減 |
decr foo ==> 5 |
| INCRBY key num |
與incr一樣,不過可以指定增加的數值 |
incrby foo 5 ==> 10 |
| APPEND key value |
追加,返回追加後字串長度 |
append foo 24 ==> 4 |
| STRLEN key |
長度 |
strlen foo ==> 4 |
| MSET key value[ key value...] |
同時設定多個索引值 |
mset key1 1 key2 2 ==> OK |
| MGET key[ key...] |
同時擷取多個索引值 |
mget key1 key2 ==>"1" "2" |
字串就介紹到這裡了,還有其他命令請自行看官方文檔 ??????
hash 散列類型
散列類型是一個索引值資料結構,其值只能是字串,也就是散列資料類型不支援嵌套其他資料類型。
| 命令 |
描述 |
樣本 |
| HSET key field value |
設定或修改欄位值 |
hset user name frek ==> 1 |
| HGET key field |
擷取欄位值 |
hget user name ==> "frek" |
| HMSET key field value[ field value..] |
同時設定多個欄位 |
hmset user name frek age 18 ==> OK |
| HMGET key field[ field..] |
同時擷取多個欄位值 |
hmget user name age ==> "frek" "18" |
| HGETALL key |
擷取鍵中所有欄位和值 |
hgetall user ==> "name" "frek" "age" "18" |
| HEXISTS key field |
判斷欄位是否存在,存在返回1,否則返回0(如果鍵不存在也返回0) |
hexists user email ==> 0 |
| HSETNX key field value |
當欄位不存在時賦值 |
hsetnx user name sam ==> 0 ; HSETNX user email [email protected] ==> 1 |
| HINCRBY key field increment |
參考incrby命令 |
hincrby user age 1 ==> 19 |
| HKEYS key |
擷取鍵中所有欄位名 |
hkeys user ==> "name" "age" "email" |
| HVALS key |
擷取所有的欄位值 |
hvals user ==> "frek" "19" "[email protected]" |
| HLEN key |
擷取欄位數量 |
hlen user ==> 3 |
| HDEL key field[ field..] |
刪除一個或多個欄位,返回刪除的欄位數 |
hdel user email age ==> 2 |
list 清單類型
清單類型可以儲存一個有序的字串列表
| 命令 |
描述 |
樣本 |
| LPUSH key value[ value..] |
向列表的左邊增加元素,返回增加元素後列表的長度 |
lpush users fred sam alice ==> 3 |
| RPUSH key value[ value..] |
向列表的右邊增加元素 |
rpush users carl lisa nicesu ==> 6 |
| LPOP key |
從列表左邊移除一個元素,並返回該元素值 |
lpop users ==> "fred" |
| RPOP key |
從列表的右側移除一個元素,並返回該元素值 |
rpop users ==> "nicesu" |
| LLEN key |
返回列表元素個數,鍵不存在時返回0 |
llen users ==> 1 |
| LRANGE key start stop |
擷取列表片段,start和stop支援負數,-1表示右數第一個 |
lrange users 0 -1 ==> "sam" "alice" "carl" "lisa" |
| LREM key count value |
刪除列表中指定的值,返回刪除的元素個數 |
lrem users 2 sam ==> 1 |
| LINDEX key index |
擷取指定索引元素值 |
lindex users 0 ==> "carl" |
| LSET key index value |
設定指定索引的元素值 |
lset users 0 allen ==> OK |
| LTRIM key start end |
只保留列表指定片段,刪除其他元素 |
ltrim users 0 1 ==> OK |
| LINSERT key BEFORE/AFTER pivot value |
向列表插入元素,返回插入後列表長度 |
linsert users after carl adam ==> 3 |
| RPOPLPUSH source destination |
將一個元素從一個列錶轉移到另一個列表,對source執行rpop,對destination執行lpush,返回被移動的元素值 |
rpoplpush users usernames ==> "adam" |
集合類型
集合中的每個元素都不同,且沒有順序
| 命令 |
描述 |
樣本 |
| SADD key member[ member..] |
增加一個或多個元素 |
sadd tags one two three two ==> 3 |
| SREM key member[ member..] |
移除一個或多個元素 |
srem tags two ==> 1 |
| SMEMBERS key |
擷取集合中所有的元素 |
smembers tags ==> "three" "one" |
| SISMEMBER key member |
判斷元素是否存在集合中 |
sismember tags one ==> 1 |
| SCARD key |
擷取集合的元素個數 |
scard tags ==> 2 |
| SRANDMEMBER key[ count] |
返回1個或count個隨機元素 |
srandmember tags ==> "one" |
| SDIFF key[ key..] |
集合差運算 |
|
| SINTER key[ key..] |
集合交集運算 |
|
| SUNION key[ key..] |
集合并集運算 |
|
有序集合類型
在集合類型的基礎上有序集合類型為每個元素都關聯了一個分數,這使我們可以使用集合類型的操作之外,還能做與分數有關的操作。
| 命令 |
描述 |
樣本 |
| ZADD key score member[ score member..] |
增加一個帶分數的元素,如果已存在,則替換分數 |
zadd scoreboard 60 fred 89 parker 76 tony 59 nicesu ==> 4 |
| ZSCORE key member |
獲得元素分數 |
ZSCORE scoreboard nicesu ==> "59" |
| ZRANGE key start end[ WITHSCORES] |
獲得排名在某個範圍內的元素,返回按score升序排序的元素 |
zrange scoreboard 0 -1 ==> “nicesu" "fred" "tony" "parker" |
| ZREVRANGE key start end[ WITHSCORES] |
與zrange使用一致,返回按score降序的元素 |
zrevrange scoreboard 0 -1 withscores ==> "parker" "89" "tony" "76" "fred" "60" "nicesu" "59" |
| ZRANGEBYSCORE key min max[ WITHSCORES][LIMIT offset count] |
獲得指定分數範圍內的元素 |
zrangebyscore scoreboard 60 100 ==> "fred" "tony" "parker" |
| ZREVRANGEBYSCORE key max min[ WITHSCORES][LIMIT offset count] |
獲得指定分數範圍內的元素,降序排序 |
zrevrangebyscore scoreboard 100 60 ==> "parker" "tony" "fred" |
| ZINCREBY key increment member |
增加某個元素的分數 |
zincrby scoreboard 1 nicesu ==> 60 |
| ZCARD key |
擷取集合中元素個數 |
zcard scoreboard ==> 4 |
| ZCOUNT KEY min max |
獲得指定分數範圍內的元素個數 |
zcount scoreboard 80 100 ==> 1 |
| ZREM key member[ member..] |
刪除一個或多個元素 |
zrem scoreboard nicesu ==> 1 |
| ZRANK key member |
擷取分數從小到大排序的位置 |
zrank scoreboard parker ==> 2 |
| ZREVRANK key member |
同上 |
zrevrank scoreboard parker ==> 0 |
| ZREMRANGEBYRANK key start stop |
按照排名範圍刪除元素 |
|
| ZREMRANGEBYSCORE key min max |
按分數範圍內刪除元素 |
|
redis與node.js安裝:
npm install redis
還可以安裝C語言寫的redis庫
npm install hiredis redis
如果安裝了hiredis,node_redis會預設調用hiredis提供的庫
樣本:
var redis = require("redis"), // redis.createClient(port, host, option) client = redis.createClient(6379, ‘127.0.0.1‘, {auth_pass: ‘password‘}); // 如果需要切換資料庫,如下操作 // client.select(3, function() { /* ... */ }); client.on("error", function (err) { console.log("Error " + err); }); client.set("string key", "string val", redis.print); client.hset("hash key", "hashtest 1", "some value", redis.print); client.hset(["hash key", "hashtest 2", "some other value"], redis.print); client.hkeys("hash key", function (err, replies) { console.log(replies.length + " replies:"); replies.forEach(function (reply, i) { console.log(" " + i + ": " + reply); }); client.quit(); });
像mset可以多參數的命令,參數可以使用數組的方式傳:
client.mset(key1, val1, ... keyn, valn, [callback]);
等價於
client.mset([key1, val1, ... keyn, valn], [callback]);
hmset可以接受多參數和對象
client.hmset(hashkey, key1, val1, ... keyn, valn, [callback])
等價於
client.hmset(hashkey, obj, [callback])
文/Elson(簡書作者)
原文連結:http://www.jianshu.com/p/bd3550784bce
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
redis入門