redis簡易教程以及使用nodejs連線redis
一直沒機會學習redis
,最近抽空學了一下,因為知道reids
還是比較重要的,經常看到有人開發公眾號因為沒有對access_token
進行快取,判斷是否過期,導致access_token
的呼叫api
次數超過限制而影響業務的情況,熟悉的人都知道使用redis
基本上都是做快取,因為他簡單、速度快,可以說是個”快男”。使用reids
做抽獎也很普遍,有空可以試試。本篇本章暫時只講key
、hash
、list
redis簡介
- Redis 是完全開源免費的,遵守BSD協議,是一個高效能的key-value資料庫。
-
Redis 與其他 key - value 快取產品有以下三個特點:
- Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
- Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
- Redis支援資料的備份,即master-slave模式的資料備份。
為什麼要用redis(優勢)
- 效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的資料型別 – Redis支援二進位制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支援事務,即原子性,通過MULTI和EXEC指令包起來。
- 豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。
安裝執行及除錯(這裡以mac為例)
- 先去官網下載安裝包:http://www.redis.net.cn/download/
- 解壓安裝
> tar xzf redis-3.0.6.tar.gz > make > sudo make install > cd /usr/local/bin && redis-server // 開啟redis服務 > cd /usr/local/bin && redis-cli // 開啟redis除錯服務
開啟除錯會顯示下面的介面,現在你就可以開始使用redis的api了
> cd /usr/local/bin && redis-cli 127.0.0.1:6379>
全域性api
查詢鍵
127.0.0.1:6379> keys * 1) "wclimb" 2) "key" 3) "me" 4) "user" 5) "user1"
鍵的總數
127.0.0.1:6379> dbsize (integer) 5
檢查鍵是否存在
存在返回 1 ,不存在返回 0
127.0.0.1:6379> exists wclimb (integer) 1 127.0.0.1:6379> exists wclimb1 (integer) 0
刪除鍵
返回結果為成功刪除鍵的個數
127.0.0.1:6379> del user1 (integer) 1
鍵過期
expire key seconds 當超過過期時間,會自動刪除,key在seconds秒後過期
expireat key timestamp 鍵在秒級時間戳timestamp後過期
pexpire key milliseconds 當超過過期時間,會自動刪除,key在milliseconds毫秒後過期
pexpireat key milliseconds-timestamp key在毫秒級時間戳timestamp後過期
127.0.0.1:6379> expire user 10// 10秒後user會被刪除 (integer) 1
randomkey 隨機返回一個鍵
127.0.0.1:6379> randomkey "wclimb" 127.0.0.1:6379> randomkey "me"
redis 鍵(key)
set key value [ex] [px] [nx|xx] ex為鍵值設定秒級過期時間 px為鍵值設定毫秒級過期時間 nx鍵必須不存在,才可以設定成功,用於新增 xx與nx相反,鍵必須存在,才可以設定成功,用於更新 setnx、setex 與上面的nx、ex作用相同
設定key(O(1))
127.0.0.1:6379> set name 25 OK 127.0.0.1:6379> keys * 1) "wclimb" 2) "key" 3) "me" 4) "name"
獲取key(O(1))
127.0.0.1:6379> get name "25"
批量設定key
mset key value [key value ……]
127.0.0.1:6379> mset test1 1 test2 2 OK 127.0.0.1:6379> get test2 "2"
追加值(O(1))
127.0.0.1:6379> append test2 apend (integer) 6 127.0.0.1:6379> get test2 "2apend"
字串長度
127.0.0.1:6379> strlen test2 (integer) 6
雜湊(hash)
HGET KEY_NAME FIELD_NAME
類似javscript裡的物件 {}
設定hash
127.0.0.1:6379> HMSET hash name wclimb age 25 OK
獲取hash
127.0.0.1:6379> hmget hash name 1) "wclimb"
刪除hash
hdel key field [field ……] 會刪除一個或多個field,返回結果為成功刪除fiel的個數
127.0.0.1:6379> hdel hash name (integer) 1 127.0.0.1:6379> hmget hash name// 再獲取就返回nil 1) (nil)
獲取所有field
127.0.0.1:6379> hkeys hash 1) "age" 127.0.0.1:6379> HMSET hash name wclimb from jiangxi OK 127.0.0.1:6379> hkeys hash 1) "age" 2) "name" 3) "from"
獲取所有value
127.0.0.1:6379> hvals hash 1) "25" 2) "wclimb" 3) "jiangxi"
列表(list)
操作型別 | 操作 |
---|---|
新增 | rpush 、lpush、linsert |
查 | lrange、lindex、llen |
刪除 | lpop 、rpop、 lrem、ltrim |
修改 | lset |
阻塞操作 | blpop、brpop |
新增
(1)從左邊插入元素
lpush key value [value……]
127.0.0.1:6379> LPUSH list redis (integer) 1
(1)從右邊插入元素
rpush key value [value……]
127.0.0.1:6379> RPUSH list test (integer) 2
查詢
lrange key start end 索引下標從左到右分別是0到N-1,從右到左分別是-1到-N;end選項包含了自身
lrange key 0 -1 可以從左到右獲取列表的所有元素
lrange mylist 1 3 獲取列表中第2個到第4個元素
127.0.0.1:6379> lrange list 0 1 1) "redis" 2) "test"
長度
127.0.0.1:6379> llen key (integer) 2
刪除
我們先新增幾個
127.0.0.1:6379> LPUSH list a b c (integer) 5
(1)從列表右側彈出元素 rpop key
(2)從列表左側彈出元素 lpop key
先看看現在的列表
127.0.0.1:6379> lrange list 0 -1 1) "c" 2) "b" 3) "a" 4) "redis" 5) "test"
刪除
127.0.0.1:6379> rpop list "test"
我們發現test被刪除了,現在看看我們的列表
127.0.0.1:6379> lrange list 0 -1 1) "c" 2) "b" 3) "a" 4) "redis"
修改
lset key index newValue 修改指定索引下標的元素
127.0.0.1:6379> lset list 0 newValue OK 127.0.0.1:6379> lrange list 0 -1 1) "newValue" 2) "b" 3) "a" 4) "redis"
第0個下標的元素被替換成最新的值
使用node連線redis
> npm init > cnpm i reids -S > touch index.js > vim index.js
連線redis
redis npm包連結https://www.npmjs.com/package/redis
var redis = require('redis'); var client = redis.createClient(6379, '127.0.0.1'); client.on('error', function(err) { console.log('Error ' + err); });
設定獲取key
client.set('user', JSON.stringify({ name: 'wclimb', age: '18' }), redis.print); client.get('user', function(err, value) { if (err) throw err; console.log('Got: ' + value); client.quit(); });
控制檯列印
> node index.js Reply: OK Got: {"name":"wclimb","age":"18"}
設定獲取hash
client.hmset("hosts", "mjr", "1", "another", "23", "home", "1234"); client.hgetall("hosts", function (err, obj) { console.dir(obj); });
控制檯列印
> node index.js { mjr: '1', another: '23', home: '1234' }
設定獲取list
client.LPUSH('list', [1, 2, 3, 4], redis.print); client.lrange('list', '0', '-1', redis.print);
控制檯列印
> node index.js Reply: 8 Reply: 4,3,2,1,newValue,b,a,redis
基本用法和上面講的都差不多,直接上去一頓寫就完事了,完全可以不帶腦子的使用各種api