[快速學習]Redis快速學習

什麼是Redis?

隨着訪問量的提高,關係型數據庫多多少少遇到了瓶頸,爲了克服這一問題,NoSQL(Not Only SQL)應運而生,它同時具有了高性能、可擴展性強、高可用等優勢。 java

redis是如今受歡迎的NoSQL數據庫之一,是由C語言開發的,包含多種數據結構,支持網絡,基於內存,可選持久性的鍵值對存儲數據庫。linux


Redis特色

* redis支持多種數據結構
    * redis經過key-value的形式存儲數據
    * redis支持數據的持久化
    * redis支持主從模式,能夠配置集羣
    * 基於內存運行,性能高效

Redis安裝

附一個官網地址,奇妙連接redis

redis雖然也有Windows版,可是仍是推薦在linux系統下安裝。數據庫

  1. 下載redis.tar.gz包併發送到linux系統。
  2. 解壓tar包,tar -zxvf redis-6.2.1.tar.gz -C dir
  3. 進入解壓後的src目錄中,執行make命令,此命令編譯C,可是須要gcc支持,沒有可使用yum提早下載gcc。安全

    • 若是編譯過程當中報錯提示沒有gcc支持,在退出編譯並安裝gcc後須要使用make distclean將以前編譯的內容清除。
    • 編譯成功以後,執行make install命令將可執行文件拷貝到/usr/local/bin
  4. 安裝成功。

Redis服務啓動

