
Redis入門
簡介
Remote Dictionary Server (Redis)
Redis是一個開源的高性能鍵值對數(shù)據(jù)庫。它通過提供多種鍵值數(shù)據(jù)類型來適應不同場景下的存儲需求,并借助許多高層級的接口使其可以勝任如緩存、隊列系統(tǒng)等不同的角色。
它跟memcached類似,不過數(shù)據(jù)可以持久化,而且支持的數(shù)據(jù)類型很豐富。
截止到2015年6月27日,發(fā)布的最新穩(wěn)定版本是3.0.2。
3.0版本最大的提升就是redis集群,一個分布式的redis示例具有數(shù)據(jù)自動分片和高容錯性,以及在高負載的情況下的速度提升。
安裝、配置
安裝
下載路徑: 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
里面包含很多默認配置
使用配置可以這樣:$ redis-server /etc/redis/6379.conf
daemonize 如果需要在后臺運行,把該項改為yes
pidfile 配置多個pid的地址,默認在/var/run/redis.pid
bind 綁定ip,設置后只接受自該ip的請求
port 監(jiān)聽端口,默認為6379
timeout 設置客戶端連接時的超時時間,單位為秒
loglevel 分為4級,debug、verbose、notice、warning
logfile 配置log文件地址
databases 設置數(shù)據(jù)庫的個數(shù),默認使用的數(shù)據(jù)庫為0
save 設置redis進行數(shù)據(jù)庫鏡像的頻率,保存快照的頻率。
第一個參數(shù)表示多長時間,第二個表示執(zhí)行多少次寫操作。
在一定時間內執(zhí)行一定數(shù)量的寫操作時,自動保存快照。可設置多個條件。
rdbcompression 在進行鏡像備份時,是否進行壓縮
Dbfilename 鏡像備份文件的文件名
Dir 數(shù)據(jù)庫鏡像備份的文件放置路徑
Slaveof 設置數(shù)據(jù)庫為其他數(shù)據(jù)庫的從數(shù)據(jù)庫
Masterauth 主數(shù)據(jù)庫連接需要的密碼驗證
Requirepass 設置登錄時需要使用的密碼
Maxclients 限制同時連接的客戶數(shù)量
Maxmemory 設置redis能夠使用的最大內存
Appendonly 開啟append only模式
appendfsync 設置對appendonly.aof文件同步的頻率
vm-enabled 是否虛擬內存的支持
vm-swap-file 設置虛擬內存的交換文件路徑
vm-max-memory 設置redis使用的最大物理內存大小
vm-page-size 設置虛擬內存的頁大小
vm-pages 設置交換文件的總page數(shù)量
vm-max-threads 設置VMIO同時使用的線程數(shù)量
glueoutputbuf 把小的輸出緩存存放在一起
hash-max-zipmap-entries 設置hash的臨界值
activerehashing 重新hash
詳情可參考:http://t.cn/8kr3HUw
數(shù)據(jù)結構及其使用場景
1 string 字符類型
2 hash 散列類型
3 list 列表類型
4 set 集合類型
5 sorted set 有序集合
string 字符串類型
字符串類型是redis最基礎的數(shù)據(jù)類型,是其他4中數(shù)據(jù)類型的基礎。
| 命令 | 描述 | 示例 |
|---|---|---|
| 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...] | 同時設置多個鍵值 | mset key1 1 key2 2 ==> OK |
| MGET key[ key...] | 同時獲取多個鍵值 | mget key1 key2 ==>"1" "2" |
字符串就介紹到這里了,還有其他命令請自行看官方文檔 ??????
hash 散列類型
散列類型是一個鍵值數(shù)據(jù)結構,其值只能是字符串,也就是散列數(shù)據(jù)類型不支持嵌套其他數(shù)據(jù)類型。
| 命令 | 描述 | 示例 |
|---|---|---|
| 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 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 | 從列表的右側移除一個元素,并返回該元素值 | rpop users ==> "nicesu" |
| LLEN key | 返回列表元素個數(shù),鍵不存在時返回0 | llen users ==> 1 |
| LRANGE key start stop | 獲取列表片段,start和stop支持負數(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 | 設置指定索引的元素值 | 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執(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..] | 集合并集運算 |
有序集合類型
在集合類型的基礎上有序集合類型為每個元素都關聯(lián)了一個分數(shù),這使我們可以使用集合類型的操作之外,還能做與分數(shù)有關的操作。
| 命令 | 描述 | 示例 |
|---|---|---|
| ZADD key score member[ score member..] | 增加一個帶分數(shù)的元素,如果已存在,則替換分數(shù) | zadd scoreboard 60 fred 89 parker 76 tony 59 nicesu ==> 4 |
| ZSCORE key member | 獲得元素分數(shù) | 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] | 獲得指定分數(shù)范圍內的元素 | zrangebyscore scoreboard 60 100 ==> "fred" "tony" "parker" |
| ZREVRANGEBYSCORE key max min[ WITHSCORES][LIMIT offset count] | 獲得指定分數(shù)范圍內的元素,降序排序 | zrevrangebyscore scoreboard 100 60 ==> "parker" "tony" "fred" |
| ZINCREBY key increment member | 增加某個元素的分數(shù) | zincrby scoreboard 1 nicesu ==> 60 |
| ZCARD key | 獲取集合中元素個數(shù) | zcard scoreboard ==> 4 |
| ZCOUNT KEY min max | 獲得指定分數(shù)范圍內的元素個數(shù) | zcount scoreboard 80 100 ==> 1 |
| ZREM key member[ member..] | 刪除一個或多個元素 | zrem scoreboard nicesu ==> 1 |
| ZRANK key member | 獲取分數(shù)從小到大排序的位置 | zrank scoreboard parker ==> 2 |
| ZREVRANK key member | 同上 | zrevrank scoreboard parker ==> 0 |
| ZREMRANGEBYRANK key start stop | 按照排名范圍刪除元素 | |
| ZREMRANGEBYSCORE key min max | 按分數(shù)范圍內刪除元素 |
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'});
// 如果需要切換數(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 ??