1. 程式人生 > >Redis的安裝以及基本操作

Redis的安裝以及基本操作

Centos7.4安裝redis的步驟如下(5.0.0版本)

下載
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
解壓
tar xzf redis-5.0.0.tar.gz
進入redis目錄
cd redis-5.0.0
編譯
make
安裝到指定目錄下(/usr/local/redis)
make install PREFIX=/usr/local/redis
將配置檔案複製到安裝目錄下
cp redis.conf /usr/local/redis
指定配置檔案啟動redis
./bin/redis-server ./redis.conf
使用客戶端連線redis(若設定了密碼 則需要加引數 auth password)
./usr/local/redis/bin/redis-cli
停止redis
/usr/local/redis/bin/redis-cli shutdown
pkill redis-server
讓redis開機自啟
vim /etc/rc.local
加入
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis-conf

/usr/local/redis/bin目錄下檔案作用
  redis-benchmark:redis效能測試工具
  redis-check-aof:檢查aof日誌的工具
  redis-check-dump:檢查rdb日誌的工具
  redis-cli:連線用的客戶端
  redis-server:redis服務程序

redis.conf檔案中可以配置的內容
    daemonize:如需要在後臺執行,把該項的值改為yes
  pdifile:把pid檔案放在/var/run/redis.pid,可以配置到其他地址
  bind:指定redis只接收來自該IP的請求,如果不設定,那麼將處理所有請求,在生產環節中最好設定該項
  port:監聽埠,預設為6379
  timeout:設定客戶端連線時的超時時間,單位為秒
  loglevel:等級分為4級,debug,revbose,notice和warning。生產環境下一般開啟notice
  logfile:配置log檔案地址,預設使用標準輸出,即列印在命令列終端的埠上
  database:設定資料庫的個數,預設使用的資料庫是0
  save:設定redis進行資料庫映象的頻率
  rdbcompression:在進行映象備份時,是否進行壓縮
  dbfilename:映象備份檔案的檔名
  dir:資料庫映象備份的檔案放置的路徑
  slaveof:設定該資料庫為其他資料庫的從資料庫
  masterauth:當主資料庫連線需要密碼驗證時,在這裡設定
  requirepass:設定客戶端連線後進行任何其他指定前需要使用的密碼
  maxclients:限制同時連線的客戶端數量
  maxmemory:設定redis能夠使用的最大記憶體
  appendonly:開啟appendonly模式後,redis會把每一次所接收到的寫操作都追加到appendonly.aof檔案中,當redis重新啟動時,會從該檔案恢復出之前的狀態
  appendfsync:設定appendonly.aof檔案進行同步的頻率
  vm_enabled:是否開啟虛擬記憶體支援
  vm_swap_file:設定虛擬記憶體的交換檔案的路徑
  vm_max_momery:設定開啟虛擬記憶體後,redis將使用的最大實體記憶體的大小,預設為0
  vm_page_size:設定虛擬記憶體頁的大小
  vm_pages:設定交換檔案的總的page數量
  vm_max_thrrads:設定vm IO同時使用的執行緒數量

Redis中的五種資料型別

  • string(字串)

string 是 redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value。

string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如jpg圖片或者序列化的物件。

string 型別是 Redis 最基本的資料型別,string 型別的值最大能儲存 512MB。

關於string的一些操作命令如下