主要有如下三種方式服務器

  1. redis-server網絡

    • 前臺啓動redis,此方法啓動後會佔用控制檯並使用默認配置啓動redis服務。
  2. redis-server &數據結構

    • 後臺啓動redis,此方法不會佔用控制檯,也是使用默認配置啓動redis服務。
  3. redis-server redis.conf &併發

    • 後臺使用指定配置文件啓動redis,使用指定配置文件中的配置啓動redis服務。(配置文件模板爲redis根目錄的redis.conf

Redis服務關閉

主要有一下兩種方式app

  1. kill -9 pid

    • 括弧笑。慎用!!!
  2. redis-cli shutdown

    • 此方法默認關閉本機上端口爲6379的redis服務,若是修改了端口或ip,須要修改成如下格式redis-cli -h ipadress -p port shutdown

Redis客戶端

redis默認帶有客戶端爲redis-cli

鏈接方式爲 redis-cli -h ipadress -p port -a password,若是redis安裝在本機且端口爲默認的6379能夠直接使用redis-cli鏈接。

退出客戶端只須要執行exit命令。


Redis基本知識

  1. 測試redis服務性能:redis-benchmark命令,參數具體以下表
  2. 測試客戶端與服務端鏈接狀況:ping命令,須要在客戶端中執行,鏈接正常返回PONG
  3. 查看redis信息:info命令,須要在客戶端中執行,也能夠在後面加指定內容信息,例info cpu
  4. redis默認建立16個數據庫,根據[0,15]編號命名,沒法本身建立,若是有數據庫實例數量要求能夠經過配置文件修改。
  5. 客戶端默認鏈接0號數據庫實例,可使用select index命令切換數據庫實例。
  6. 顯示當前數據庫實例有多少數據(key的數量)須要在客戶端中執行:dbsize命令。
  7. 清空當前數據庫實例,須要在客戶端中執行:flushdb
  8. 清空全部數據庫實例,須要在客戶端中執行:flushall
  9. 查看配置信息,須要在客戶端中執行:config get *,也能夠執行某條配置,例config get port

Redis的數據結構

redis本質上仍是數據庫,職能是儲存數據,針對於程序處理後的數據,redis提供了多種數據類型存儲。

String

特色:單key對應單個value

List

特色:單key對應多個value,value容許重複且有序(按插入順序排序)

Set

特色:單key對應多個value,value不容許重複且無序。

Hash

特色:單key對應多個filed-value對。

Zset

特色:單key對應多個value,每一個value對應一個score值,value不容許重複且有序(按照score從小到大排序)


Redis的操做命令

<font color=red>全部操做命令都在客戶端中使用。</font>

關於Key的操做命令

  1. keys *

    • 查找全部全部符合通配符的key。
    • * 匹配一個或多個字符 ? 匹配一個字符 [] 匹配一個字符且字符須要在[]中提早定義。
    • 命令返回當前數據庫實例中全部key。
  2. exists key1 [key2 ...]

    • 判斷一個或多個key在當前實例是否存在。
    • 返回在當前數據庫實例中存在的key的個數。
  3. move key index

    • 將指定key移動到指定編號的數據庫實例。一次只能移動一個key。
    • 移動成功返回 1
  4. ttl key

    • 查詢指定key的剩餘生存時間(秒)
    • 正常返回剩餘時間,key不存在返回 -2 ,key沒有設置生存時間返回 -1
  5. expire key seconds

    • 爲指定的key設置最大的生存時間(秒)
    • 設置成功返回 1
  6. type key

    • 查看指定key對應value的類型。
    • 返回value的類型。
  7. rename key newkey

    • 重命名key
  8. del key1 [key2 ...]

    • 刪除指定的key
    • 返回成功刪除的key的個數。

有關String類型的操做命令

  1. set key value

    • 保存一個String類型的值。
    • 若key存在,則value將原值覆蓋。
  2. get key

    • 獲取指定key對應的值。
  3. append key value

    • 在指定key對應的值後追加value
    • 返回追加後的值的長度。
    • 若是指定的key不存在,則該命令至關於set
  4. incr key

    • 若是指定key對應的值是數值,則進行加一操做;不是數值則報錯。
    • 若是指定的key不存在,則新建一個,並將值初始化爲 0 ,再進行操做。
    • 返回值操做後的結果。
  5. decr key

    • 減一操做,規則同上。
  6. incrby key offset

    • 對值執行加offset操做,規則同上。
  7. decrby key offset

    • 對值執行減offset操做,規則同上。
  8. strlen key

    • 獲取指定key對應值的長度。
    • 返回長度。
  9. getrange key startIndex endIndex

    • 截取指定key對應的值指定區間的內容。
    • startIndex endIndex採用閉區間。
    • 字符串由左至右下標從 0 開始,由右至左從 -1 開始。因此若要截取整個字符串的內容,可使用getrange key 0 -1
    • 返回指定區間造成的子字符串。
  10. setrange key startIndex value

    • 用value從startIndex開始覆蓋原值,value多長則覆蓋多少內容。
    • 返回修改以後的字符串的長度。
  11. setex key seconds value

    • 設置值的同時設置最大生存時間。
  12. setnx key value

    • 插入時進行檢測,若key已存在,則插入失敗。
    • 插入成功返回 1 ,插入失敗返回 0
  13. mset key1 value1 [key2 value2 ...]

    • 批量插入值。
  14. mget key1 [key2 ...]

    • 批量獲取值。
    • 若key不存在,返回nil
  15. msetnx key1 value1 [key2 value2 ...]

    • 批量插入值,只要有一個值存在,則所有放棄插入。

有關List類型的操做命令

  1. lpush key value1 [value2 ...]

    • 將一個或多個值依次插入到表頭(左側)
    • 該命令將值依次插入表頭,例lpush k1 1 2 3,插入結果爲3 2 1
    • 返回插入後的列表長度。
  2. lrange key startIndex endIndex

    • 查看指定key對應列表中指定區間的值。
    • startIndex endIndex採用閉區間。
    • 由左至右下標從 0 開始,由右至左從 -1 開始。若想顯示整個列表,例lrange key 0 -1
  3. rpush key value1 [value2 ...]

    • 將一個或多個值依次插入到表尾(右側)
    • 返回插入後的列表長度。
  4. lpop key [count]

    • 刪除從表頭開始count個元素。
    • 返回被刪除的元素。
  5. lindex key index

    • 獲取指定下標的元素。
  6. llen key

    • 獲取指定列表的長度。
  7. rpop key [count]

    • 刪除從表尾開始count個元素。
    • 返回被刪除的元素
  8. lrem key count value

    • 在指定列表中刪除count個與value相等的值。

      • count > 0 則從表頭開始刪除。
      • count < 0 則從表尾開始刪除。
      • count = 0 則刪除全部。

有關Set類型的操做命令

  1. sadd key member1 [member2 ...]

    • 將一個或多個數據存放到集合中。
    • 若是值已經存在則忽略。
    • 返回成功插入的個數。
  2. smembers key

    • 查詢集合中的全部元素。
  3. sismember key member

    • 查詢元素在集合中是否存在。
    • 存在返回 1 ,不存在返回 0
  4. scard key

    • 查詢指定集合的長度。
  5. srem key member1 [member2 ...]

    • 在指定集合中刪除一個或多個值。
    • 返回成功刪除的元素個數。
  6. srandmember key count

    • 在指定集合中隨機獲取count個值。

      • count > 0 count個不重複的值
      • count < 0 count個可能重複的值
  7. spop key count

    • 在指定集合中隨機刪除一個或多個元素。
    • 返回被刪除的元素。
  8. smove source dest member

    • 將源集合中的指定元素移動到另外一個集合中。
  9. sdiff key1 key2 [key3 ...]

    • 返回指定集合與其餘集合的差集。
  10. sinter key1 key2 [key3 ...]

    • 返回指定集合與其餘集合的交集。
  11. sunion key1 key2 [key3 ...]

    • 返回指定集合與其餘集合的並集。

有關Hash類型的操做命令

  1. hset key field1 value1 [field2 value2 ...]

    • 在指定哈希表中插入一個或多個元素。
    • 返回插入成功的元素個數。
  2. hget key field

    • 獲取指定哈希表中指定屬性的值。
  3. hmset key field1 value1 [field2 value2 ...]

    • 在指定哈希表中批量插入元素。
    • 感受和set沒什麼區別?
  4. hmget key field1 [field2 ...]

    • 獲取指定哈希表中的多個屬性值。
  5. hgetall key

    • 獲取指定哈希表中全部屬性。
  6. hdel key field1 [field2 ...]

    • 刪除指定哈希表中的一個或多個屬性值。
  7. hlen key

    • 返回指定哈希表中有多少屬性值。
  8. hexists key field

    • 查詢指定哈希表中是否有某元素。
  9. hkeys key

    • 返回指定哈希表中的全部field值,不返回value值。
  10. hvals key

    • 返回指定哈希表中的全部value值,不返回field值。
  11. hincrby key field int

    • 將指定哈希表中指定屬性的值進行加 int 操做。
    • 若指定屬性值不爲數值則報錯。
    • int爲整數。
    • 返回操做以後的數值。
  12. hincrbyfloat key field float

    • 規則同上。
    • float爲小數。
  13. hsetnx key field value

    • 插入前驗證,屬性存在則插入失敗。

有關Zset的操做命令

  1. zadd key score1 member1 [score2 member2 ...]

    • 向指定有序集合中插入一個或多個元素。
    • 元素插入後會根據score值天然排序,由小至大。
    • 有序集合本質仍是集合,不容許數據重複,當出現重複數據時,會覆蓋以前的score值。
  2. zrange key startIndex endIndex [withscores]

    • 因爲已經進行天然排序,全部能夠經過下標進行區間取值。
    • 由左至右下標從 0 開始,由右至左從 -1 開始。若想顯示整個列表,例zrange key 0 -1
    • 添加 withscores 則會同時返回每一個元素對應的score值。
    • 反向排序使用 zrevrange 命令,參數不變。
  3. zrangebyscore key min max [withscores]

    • 獲取指定有序集合中指定score區間的元素。
    • 添加 withscores 則會同時返回每一個元素對應的score值。
    • 反向排序使用 zrevrangebyscore 命令,參數不變。
  4. zrem key member1 [member2 ...]

    • 在指定有序集合中刪除一個或多個元素。
  5. zcard key

    • 獲取指定有序集合的長度。
  6. zrank key member

    • 獲取指定有序集合中指定元素的排名。
    • 天然排序,由0開始。
    • 反向排序,使用zrevrank命令,參數不變。
  7. zcount key min max

    • 獲取指定有序集合中指定score區間的元素個數。
  8. zscore key member

    • 獲取指定有序集合中指定元素的score值。

Redis的配置文件

redis的配置文件模板在解壓目錄根目錄的redis.conf,這裏簡單說幾個配置。

網絡配置

  1. port 配置redis服務啓動的端口號。
  2. bind 配置客戶端鏈接服務的IP地址,默認使用redis服務所在主機上的任何一個IP均可以鏈接到服務。
  3. tcp-keepalive 保活策略,設置服務端隔多少秒確認客戶端存活,設置爲0則不進行保活檢測。

常規配置

  1. loglevel 日誌級別,分爲debug,notice,warning,默認爲notice
  2. logfile 指定日誌文件,默認將日誌輸出到控制檯。
  3. databases 配置建立數據庫實例個數,默認16

安全配置

1. requirepass 配置訪問密碼,默認不使用密碼。
 2. 若是配置了密碼,須要將protected-mode設置成yes

Redis的持久化

redis是基於內存的數據庫,防止意外丟失數據,redis支持數據的持久化,將內存中的數據存到磁盤,下次redis服務啓動的時候再從磁盤讀取到內存中。

RDB

RDB策略是redis默認的持久化策略。

在指定的時間間隔內,redis服務執行指定次數的寫操做,會自動觸發一次持久話操做。

RDB策略默認的時間間隔是,1分鐘內10000次,5分鐘內10次,15分鐘內1次。

  • 若是想禁用RDB策略,註釋掉配置文件中save配置就能夠。

具體配置略。

AOF

AOF策略採用操做日誌的方式來記錄每一次寫操做,每次redis啓動時,都會從新執行一遍記錄的操做指令。

部分配置:

  • appendonly 是否開啓AOF
  • appendfilename 日誌保存文件名
  • appendfsync AOF異步策略

    • always 同步持久話,每次變化都會被寫入磁盤
    • everysec 默認,每秒寫入磁盤一次
    • no 不即時同步

Redis的事務

redis爲了追求執行的高效性,犧牲了事務的原子性。redis的事務是將一系列命令放在一塊兒,將命令序列化以後依次執行,只能實現部分原子性。

Redis的部分原子性

redis的事務是將一系列命令先壓入命令隊列再執行,若是在壓入命令隊列時出現錯誤,則事務被放棄,事務內的全部命令都不執行;如果在執行事務的過程當中出現錯誤,則只有出錯的命令沒法執行,其他命令正常執行。

redis關於事務的操做命令

  1. multi

    • 標記一個事務的開始,即建立一個命令隊列,該命令以後的命令都不會馬上執行而是被壓入命令隊列。
  2. exec

    • 事務開始執行,開始執行命令隊列中的命令。
  3. discard

    • 放棄當前事務。
  4. watch key

    • 相似樂觀鎖機制,在multi以前由該命令監視一個key,當事務開始執行時,當被監視的key發生變化時,事務放棄執行。
  5. unwatch

    • 放棄全部監視。

Redis的消息發佈和訂閱

redis同時還提供了客戶端之間交互的功能,可是大部分此功能都是由消息中間件完成,因此只作瞭解。

操做命令

  1. subscribe ch1 [ch2 ...]

    • 訂閱一個或多個頻道
  2. publish ch1 message

    • 向指定頻道發佈消息
  3. psubscribe ch1*

    • 批量訂閱頻道,支持通配符

Redis的集羣

redis支持集羣模式,提供了主機數據更新後根據配置和策略自動同步到從機的master/slave機制,master服務以寫爲主,slave只能進行讀操做。

一主二從搭建(宕機手動調整)

主要實現了,主寫從讀,讀寫分離

  1. 首先須要三個redis服務,能夠三臺服務器啓動或是同一服務器經過配置不一樣接口啓動三個互不干涉的redis服務。
  2. info replication命令查看redis服務的主從角色。
  3. 設置主從關係,設從不設主。

    • 在兩臺從機上執行 slaveof ip port
    • ip 和 port 爲主機redis服務的ip和端口。
  4. 當主從關係肯定後,主機中已有的數據會複製到從機中,這被稱爲全量複製。
  5. 主機每次進行寫操做後,修改的內容會被同步到從機中,這被稱爲增量複製。
  6. 當主機宕機時,從機仍能夠進行讀操做且不會改變當前的主從關係。
  7. 主機恢復後,集羣正常恢復。
  8. 當從機宕機時,集羣正常使用。
  9. 從機恢復後丟失主從關係,須要從新配置。
  10. 主機宕機,從機上位操做步驟

    • 主機宕機後,從機執行 slaveof no one斷開當前的主從狀態。
    • 從新設置主從關係。
    • 此時主機恢復後,成爲一個獨立的redis服務,與集羣沒有關係。

哨兵模式

redis的主從模式實現了功能,可是主機宕機以後須要手動從新設置主從狀態,並且咱們沒法預測主機當時時間,爲了解決這個問題redis提供了哨兵模式。

哨兵模式主要是經過哨兵程序監控主機狀態,當發現主機宕機以後,在從機中選舉一個新的主機。

哨兵程序的配置模板在reids根目錄的sectinel.conf

具體配置略。

簡略配置,新建一個配置文件,只加入以下配置。

sentinel monitor dc-redis ipadress port num

  • 其中 dc-redis爲自定義的名稱。
  • ipadress port 爲集羣主機的ip地址和端口。
  • num 表示新主機選舉得票數,最早獲得指定票數的從機成爲主機。

隨後啓動哨兵

redis-sentinel sentinel.conf

啓動哨兵以後,當主機再發生宕機,則會進行選舉出現新的主機,當原主機修復以後,自動成爲新主機的從機。


Jedis

jedis是redis官方推出的java控制redis的工具,主要是將redis的操做指令封裝成了java方法,此處暫略。


Spring Boot整合Redis

redis的starter中對原有的API進行了修改,因此使用方法上和操做命令略有不一樣,此處暫略。

相關文章
相關標籤/搜索