Heroku Redis 最大記憶體策略

Heroku提供了一個很棒的Redis插件,免費提供25MB的記憶體。 這個存儲量只需數千個項目即可輕鬆填滿,具體取決於您存儲的內容。 Heroku有一個名為maxmemory-policy的配置選項,它決定了當Redis數據庫內存填滿時系統的行為。 默認情況下,這個屬性被設置為noeviction,這意味著當嘗試存儲更多數據時,Redis會引發錯誤。 這樣做是為了讓您意識到正在發生的事情,一旦您發現可以更改此行為,那麼就是時候確定如何更改。 不同的行為由Redis自身提供,它們包括: noeviction:當達到內存限制並且客戶端嘗試執行可能導致使用更多內存的命令時,返回錯誤(大多數寫入命令,但DEL和其他一些命令除外)。 allkeys-lru:通過嘗試首先移除最近最少使用(LRU)的鍵來使空間為新增數據。 volatile-lru:通過嘗試首先移除最近最少使用(LRU)的鍵,但只在具有過期時間的鍵之間進行,以使空間為新增數據。 allkeys-random:隨機移除鍵以使空間為新增數據。 volatile-random:隨機移除鍵以使空間為新增數據,但只移除具有過期時間的鍵。 volatile-ttl:移除具有過期時間的鍵,並儘量首先移除TTL更短的鍵,以使空間為新增數據。 您需要找到最適合您需求的情況。一旦找到候選方案,您可以使用Heroku CLI應用更改,例如: heroku redis:maxmemory YOUR_REDIS_INSTANCE_NAME --policy volatile-lru

Redis 列表

列表是一組相互關聯的鍵-值對。 LPUSH 和 RPUSH 是用於操作列表的兩個命令。 你可以使用命令 LPUSH <listkey> <value> 創建第一個項目。 例如: LPUSH names "Flavio" 然後後續項目可以添加到列表的底部:RPUSH <listkey> <value>,或者使用 LPUSH <listkey> <value> 添加到列表的頂部。 例如: LPUSH names "Flavio" LPUSH names "Syd" RPUSH names "Roger" 你可以將重複的值添加到列表中。 LPUSH names "Flavio" LPUSH names "Flavio" RPUSH names "Flavio" 列表可以容納大量的項目,超過 40 億個。 使用 LLEN <listkey> 命令計算列表中的項目數量。 使用 RPOP <listkey> 來獲取並移除列表的最後一個項目。使用 LPOP 命令可以獲取並移除列表的第一個項目。 使用 LREM 命令可以從列表中一次刪除多個項目。 你可以使用 LTRIM 命令來限制列表的長度。 LTRIM names 0 1 會將列表剪裁為僅有 2 個項目,位置 0(第一個項目)和位置 1 的項目。...

Redis 發布/訂閱

Redis實現了一個發布/訂閱的消息機制。 它的概念很簡單:發布者在一個頻道上發送消息,多個訂閱者接收它。 使用以下命令訂閱一個頻道: SUBSCRIBE <channel> 使用以下命令發布到一個頻道: PUBLISH <channel> <message> 例如: SUBSCRIBE dogs 在另一個redis-cli窗口中,輸入: PUBLISH dogs "Roger" 消息將被發送給訂閱者,它們默認顯示事件類型、頻道和消息的內容: 訂閱者可以聽取多個頻道: SUBSCRIBE dogs cats 並將接收來自所有頻道的消息。

redis-sorted-lists

#如何使用Redis排序列表 排序集將每個項目與一個排名關聯起來。 排序集的工作方式與集合類似,它們使用類似的命令,只是將S替換為Z,例如: SADD -> ZADD SPOP -> ZPOP 但它們略有不同。 ZADD接受一個分數: ZADD names 1 "Flavio" ZADD names 2 "Syd" ZADD names 2 "Roger" 如您所見,值仍然必須是唯一的,但現在它們與一個分數相關聯。 分數不必唯一。 集合中的項目始終按照分數排序。 這對於實現某種數據存儲工具非常有用,例如(常見示例)排行榜,或者用時間戳表示某個項目的添加時間。 您可以使用ZRANK獲取項目的分數: ZRANK names "Flavio" 使用ZRANGE列出排序集中的所有項目,其工作方式與列表中的LRANGE類似: ZRANGE names 0 -1 將WITHSCORES添加到還可返回分數信息: 您可以使用ZINCRBY將集合中的項目的分數增加。 在此處查看所有排序集命令這裡。