1    SET key value    此命令設定指定鍵的值。
2    GET key    獲取指定鍵的值。
3    GETRANGE key start end    獲取儲存在鍵上的字串的子字串。
4    GETSET key value    設定鍵的字串值並返回其舊值。
5    GETBIT key offset    返回在鍵處儲存的字串值中偏移處的位值。
6    MGET key1 [key2..]    獲取所有給定鍵的值
7    SETBIT key offset value    儲存在鍵上的字串值中設定或清除偏移處的位
8    SETEX key seconds value    使用鍵和到期時間來設定值
9    SETNX key value    設定鍵的值,僅當鍵不存在時
10    SETRANGE key offset value    在指定偏移處開始的鍵處覆蓋字串的一部分
11    STRLEN key    獲取儲存在鍵中的值的長度
12    MSET key value [key value …]    為多個鍵分別設定它們的值
13    MSETNX key value [key value …]    為多個鍵分別設定它們的值,僅當鍵不存在時
14    PSETEX key milliseconds value    設定鍵的值和到期時間(以毫秒為單位)
15    INCR key    將鍵的整數值增加1
16    INCRBY key increment    將鍵的整數值按給定的數值增加
17    INCRBYFLOAT key increment    將鍵的浮點值按給定的數值增加
18    DECR key    將鍵的整數值減1
19    DECRBY key decrement    按給定數值減少鍵的整數值
20    APPEND key value    將指定值附加到鍵
如果 key 已經存在並且是一個字串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾。


hash(雜湊)

Redis hash 是一個鍵值(key=>value)對集合。

Redis hash 是一個 string 型別的 field 和 value 的對映表,hash 特別適合用於儲存物件。

關於hash的一些操作命令如下

1    HDEL key field2 [field2]    刪除一個或多個雜湊欄位。
2    HEXISTS key field    判斷是否存在雜湊欄位。
3    HGET key field    獲取儲存在指定鍵的雜湊欄位的值。
4    HGETALL key    獲取儲存在指定鍵的雜湊中的所有欄位和值
5    HINCRBY key field increment    將雜湊欄位的整數值按給定數字增加
6    HINCRBYFLOAT key field increment    將雜湊欄位的浮點值按給定數值增加
7    HKEYS key    獲取雜湊中的所有欄位
8    HLEN key    獲取雜湊中的欄位數量
9    HMGET key field1 [field2]    獲取所有給定雜湊欄位的值
10    HMSET key field1 value1 [field2 value2 ]    為多個雜湊欄位分別設定它們的值
11    HSET key field value    設定雜湊欄位的字串值
12    HSETNX key field value    僅當欄位不存在時,才設定雜湊欄位的值
13    HVALS key    獲取雜湊中的所有值


list(列表)

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。到列

關於list的一些操作命令如下

1    BLPOP key1 [key2 ] timeout    刪除並獲取列表中的第一個元素,或阻塞,直到有一個元素可用
2    BRPOP key1 [key2 ] timeout    刪除並獲取列表中的最後一個元素,或阻塞,直到有一個元素可用
3    BRPOPLPUSH source destination timeout    從列表中彈出值,將其推送到另一個列表並返回它; 或阻塞,直到一個
可用
4    LINDEX key index    通過其索引從列表獲取元素
5    LINSERT key BEFORE/AFTER pivot value    在列表中的另一個元素之前或之後插入元素
6    LLEN key    獲取列表的長度
7    LPOP key    刪除並獲取列表中的第一個元素
8    LPUSH key value1 [value2]    將一個或多個值新增到列表
9    LPUSHX key value    僅當列表存在時,才向列表新增值
10    LRANGE key start stop    從列表中獲取一系列元素
11    LREM key count value    從列表中刪除元素
12    LSET key index value    通過索引在列表中設定元素的值
13    LTRIM key start stop    修剪列表的指定範圍
14    RPOP key    刪除並獲取列表中的最後一個元素
15    RPOPLPUSH source destination    刪除列表中的最後一個元素,將其附加到另一個列表並返回
16    RPUSH key value1 [value2]    將一個或多個值附加到列表
17    RPUSHX key value    僅當列表存在時才將值附加到列表


set(集合)

Redis的Set是string型別的無序集合。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。

關於set的一些操作命令如下

