Redis 是一個高性能的 key-value 數據庫,為了保證效率,數據都是緩存在內存中,在執行頻繁而又復雜的數據庫查詢條件時,可以使用 Redis 緩存一份查詢結果,以提升應用性能。
背景
如果一個 Node 應用有多台服務器或多個進程在跑,每個進程都擁有自己的內存空間,各個進程之間的數據共享就顯得非常重要。
使用數據庫是一個解決數據共享的方案,但一些臨時性、高並發的數據並不太適合直接寫入數據庫,比如 session。
引入 Redis 可以解決數據共享的問題,也因為 Redis 是基於內存存儲的特點,有着非常高的性能,可以大大降低數據庫讀寫的壓力,提升應用的整體性能。
Redis 還可以用來:緩存復雜的數據庫查詢結果,做自增長統計,暫存用戶操作狀態等功能。
安裝 Redis 客戶端
在開始使用 redis 之前,首先需要安裝 Redis 客戶端
以 MAC OS 為例,通過 brew 安裝 Redis
brew install redis
啟動 Redis
redis-server
安裝 ioredis NPM 模塊
安裝 ioredis
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 的任務隊列中而已。