Redis的入門步驟

在您已經安裝並運行Redis之後,您可以開始使用它了! 最簡單的方法是使用redis-cli,這是在安裝Redis時一同安裝的應用程式。 這是一種內建的方法,可以在不需要設置應用程式的情況下對Redis進行命令操作。 您可以使用redis-cli -h <主機名> -p <埠號> -a <密碼>的方式連接到遠程Redis服務器 一旦進入Redis CLI應用程序,就可以開始將數據存儲到其中。 使用結構SET <鍵> <值>添加一個值: SET name "Flavio" 檢索值 使用結構GET <鍵>檢索值: 檢查鍵是否存在 我們也可以使用EXISTS <鍵>來檢查鍵是否存在: 該命令將返回1(存在)或0(不存在)。 僅在不存在時設置 SET的一種變體允許我們僅在尚未存在鍵時設置它: SETNX name "Roger" 刪除鍵 使用DEL <鍵>刪除鍵: 列出現有鍵 您可以使用KEYS *列出所有已插入的鍵 或者,使用類似KEYS n*的模式進行過濾,以列出僅以n開頭的鍵,例如。 每個存儲的值最多可容納512MB。 過期鍵 可以將鍵暫時存儲並在計時器結束時自動刪除: SETEX <鍵> <秒數> <值> 您可以使用TTL <鍵>獲取鍵清除剩餘的時間 在這個例子中,我使用Flavio作為值設置了一個name鍵,並使用TTL檢查鍵將返回值還有多少時間。 一旦計時器過期,結果將是空值(nil): 您還可以使用EXPIRE <鍵>秒數>將現有鍵設置為過期。 递增和递减 可以使用INCR <鍵>進行數值增加,並使用DECR <鍵>進行递减。 您還可以使用INCRBY <鍵> <增量>和DECRBY <鍵> <減量>來將鍵值增加特定的數量: 這些命令非常適合高並發操作,其中許多客戶端可能會與相同的數據進行交互,以確保原子事務。 最常見的例子是當兩個不同的客戶端嘗試增加同一數字。 在像PostgreSQL或MongoDB這樣的數據庫中,您首先需要獲取數字值,然後進行增加,然後向服務器發出請求進行增加。 假設值為1,如果兩個客戶端使用GET讀取該值,然後它們分別調用SET進行增加,最終如果沒有任何防止並發更改發生的東西,結果將是2。 Redis從根本上解決了這個問題。 更複雜的數據結構 到目前為止,我們已經處理了像整數和字符串這樣的簡單數據類型。 Redis可以支持更複雜的結構。 接下來的文章中我們將看到如何處理以下內容: 列表 集合 有序集合 哈希

介紹Redis

Redis 是一個令人驚嘆的開源軟體,可以滿足網絡應用程式的各種需求。 Redis 是一個 NoSQL 資料庫,特別是一個鍵值儲存庫。它可以使用任何編程語言,因為它不是特定於 JavaScript 的技術 - 它是用 C 編寫的。 我們可以存儲值並將它們與鍵關聯起來,然後稍後檢索它們。 它的一個特點是高性能。高性能是由其主要特點之一提供的:它是一個內存資料庫。數據是保存、存儲和訪問在內存中,而不是寫入到資料庫。 大多數資料庫將數據存儲在磁盤上,並通過在內存中維護一組緩存來進行優化。 Redis 卻相反:它將數據保存在內存中。 默認情況下,Redis 將存儲的資料集快照保存到磁盤上,您可以配置其詳細信息以及數據的存儲位置。 Redis 是我最喜歡的工具之一,因為它的靈活性。您可以在如何存儲和管理資料存儲方面有很多自由度,並且可以根據您的需求以多種不同的方式使用它。 這也是因為它是一個 NoSQL 資料庫,這意味著它與 PostgreSQL 或其他 SQL 和基於架構的資料庫相比非常靈活。 它通常用作快取儲存機制,但也用作消息代理器,一種在不同進程和應用程式之間通訊的方式。 在這裡繼續閱讀: 如何安裝 Redis Redis 的第一步 Redis 集合 Redis 列表 Redis 排序列表 如何使用 Redis 哈希 Redis 發布/訂閱