1    SADD key member1 [member2]    將一個或多個成員新增到集合
2    SCARD key    獲取集合中的成員數
3    SDIFF key1 [key2]    減去多個集合
4    SDIFFSTORE destination key1 [key2]    減去多個集並將結果集儲存在鍵中
5    SINTER key1 [key2]    相交多個集合
6    SINTERSTORE destination key1 [key2]    交叉多個集合並將結果集儲存在鍵中
7    SISMEMBER key member    判斷確定給定值是否是集合的成員
8    SMOVE source destination member    將成員從一個集合移動到另一個集合
9    SPOP key    從集合中刪除並返回隨機成員
10    SRANDMEMBER key [count]    從集合中獲取一個或多個隨機成員
11    SREM key member1 [member2]    從集合中刪除一個或多個成員
12    SUNION key1 [key2]    新增多個集合
13    SUNIONSTORE destination key1 [key2]    新增多個集並將結果集儲存在鍵中
14    SSCAN key cursor [MATCH pattern] [COUNT count]    遞增地迭代集合中的元素


zset(sorted set:有序集合)

Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

關於zset的一些操作命令如下

1    ZADD key score1 member1 [score2 member2] 
向有序集合新增一個或多個成員,或者更新已存在成員的分數
2    ZCARD key 
獲取有序集合的成員數
3    ZCOUNT key min max 
計算在有序集合中指定區間分數的成員數
4    ZINCRBY key increment member 
有序集合中對指定成員的分數加上增量 increment
5    ZINTERSTORE destination numkeys key [key ...] 
計算給定的一個或多個有序集的交集並將結果集儲存在新的有序集合 key 中
6    ZLEXCOUNT key min max 
在有序集合中計算指定字典區間內成員數量
7    ZRANGE key start stop [WITHSCORES] 
通過索引區間返回有序集合成指定區間內的成員
8    ZRANGEBYLEX key min max [LIMIT offset count] 
通過字典區間返回有序集合的成員
9    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 
通過分數返回有序集合指定區間內的成員
10    ZRANK key member 
返回有序集合中指定成員的索引
11    ZREM key member [member ...] 
移除有序集合中的一個或多個成員
12    ZREMRANGEBYLEX key min max 
移除有序集合中給定的字典區間的所有成員
13    ZREMRANGEBYRANK key start stop 
移除有序集合中給定的排名區間的所有成員
14    ZREMRANGEBYSCORE key min max 
移除有序集合中給定的分數區間的所有成員
15    ZREVRANGE key start stop [WITHSCORES] 
返回有序集中指定區間內的成員,通過索引,分數從高到底
16    ZREVRANGEBYSCORE key max min [WITHSCORES] 
返回有序集中指定分數區間內的成員,分數從高到低排序
17    ZREVRANK key member 
返回有序集合中指定成員的排名,有序整合員按分數值遞減(從大到小)排序
18    ZSCORE key member 
返回有序集中,成員的分數值
19    ZUNIONSTORE destination numkeys key [key ...] 
計算給定的一個或多個有序集的並集,並存儲在新的 key 中
20    ZSCAN key cursor [MATCH pattern] [COUNT count] 
迭代有序集合中的元素(包括元素成員和元素分值)

Redis中針對於key的操作

1    DEL key
該命令用於在 key 存在時刪除 key。
2    DUMP key 
序列化給定 key ,並返回被序列化的值。
3    EXISTS key 
檢查給定 key 是否存在。
4    EXPIRE key seconds
為給定 key 設定過期時間,以秒計。
5    EXPIREAT key timestamp 
EXPIREAT 的作用和 EXPIRE 類似,都用於為 key 設定過期時間。 不同在於 EXPIREAT 命令接受的時間引數是 UNIX 時間戳
(unix timestamp)。
6    PEXPIRE key milliseconds 
設定 key 的過期時間以毫秒計。
7    PEXPIREAT key milliseconds-timestamp 
設定 key 過期時間的時間戳(unix timestamp) 以毫秒計
8    KEYS pattern 
查詢所有符合給定模式( pattern)的 key 。
9    MOVE key db 
將當前資料庫的 key 移動到給定的資料庫 db 當中。
10    PERSIST key 
移除 key 的過期時間,key 將持久保持。
11    PTTL key 
以毫秒為單位返回 key 的剩餘的過期時間。
12    TTL key 
以秒為單位,返回給定 key 的剩餘生存時間(TTL, time to live)。
13    RANDOMKEY 
從當前資料庫中隨機返回一個 key 。
14    RENAME key newkey 
修改 key 的名稱
15    RENAMENX key newkey 
僅當 newkey 不存在時,將 key 改名為 newkey 。
16    TYPE key 
返回 key 所儲存的值的型別。

