Redis入門
簡介
Remote Dictionary Server (Redis)
Redis是一個開源的高性能鍵值對數(shù)據(jù)庫蛙讥。它通過提供多種鍵值數(shù)據(jù)類型來適應(yīng)不同場景下的存儲需求漾脂,并借助許多高層級的接口使其可以勝任如緩存、隊列系統(tǒng)等不同的角色歹啼。
它跟memcached類似,不過數(shù)據(jù)可以持久化座菠,而且支持的數(shù)據(jù)類型很豐富狸眼。
截止到2015年6月27日,發(fā)布的最新穩(wěn)定版本是3.0.2浴滴。
3.0版本最大的提升就是redis集群拓萌,一個分布式的redis示例具有數(shù)據(jù)自動分片和高容錯性,以及在高負(fù)載的情況下的速度提升升略。
安裝微王、配置
安裝
下載路徑: 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-cli
redis> set foo bar
OK
redis> get foo
"bar"
配置
redis的配置示例文件在%REDIS_HOME%下的redis.conf
里面包含很多默認(rèn)配置
使用配置可以這樣:$ redis-server /etc/redis/6379.conf
daemonize 如果需要在后臺運行,把該項改為yes
pidfile 配置多個pid的地址品嚣,默認(rèn)在/var/run/redis.pid
bind 綁定ip骂远,設(shè)置后只接受自該ip的請求
port 監(jiān)聽端口,默認(rèn)為6379
timeout 設(shè)置客戶端連接時的超時時間腰根,單位為秒
loglevel 分為4級激才,debug、verbose额嘿、notice瘸恼、warning
logfile 配置log文件地址
databases 設(shè)置數(shù)據(jù)庫的個數(shù),默認(rèn)使用的數(shù)據(jù)庫為0
save 設(shè)置redis進行數(shù)據(jù)庫鏡像的頻率册养,保存快照的頻率东帅。
第一個參數(shù)表示多長時間,第二個表示執(zhí)行多少次寫操作球拦。
在一定時間內(nèi)執(zhí)行一定數(shù)量的寫操作時靠闭,自動保存快照帐我。可設(shè)置多個條件愧膀。
rdbcompression 在進行鏡像備份時拦键,是否進行壓縮
Dbfilename 鏡像備份文件的文件名
Dir 數(shù)據(jù)庫鏡像備份的文件放置路徑
Slaveof 設(shè)置數(shù)據(jù)庫為其他數(shù)據(jù)庫的從數(shù)據(jù)庫
Masterauth 主數(shù)據(jù)庫連接需要的密碼驗證
Requirepass 設(shè)置登錄時需要使用的密碼
Maxclients 限制同時連接的客戶數(shù)量
Maxmemory 設(shè)置redis能夠使用的最大內(nèi)存
Appendonly 開啟append only模式
appendfsync 設(shè)置對appendonly.aof文件同步的頻率
vm-enabled 是否虛擬內(nèi)存的支持
vm-swap-file 設(shè)置虛擬內(nèi)存的交換文件路徑
vm-max-memory 設(shè)置redis使用的最大物理內(nèi)存大小
vm-page-size 設(shè)置虛擬內(nèi)存的頁大小
vm-pages 設(shè)置交換文件的總page數(shù)量
vm-max-threads 設(shè)置VMIO同時使用的線程數(shù)量
glueoutputbuf 把小的輸出緩存存放在一起
hash-max-zipmap-entries 設(shè)置hash的臨界值
activerehashing 重新hash
詳情可參考:http://t.cn/8kr3HUw
數(shù)據(jù)結(jié)構(gòu)及其使用場景
1 string 字符類型
2 hash 散列類型
3 list 列表類型
4 set 集合類型
5 sorted set 有序集合
string 字符串類型
字符串類型是redis最基礎(chǔ)的數(shù)據(jù)類型,是其他4中數(shù)據(jù)類型的基礎(chǔ)檩淋。
命令 | 描述 | 示例 |
---|---|---|
SET key value | 賦值 | set foo 5 ==> OK |
GET key | 取值 | get foo ==> "5" |
INCR key | 遞增.鍵不存在時創(chuàng)建并賦0芬为,否則+1 | incr foo ==> 6 |
DECR key | 遞減 | decr foo ==> 5 |
INCRBY key num | 與incr一樣,不過可以指定增加的數(shù)值 | incrby foo 5 ==> 10 |
APPEND key value | 追加,返回追加后字符串長度 | append foo 24 ==> 4 |
STRLEN key | 長度 | strlen foo ==> 4 |
MSET key value[ key value...] | 同時設(shè)置多個鍵值 | mset key1 1 key2 2 ==> OK |
MGET key[ key...] | 同時獲取多個鍵值 | mget key1 key2 ==>"1" "2" |
字符串就介紹到這里了蟀悦,還有其他命令請自行看官方文檔 ??????
hash 散列類型
散列類型是一個鍵值數(shù)據(jù)結(jié)構(gòu)媚朦,其值只能是字符串,也就是散列數(shù)據(jù)類型不支持嵌套其他數(shù)據(jù)類型日戈。
命令 | 描述 | 示例 |
---|---|---|
HSET key field value | 設(shè)置或修改字段值 | hset user name frek ==> 1 |
HGET key field | 獲取字段值 | hget user name ==> "frek" |
HMSET key field value[ field value..] | 同時設(shè)置多個字段 | 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 | 當(dāng)字段不存在時賦值 | hsetnx user name sam ==> 0 ; HSETNX user email xxx@xxx.com ==> 1 |
HINCRBY key field increment | 參考incrby命令 | hincrby user age 1 ==> 19 |
HKEYS key | 獲取鍵中所有字段名 | hkeys user ==> "name" "age" "email" |
HVALS key | 獲取所有的字段值 | hvals user ==> "frek" "19" "xxx@xxx.com" |
HLEN key | 獲取字段數(shù)量 | hlen user ==> 3 |
HDEL key field[ field..] | 刪除一個或多個字段,返回刪除的字段數(shù) | 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 | 從列表的右側(cè)移除一個元素,并返回該元素值 | rpop users ==> "nicesu" |
LLEN key | 返回列表元素個數(shù)鼓拧,鍵不存在時返回0 | llen users ==> 1 |
LRANGE key start stop | 獲取列表片段半火,start和stop支持負(fù)數(shù),-1表示右數(shù)第一個 | lrange users 0 -1 ==> "sam" "alice" "carl" "lisa" |
LREM key count value | 刪除列表中指定的值季俩,返回刪除的元素個數(shù) | lrem users 2 sam ==> 1 |
LINDEX key index | 獲取指定索引元素值 | lindex users 0 ==> "carl" |
LSET key index value | 設(shè)置指定索引的元素值 | 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 | 將一個元素從一個列表轉(zhuǎn)移到另一個列表,對source執(zhí)行rpop酌住,對destination執(zhí)行l(wèi)push店归,返回被移動的元素值 | 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 | 獲取集合的元素個數(shù) | scard tags ==> 2 |
SRANDMEMBER key[ count] | 返回1個或count個隨機元素 | srandmember tags ==> "one" |
SDIFF key[ key..] | 集合差運算 | |
SINTER key[ key..] | 集合交集運算 | |
SUNION key[ key..] | 集合并集運算 |
有序集合類型
在集合類型的基礎(chǔ)上有序集合類型為每個元素都關(guān)聯(lián)了一個分?jǐn)?shù)酪我,這使我們可以使用集合類型的操作之外消痛,還能做與分?jǐn)?shù)有關(guān)的操作。
命令 | 描述 | 示例 |
---|---|---|
ZADD key score member[ score member..] | 增加一個帶分?jǐn)?shù)的元素都哭,如果已存在秩伞,則替換分?jǐn)?shù) | zadd scoreboard 60 fred 89 parker 76 tony 59 nicesu ==> 4 |
ZSCORE key member | 獲得元素分?jǐn)?shù) | ZSCORE scoreboard nicesu ==> "59" |
ZRANGE key start end[ WITHSCORES] | 獲得排名在某個范圍內(nèi)的元素,返回按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] | 獲得指定分?jǐn)?shù)范圍內(nèi)的元素 | zrangebyscore scoreboard 60 100 ==> "fred" "tony" "parker" |
ZREVRANGEBYSCORE key max min[ WITHSCORES][LIMIT offset count] | 獲得指定分?jǐn)?shù)范圍內(nèi)的元素,降序排序 | zrevrangebyscore scoreboard 100 60 ==> "parker" "tony" "fred" |
ZINCREBY key increment member | 增加某個元素的分?jǐn)?shù) | zincrby scoreboard 1 nicesu ==> 60 |
ZCARD key | 獲取集合中元素個數(shù) | zcard scoreboard ==> 4 |
ZCOUNT KEY min max | 獲得指定分?jǐn)?shù)范圍內(nèi)的元素個數(shù) | zcount scoreboard 80 100 ==> 1 |
ZREM key member[ member..] | 刪除一個或多個元素 | zrem scoreboard nicesu ==> 1 |
ZRANK key member | 獲取分?jǐn)?shù)從小到大排序的位置 | zrank scoreboard parker ==> 2 |
ZREVRANK key member | 同上 | zrevrank scoreboard parker ==> 0 |
ZREMRANGEBYRANK key start stop | 按照排名范圍刪除元素 | |
ZREMRANGEBYSCORE key min max | 按分?jǐn)?shù)范圍內(nèi)刪除元素 |
redis與node.js
安裝:
npm install redis
還可以安裝C語言寫的redis庫
npm install hiredis redis
如果安裝了hiredis纱新,node_redis會默認(rèn)調(diào)用hiredis提供的庫
示例:
var redis = require("redis"),
// redis.createClient(port, host, option)
client = redis.createClient(6379, '127.0.0.1', {auth_pass: 'password'});
// 如果需要切換數(shù)據(jù)庫,如下操作
// 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可以多參數(shù)的命令穆趴,參數(shù)可以使用數(shù)組的方式傳:
client.mset(key1, val1, ... keyn, valn, [callback]);
等價于
client.mset([key1, val1, ... keyn, valn], [callback]);
hmset可以接受多參數(shù)和對象
client.hmset(hashkey, key1, val1, ... keyn, valn, [callback])
等價于
client.hmset(hashkey, obj, [callback])
更多命令使用請參考: https://github.com/NodeRedis/node_redis ??