使用 Redis 的集合(Sets)

集合与列表有两个主要的不同之处: 集合是无序的。 集合中的每个元素只能出现一次。 使用以下命令创建一个集合: SADD <setkey> <value> 可以使用相同的命令向集合中添加更多的元素。 例如: SADD names "Flavio" SADD names "Roger" SADD names "Tony" "Mark" "Jane" 使用 SMEMBERS <setkey> 命令获取集合中的所有元素: 使用 SISMEMBER 命令判断一个值是否在集合中: SISMEMBER names "Flavio" 使用 SCARD 命令获取集合中元素的数量: SCARD names 使用 SRANDMEMBER 命令从集合中随机获取一个元素(但不移除): SRANDMEMBER names 使用 SPOP 命令从集合中随机获取一个元素(并将其从集合中移除): SPOP names 可以一次性地从集合中提取多个元素: SPOP names 2 使用 SREM 命令根据值从集合中移除一个元素: SREM names "Flavio" 使用 SINTER 命令获取两个不同集合中包含的元素,排除其中一个集合的元素: SINTER set1 set2 可以在这里查看所有集合的命令。

如何使用Redis Hash

到目前為止,我們已經看到了如何將一個鍵與一個值或者一組值關聯起來。 Hash允許我們將多個值關聯到單個鍵上,非常適合存儲類似於對象的項目。 例如,一個人有名字和年齡。我們可以創建一個person:1的hash: HMSET person:1 name "Flavio" age 37 使用HGETALL可以獲取用戶的所有屬性: HGETALL person:1 您可以使用HSET來更新哈希屬性: HSET person:1 age 38 您可以使用HINCRBY來遞增存儲在哈希中的值: HINCRBY person:1 age 2 可以在此處查看所有的Hash命令:https://redis.io/commands#hash。

如何安裝Redis

您可以從https://redis.io/download下載最新版本的Redis。 Redis可以安裝在任何伺服器上。在此我們將在本地安裝以進行測試。 在macOS上,使用Homebrew安裝更簡單。運行以下命令: brew install redis 然後運行: brew services start redis 以使Redis在計算機重新啟動時自動啟動和重新啟動。 您也可以使用以下命令手動啟動: redis-server /usr/local/etc/redis.conf 在Linux Ubuntu上,您需要運行以下命令: sudo apt-get install redis-server Redis將自動啟動並運行。 一旦啟動,Redis將監聽端口6379。 在本地伺服器上運行時,無需密碼即可運行。但當Redis暴露在互聯網上時,請確保在redis.conf配置文件中設置密碼,其位置取決於您的操作系統。

如何從 Node.js 使用 Redis

在 Node.js 應用程式中,使用 Redis 伺服器最受歡迎的庫之一是 node-redis,它可以在 https://github.com/NodeRedis/node-redis 找到。 在您的專案中安裝該庫: npm install redis 提示:如果專案是全新的並且還沒有 package.json 檔案,請先執行 npm init -y。 連接到 Redis 實例 安裝完庫之後,使用以下程式碼在您的專案中引入它: const redis = require('redis') 或者 import redis from 'redis' 獲取 redis 物件之後,使用以下程式碼創建一個新的客戶端: const client = redis.createClient({ url: 'redis://YOUR REDIS INSTANCE URL' }) 然後使用以下程式碼連接到 Redis(在 async 函數中執行): await client.connect() 當您獲得了客戶端之後,就可以執行 Redis 可以做的所有操作。 要關閉連接,請調用: client.quit() 存儲和檢索鍵值 使用 set() 將鍵值對存儲到 Redis 中: client.set("<key>", "<value>") 例如: client.set("name", "Flavio") client.set("age", 37) 如果在乾淨的 Redis 伺服器上運行 redis-cli 中的 KEYS * 命令,您將看到這兩個鍵:...