Redis事務

事務中的所有命令作為單個隔離操作並按順序執行。不可以在執行Redis事務的中間向另一個客戶端發出的請求。

Redis事務也是原子的。原子意味著要麼處理所有命令,要麼都不處理。

事務的命令如下

1	DISCARD	丟棄在MULTI之後發出的所有命令
2	EXEC	執行MULTI後發出的所有命令
3	MULTI	標記事務塊的開始
4	UNWATCH	取消 WATCH 命令對所有 key 的監視。
5	WATCH key [key …]	監視給定的鍵以確定MULTI / EXEC塊的執行

關於多資料庫

Redis支援多個數據庫,並且每個資料庫的資料是隔離的不能共享,並且基於單機才有,如果是叢集就沒有資料庫的概念。

Redis是一個字典結構的儲存伺服器,而實際上一個Redis例項提供了多個用來儲存資料的字典,客戶端可以指定將資料儲存在
哪個字典中。這與我們熟知的在一個關係資料庫例項中可以建立多個數據庫類似,所以可以將其中的每個字典都理解成一個獨
立的資料庫。

每個資料庫對外都是一個從0開始的遞增數字命名,Redis預設支援16個數據庫(可以通過配置檔案支援更多,無上限),可以
通過配置databases來修改這一數字。客戶端與Redis建立連線後會自動選擇0號資料庫,不過可以隨時使用SELECT命令更換資料
庫,如要選擇1號資料庫:select 1
然而這些以數字命名的資料庫又與我們理解的資料庫有所區別。首先Redis不支援自定義資料庫的名字,每個資料庫都以編號命
名,開發者必須自己記錄哪些資料庫儲存了哪些資料。另外Redis也不支援為每個資料庫設定不同的訪問密碼,所以一個客戶端
要麼可以訪問全部資料庫,要麼連一個數據庫也沒有許可權訪問。最重要的一點是多個數據庫之間並不是完全隔離的,比如
FLUSHALL命令可以清空一個Redis例項中所有資料庫中的資料。綜上所述,這些資料庫更像是一種名稱空間,而不適宜儲存不同
應用程式的資料。比如可以使用0號資料庫儲存某個應用生產環境中的資料,使用1號資料庫儲存測試環境中的資料,但不適宜
使用0號資料庫儲存A應用的資料而使用1號資料庫B應用的資料,不同的應用應該使用不同的Redis例項儲存資料。由於Redis非
常輕量級,一個空Redis例項佔用的內在只有1M左右,所以不用擔心多個Redis例項會額外佔用很多記憶體。

Redis持久化

Redis提供了不同級別的持久化方式,一種是RDB,一種AOF。可以同時開啟兩種持久化方式, 在這種情況下, 當redis重啟的時候會優先載入AOF檔案來恢復原始的資料,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整.

RDB:在指定的時間間隔能對資料進行快照儲存(隔一段時間,把記憶體裡的資料轉存在硬盤裡的檔案)

