Redis 是一個高性能的 key-value 數據庫,爲了保證效率,數據都是緩存在內存中,在執行頻繁而又複雜的數據庫查詢條件時,可使用 Redis 緩存一份查詢結果,以提高應用性能。git
若是一個 Node 應用有多臺服務器或多個進程在跑,每一個進程都擁有本身的內存空間,各個進程之間的數據共享就顯得很是重要。github
使用數據庫是一個解決數據共享的方案,但一些臨時性、高併發的數據並不太適合直接寫入數據庫,好比 session。redis
引入 Redis 能夠解決數據共享的問題,也由於 Redis 是基於內存存儲的特色,有着很是高的性能,能夠大大下降數據庫讀寫的壓力,提高應用的總體性能。數據庫
Redis 還能夠用來:緩存複雜的數據庫查詢結果,作自增加統計,暫存用戶操做狀態等功能。npm
在開始使用 redis 以前,首先須要安裝 Redis 客戶端緩存
以 MAC OS 爲例,經過 brew 安裝 Redisbash
brew install redis
啓動 Redis服務器
redis-server
安裝 ioredissession
npm install ioredis
var Redis = require('ioredis') var redis = new Redis() redis.set('test-redis-expire', 1) // 設置過時時間 3s redis.expire('test-redis-expire', 3) redis.get('test-redis-expire', (err, value) => { console.log(value) }) setTimeout(() => { redis.get('test-redis-expire', (err, value) => { console.log(value) }) }, 5000)
結果:併發
1 null
剛開始使用 redis 的時候很困惑,爲何 JAVA 調用 Redis 的語法看起來是同步的,到了 Node 就成了異步的呢,會不會存在什麼邏輯問題?
事實上,Node 調用 Redis 確實是異步的,只不過由於 Redis 是單線程的特色,任何操做都是原子操做。
在小試的代碼中,redis.set
redis.get
都只是向 Redis 發送了一個通知,添加到了 Redis 的任務隊列中而已。