Nodejs學習筆記(九)--- 與Redis的互動(mranney/node_redis)入門
目錄
簡介和安裝
- redis簡介:
- 開源高效能key-value儲存;採用記憶體中(in-memory)資料集的方式,也可以採用磁碟儲存方式(前者效能高,但資料可能丟失,後者正好相反)
- 支援字串(strings)、雜湊(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等;支援對複雜資料結構的高速操作。
- 特性多,支援主從同步、pub/sub等
- ...
注:應用場景沒有提到,暫時沒有太多實際體會,不瞎說,以免誤導人,但是從它的簡介和特性來說,起碼快取場景是不錯的!
- redis安裝(Windows平臺)
redis非常方便,直接下載解壓就可以使用,因為開發環境是win7 64位,直接下載(示例下載的安裝包:redis-2.4.5-win32-win64.zip)
- redis執行
解壓到後執行"64bit"資料夾下的redis-server.exe即可,但是這樣執行會出現一個如下警告提示:
#Warning: no config file specified,using the default config. In order to specify a config file use ‘redis-server /path/to/redis.conf’
提示也比較明顯,沒有明確的配置檔案,使用的是預設配置,請使用‘redis-server /path/to/redis.conf’指定明確的配置檔案
根據提示執行redis成功(如下圖)
在redis-server.exe同級目錄下可以看到一個redis.conf檔案,這就是配置檔案
- node_redis安裝
npm install redis 或者 npm install hiredis redis
我這裡採用 npm install hiredis redis 安裝
注:兩種都可用,區別在於效能,hiredis是非阻塞的,而且速度更快;如果安裝了hiredis,node_redis則會預設以它為解析器,沒安裝就會用純javascript直譯器,對於學習或者開發環境,用哪個都無所謂
redis.createClient()連線到redis伺服器
環境都準備好了,就開始寫一代簡單的程式碼測試用nodejs連線一下伺服器
var redis = require('redis'), client = redis.createClient(); client.on('ready',function(err){ console.log('ready'); });示例原始碼
從上圖中可以看到執行結果,輸出ready,表示成功!
對程式碼還是講一下:
redis.createClient():返回的是一個RedisClient的物件,大家可以輸出來看一下此物件的具體資訊。
ready:Redis的Connection事件之一,當與redis伺服器連線成功後會觸發這個事件,此時表示已經準備好接收命令,當這個事件觸發之前client命令會存在佇列中,當一切準備就緒後按順序呼叫
對於上面的幾句程式碼就能連線成功redis伺服器,原因是當前redis伺服器在本地,如果不在本地,怎麼連線呢?
var redis = require('redis'), RDS_PORT = 6379, //埠號 RDS_HOST = '127.0.1.1', //伺服器IP RDS_OPTS = {}, //設定項 client = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS); client.on('ready',function(res){ console.log('ready'); });示例原始碼
也是成功!這種方式和上一種在redis.createClient()時分別傳入了埠號、伺服器IP和設定項
這樣就可以用於連線遠端的redis伺服器,或者利用第三個引數進行一些配置!
redis的預設埠:6379
認證 client.auth(password, callback)
上面試過了,連線到redis伺服器,可以看出我們並沒有輸入密碼進行驗證的過程就成功連線到了伺服器,因為redis伺服器預設不需要密碼,不過這不太安全,我們肯定要設定一下密碼
開啟redis.conf檔案,找到requirepass,取消註釋,設定密碼為:porschev
requirepass porschev
然後重啟redis伺服器;再次利用上面的程式碼連線到redis伺服器,出現錯誤提示(如下圖):ERR operation not permitted
那麼如何連線到有密碼的redis伺服器呢?
簡單的試了一下,有兩種方法(可能有更多,沒試,其實一種完全就夠了,多了也沒用^_^!)
方式一:通過設定redis.createClient()的第三個引數,也就是設定項來完成
var redis = require('redis'), RDS_PORT = 6379, //埠號 RDS_HOST = '127.0.1.1', //伺服器IP RDS_PWD = 'porschev', RDS_OPTS = {auth_pass:RDS_PWD}, //設定項 client = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS); client.on('ready',function(res){ console.log('ready'); });示例原始碼
上圖可以連線成功,通過設定連線設定項中的auth_pass來通過認證!
auth_pass:預設值為null,預設情況下客戶端將不通過auth命令連線,如果設定了此項,客戶端將呼叫auth命令連線
方式二:通過client.auth(password, callback)
var redis = require('redis'), RDS_PORT = 6379, //埠號 RDS_HOST = '127.0.1.1', //伺服器IP RDS_PWD = 'porschev', RDS_OPTS = {}, //設定項 client = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS); client.auth(RDS_PWD,function(){ console.log('通過認證'); }); client.on('ready',function(res){ console.log('ready'); });示例原始碼
此方法也可以成功,第一個引數為密碼,第二個為回撥函式!
單值set和get
var redis = require('redis'), RDS_PORT = 6379, //埠號 RDS_HOST = '127.0.1.1', //伺服器IP RDS_PWD = 'porschev', //密碼 RDS_OPTS = {}, //設定項 client = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS); client.auth(RDS_PWD,function(){ console.log('通過認證'); }); client.on('connect',function(){ client.set('author', 'Wilson',redis.print); client.get('author', redis.print); console.log('connect'); }); client.on('ready',function(err){ console.log('ready'); });示例原始碼
從輸出結果可以看出,set一個值和獲取這個值都成功!
程式碼講一下:
client.set(key,value,[callback]):設定單個key和value,回撥函式可選
client.get(key,[callback]):得到key得到value,回撥函式可選(雖然可選,但不寫回調函式獲取又有什麼意義呢^_^!)
connect:Redis的Connection事件之一,在不設定client.options.no_ready_check的情況下,客戶端觸發connect同時它會發出ready,如果設定了client.options.no_ready_check,當這個stream被連線時會觸發connect,
這時候就可以自由嘗試發命令
redis.print:簡便的回撥函式,測試時顯示返回值(從示例的輸出結果中可以看出)
其它補充說明:
client.options.no_ready_check:預設值為false,當連線到一臺redis伺服器時,伺服器也許正在從磁碟中載入資料庫,當正在載入階段,redis伺服器不會響應任何命令,node_redis會發送一個“準備確認”的INFO命令,
INFO命令得到響應表示此時伺服器可以提供服務,這時node_redis會觸發"ready"事件,如果該設定項設定為true,則不會有這種檢查
client.set([key,value],callback):與client.set(key,value,[callback]);效果一致(可以自行對上面示例原始碼進行修改進行測試),必須要有回撥函式
多值get和set
var redis = require('redis'), RDS_PORT = 6379, //埠號 RDS_HOST = '127.0.1.1', //伺服器IP RDS_PWD = 'porschev', //密碼 RDS_OPTS = {}, //設定項 client = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS); client.auth(RDS_PWD,function(){ console.log('通過認證'); }); client.on('connect',function(){ client.hmset('short', {'js':'javascript','C#':'C Sharp'}, redis.print); client.hmset('short', 'SQL','Structured Query Language','HTML','HyperText Mark-up Language', redis.print); client.hgetall("short", function(err,res){ if(err) { console.log('Error:'+ err); return; } console.dir(res); }); }); client.on('ready',function(err){ console.log('ready'); });示例原始碼
從輸出結果可以看出,set多值和獲取都成功!
程式碼講一下:
client.hmset(hash, obj, [callback]):賦值操作,第一個引數是hash名稱;第二個引數是object物件,其中key1:value1。。,keyn:valuen形式;第三個引數是可選回撥函式
client.hmset(hash, key1, val1, ... keyn, valn, [callback]):與上面做用一致,第2個引數到可選回撥函式之前的引數都是key1, val1, ... keyn, valn形式;
client.hgetall(hash, [callback]):獲取值操作,返回一個物件
其它補充說明:
console.dir():用於顯示一個物件所有的屬性和方法
打包執行多個命令[事務]
var redis = require('redis'), RDS_PORT = 6379, //埠號 RDS_HOST = '127.0.1.1', //伺服器IP RDS_PWD = 'porschev', //密碼 RDS_OPTS = {}, //設定項 client = redis.createClient(RDS_PORT,RDS_HOST,RDS_OPTS); client.auth(RDS_PWD,function(){ console.log('通過認證'); }); client.on('end',function(err){ console.log('end'); }); client.on('connect',function(){ var key = 'skills'; client.sadd(key, 'C#','java',redis.print); client.sadd(key, 'nodejs'); client.sadd(key, "MySQL"); client.multi() .sismember(key,'C#') .smembers(key) .exec(function (err, replies) { console.log("MULTI got " + replies.length + " replies"); replies.forEach(function (reply, index) { console.log("Reply " + index + ": " + reply.toString()); }); client.quit(); }); });示例原始碼
官方有個示例,我修改一下,可能更好理解一些,下面一步步說吧!
先了解一下API再看結果
client.multi([commands]):這個標記一個事務的開始,由Multi.exec原子性的執行;github上描述是可以理解為打包,把要執行的命令存放在佇列中,redis伺服器會原子性的執行所有命令,node_redis介面返回一個Multi物件
Multi.exec( callback ):執行事務內所有命令;github上描述是client.multi()返回一個Multi物件,它包含了所有命令,直到Multi.exec()被呼叫;
Multi.exec( callback )回撥函式引數err:返回null或者Array,出錯則返回對應命令序列鏈中發生錯誤的錯誤資訊,這個陣列中最後一個元素是源自exec本身的一個EXECABORT型別的錯誤
Multi.exec( callback )回撥函式引數results:返回null或者Array,返回命令鏈中每個命令的返回資訊
end:redis已建立的連線被關閉時觸發
client.sadd(key,value1,...valuen,[callback]):集合操作,向集合key中新增N個元素,已存在元素的將忽略;redis2.4版本前只能新增一個值
sismember(key,value,[callback]):元素value是否存在於集合key中,存在返回1,不存在返回0
smembers(key,[callback]):返回集合 key 中的所有成員,不存在的集合key也不會報錯,而是當作空集返回
client.quit():與之對應的還有一個client.end()方法,相對比較暴力;client.quit方法會接收到所有響應後傳送quit命令,而client.end則是直接關閉;都是觸發end事件
再看結果應該就比較簡單了,client.multi打包了sismember和smembers兩個命令,執行exec方法後,回撥函式得到兩個迴應,分別輸出兩個迴應的結果!
其它...
redis.debug_mode:這個在開發中可能有用,大家自行設定試一下,設定為true後,看輸出
Publish / Subscribe:這個官方示例比較簡單清晰,大家執行起來看一下就能理解,深入的網上還有很多用它實現的聊天、監控示例,大家看一下,如果以後覺得有必要就再做個示例分享一下
client.monitor:監控,可能以後會用到,有需要的深入研究一下,入門可以略過
引數資料:
相關推薦
Nodejs學習筆記(四)與MySQL互動(felixge/node-mysql)
目錄簡介和安裝 測試MySQL 認識一下Connection Opti
Nodejs學習筆記(四)--- 與MySQL互動(felixge/node-mysql)
目錄 簡介和安裝 我選擇了felixge/node-mysql,用的人比較多,先隨大溜看看它的使用,暫時沒有太過糾結於各庫之間的執行效能問題,對其它庫有研究的筒子也可以分享一下效能要求較高時的選擇^_^! This is a node.js driver for mys
GO學習筆記——GO語言變數與變數定義(5)
上一篇說完了GO語言的基本資料型別,這一篇就來說說怎麼定義各種不同型別的變數吧 GO語言中變數定義需要使用關鍵字var,並且GO語言中定義變數是和C++定義變數相反的,C++是變數型別在前,變數名在後;而GO是變數名在前,變數型別在後。這是它們之間在定義變數時最明顯的不同
【學習筆記javascript設計模式與開發實踐(釋出--訂閱模式)----8】
第8章 釋出—訂閱模式 釋出—訂閱模式又叫觀察者模式,它定義物件間的一種一對多的依賴關係,當一個物件的狀態發生了改變時,所有依賴於它的物件都將得到通知。在javascript開發中,我們一般都用事件模型來替代傳統的釋出—訂閱模式。 8.1 現實中的釋出—訂閱模式 不論是在程
【學習筆記javascript設計模式與開發實踐(代理模式)----6】
第6章代理模式 代理模式是為一個物件提供一個代用品或佔位符,以便控制對它的訪問。 代理模式是一種非常有意義的模式,在生活中可以找到很多代理模式的場景。比如明星都有經濟人作為代理。如果想請明星來辦一場商業演出,只能聯絡他的經紀人,經紀人會把演出的細節和報酬都談好之後,再把合
[學習筆記]變數的定義與作用範圍(使用)
變數的命名規則:1.變數名由字母、數字、下滑線組成 但是不能以數字開頭2.不能使用javascript中的關鍵字3.嚴格區分大小寫 變數的宣告一般格式:var 變數名=變數值;可以使用一個var宣告多
Redis資料庫學習筆記03--go語言與Redis資料庫簡單互動
目錄 1.使用go語言與redis資料庫互動配置 1.1 安裝redis資料庫操作工具包redigo 1.2 測試redigo工具包是否正常工作 1.3 redigo工具包來源 1.4 go get命令概述 2.redigo工具包簡單使用說明 3.go語言與Redis資料
深入淺出nodejs學習筆記--第九章 玩轉程序管理
node的一個最大特性就是單執行緒,單執行緒帶來的好處是不用像多執行緒程式設計那樣去考慮狀態的同步問題,也不用去擔心出現死鎖,也沒有執行緒上下文所帶來的效能的開銷。但是同時也帶來了一些問題,比如無法充分利用的多核CPU,執行緒會阻塞的問題。 但是node真的就
Nodejs學習筆記(九)--- 與Redis的互動(mranney/node_redis)入門
目錄 簡介和安裝 redis簡介: 開源高效能key-value儲存;採用記憶體中(in-memory)資料集的方式,也可以採用磁碟儲存方式(前者效能高,但資料可能丟失,後者正好相反) 支援字串(strings)、雜湊(hashes)、列表(lists)、集合(sets)和 有序集
Nodejs學習筆記(五)—Express安裝入門與模版引擎ejs
num routes 項目目錄 其中 bubuko 執行 ctrl+ ica 開發經驗 前言 前面也學習了一些Node.js的基本入門知道,現在開始進入Web開發的部分; Node.js提供了http模塊,這個模塊中提供了一些底層接口,可以直接使用,但是直接開發網站
Nodejs學習筆記(四)—與MySQL交互(felixge/node-mysql)
ted iss eid 所在 err password soc deb 大連 簡介和安裝 Node.js與MySQL交互操作有很多庫,具體可以在 https://www.npmjs.org/search?q=mysql 查看。 我選擇了felixge/node-m
Nodejs學習筆記(十四)— Mongoose介紹和入門 && Nodejs學習筆記(十)--- 與MongoDB的互動(mongodb/node-mongodb-native)、MongoDB入門
目錄 簡介 MongoDB 開源,高效能的NoSQL資料庫;支援索引、叢集、複製和故障轉移、各種語言的驅動程式;高伸縮性; node-mongodb-native mongodb的nodejs驅動; MongoDB安裝(windows) 按照官方說明在win7 64位
Nodejs學習筆記(五)--- Express安裝入門與模版引擎ejs
目錄 前言 前面也學習了一些Node.js的基本入門知道,現在開始進入Web開發的部分; Node.js提供了http模組,這個模組中提供了一些底層介面,可以直接使用,但是直接開發網站那還是太累了,所以http模組也不單講了,可以去看官方API:http://nodejs.org/api
Nodejs學習筆記(十)--- 與MongoDB的互動(mongodb/node-mongodb-native)、MongoDB入門
目錄 簡介 MongoDB 開源,高效能的NoSQL資料庫;支援索引、叢集、複製和故障轉移、各種語言的驅動程式;高伸縮性; node-mongodb-native mongodb的nodejs驅動; MongoDB安裝(windows) 按照官方
【轉】Nodejs學習筆記(一)--- 簡介及安裝Node.js開發環境
ack 目錄 javascrip 難度 時間 網站開發 clas jetbrains 常用 目錄 學習資料 簡介 安裝Node.js npm簡介 開發工具 Sublime Node.js開發環境配置 擴展:安裝多版本管理器 學習資料 1.深入淺出Node.j
Nodejs學習筆記(四)-----Buffer
pretty 成員 保存 n) tin 設置 amp 個數 普通 Node.js Buffer(緩沖區) JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。 但在處理像TCP流或文件流時,必須使用到二進制數據。因此在 Node.js中,定義了一個 Buf
Nodejs學習筆記(六)----- 模塊系統和函數
參數 spa 而且 split response 另一個 簡約 也有 方法 Node.js模塊系統------->有開發基礎很好理解 為了讓Node.js的文件可以相互調用,Node.js提供了一個簡單的模塊系統。 模塊是Node.js 應用程序的基本組成部分,文件和
Nodejs學習筆記(二)--- 操作MongoDB數據庫
效果 view asc erro eve mongdb splay play 所有 最近看了一些關於mongodb的文章,然後就想知道nodeJS是怎麽連接的所以我就嘗試去了解了一波(這個菜鳥驛站這個網站還不錯,雖然知識文檔不是最新的,但是還是蠻好的; 順便官網地址是
Angular5學習筆記 - 虛擬RestfulApi配置與使用(六)
window com scripts mac restfu alt 新建 服務 src 一、安裝json-server功能 #windows cnpm install json-server -g #Mac & Linux sudo npm install j
學習Javascript數據結構與算法(第2版)筆記(1)
布爾值 efi prim ray 叠代器 undefined ply 內部 HA 第 1 章 JavaScript簡介 使用 Node.js 搭建 Web 服務器 npm install http-server -g http-server JavaScript 的類型有