優點:

  1. RDB是一個非常緊湊的檔案,它儲存了某個時間點得資料集,非常適用於資料集的備份,比如您可以在每個小時報儲存一下過去24小時內的資料,同時每天儲存過去30天的資料,這樣即使出了問題您也可以根據需求恢復到不同版本的資料集.
  2. RDB是一個緊湊的單一檔案,很方便傳送到另一個遠端資料中心或者亞馬遜的S3(可能加密),非常適用於災難恢復.
  3. RDB在儲存RDB檔案時父程序唯一需要做的就是fork出一個子程序,接下來的工作全部由子程序來做,父程序不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的效能.
  4. 與AOF相比,在恢復大的資料集的時候,RDB方式會更快一些.

缺點:

  1. 如果您希望在redis意外停止工作(例如電源中斷)的情況下丟失的資料最少的話,那麼RDB不適合您.雖然您可以配置不同的save時間點(例如每隔5分鐘並且對資料集有100個寫的操作),是Redis要完整的儲存整個資料集是一個比較繁重的工作,您通常會每隔5分鐘或者更久做一次完整的儲存,萬一在Redis意外宕機,您可能會丟失幾分鐘的資料.
  2. RDB 需要經常fork子程序來儲存資料集到硬碟上,當資料集比較大的時候,fork的過程是非常耗時的,可能會導致Redis在一些毫秒級內不能響應客戶端的請求.如果資料集巨大並且CPU效能不是很好的情況下,這種情況會持續1秒,AOF也需要fork,但是您可以調節重寫日誌檔案的頻率來提高資料集的耐久度.

AOF:每次對伺服器寫的操作,當伺服器重啟的時候會重新執行這些命令來恢復原始的資料,AOF命令以redis協議追加儲存每次寫的操作到檔案末尾.Redis還能對AOF檔案進行後臺重寫,使得AOF檔案的體積不至於過大.

優點:

  1. 使用AOF 會讓您的Redis更加耐久: 您可以使用不同的fsync策略:無fsync,每秒fsync,每次寫的時候fsync.使用預設的每秒fsync策略,Redis的效能依然很好(fsync是由後臺執行緒進行處理的,主執行緒會盡力處理客戶端請求),一旦出現故障,您最多丟失1秒的資料.
  2. AOF檔案是一個只進行追加的日誌檔案,所以不需要寫入seek,即使由於某些原因(磁碟空間已滿,寫的過程中宕機等等)未執行完整的寫入命令,您也也可使用redis-check-aof工具修復這些問題.
  3. Redis 可以在 AOF 檔案體積變得過大時,自動地在後臺對 AOF 進行重寫: 重寫後的新 AOF 檔案包含了恢復當前資料集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在建立新 AOF 檔案的過程中,會繼續將命令追加到現有的 AOF 檔案裡面,即使重寫過程中發生停機,現有的 AOF 檔案也不會丟失。 而一旦新 AOF 檔案建立完畢,Redis 就會從舊 AOF 檔案切換到新 AOF 檔案,並開始對新 AOF 檔案進行追加操作。
  4. AOF 檔案有序地儲存了對資料庫執行的所有寫入操作, 這些寫入操作以 Redis 協議的格式儲存, 因此 AOF 檔案的內容非常容易被人讀懂, 對檔案進行分析(parse)也很輕鬆。 匯出(export) AOF 檔案也非常簡單: 舉個例子, 如果您不小心執行了 FLUSHALL 命令, 但只要 AOF 檔案未被重寫, 那麼只要停止伺服器, 移除 AOF 檔案末尾的 FLUSHALL 命令, 並重啟 Redis , 就可以將資料集恢復到 FLUSHALL 執行之前的狀態。

缺點:

  1. 對於相同的資料集來說,AOF 檔案的體積通常要大於 RDB 檔案的體積。
  2. 根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB 。 在一般情況下, 每秒 fsync 的效能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。

Redis的優點

  1. Redis是一個基於記憶體的高效能key-value資料庫。
  2. 單執行緒,利用redis佇列技術並將訪問變為序列訪問,消除了傳統資料庫序列控制的開銷。
  3. 支援豐富資料型別。
  4. 豐富的特性,支援 publish/subscribe、多資料庫、通知、 key 過期、分散式等等。