有興趣跟我來學下這個嗎?

在學習redis之前,我們首先需要了解一下NoSQL(非關係數據庫)。非關係型數據庫通常指數據以對象的形式存儲在數據庫中,而對象之間的關係通過每個對象自身的屬性來決定。

爲什麼需要 NoSQL?
(1) High performance - 高併發讀寫

(2) Huge Storage - 海量數據的高效率存儲和訪問

(3) High Scalability && Hig Availability - 高可擴展性和高可用性

NoSQL 數據庫的四大分類 :
(1) 鍵值 (Key - Value) 存儲

(2) 列存儲

(3) 文檔數據庫

(4) 圖形數據庫

NoSQL 的特點 :
(1) 易擴展:數據庫種類多,非關係

(2) 靈活的數據模型:無需對存儲的數據模型進行建立

(3) 大數據量,高性能:具有高讀寫性能

(4) 高可用:可以集成於很多框架

REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfillippo 寫的 key-value 存儲系統,遵循 BSD 協議、支持網絡、可基於內存亦可持久化的日誌型、 key-value 數據庫,通常稱它爲數據結構服務器,因爲值 (value) 可以是 String 、 Hash 、 List 、 Set 、 Sorted Set 等類型。

Redis 的應用場景:
(1) 緩存:數據的查詢

(2) 任務隊列:秒殺,搶購

(3) 網站訪問統計

(4) 數據過期處理:精確到毫秒

(5) 應用排行榜

(6) 分佈式集羣架構中的 session 分離

Redis 與其他 key-value 緩存產品有以下三個特點:
Redis 支持數據的持久化,可以將內存中的數據保存在磁盤中 ( 在寫入的時候可能會存在數據丟失 ) ,重啓的時候可以再次加載進行使用。
Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list 、 set 、 sorted set 、 hash等數據結構的存儲。
Redis 支持數據的備份,即 master-slave 模式的數據備份。
Redis 連接
Jedis 是 Redis 官方推薦的 Java 連接開發工具。

// 1.設置IP地址和端口
Jedis jedis = new Jedis("localhost", 6379);
// 2.保存數據
jedis.set("name", "張三");
String val = jedis.get("name");
System.out.println(val);
// 3.關閉資源
jedis.close();
基於連接池的連接

// 獲得連接池的配置對象
JedisPoolConfig config = new JedisPoolConfig();
// 設置最大連接數
config.setMaxTotal(30);
// 設置最大的空閒連接數
config.setMaxIdle(10);
// 設置最大等待時間
config.setMaxWaitMillis(1000);

try(

    // 獲得連接池
    JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
    Jedis jedis = jedisPool.getResource();
    ) {
jedis.set("name1","00001");
String val = jedis.get("name1");
System.out.println(val);

}catch (Exception e){

e.printStackTrace();

}
Redis 優勢
性能極高: Redis 最高讀取速度是 110000 次 /s ,寫入速度是 81000 次 /s 。
豐富的數據類型進行存儲。
操作原子性: Redis 的所有操作都是原子性的,並且支持多個操作通過 MULTI 和 EXEC 指令包裹起來後的原子性。
有關 redis 的下載安裝請查考 https://www.runoob.com/redis/redis-install.html

W indow :

運行服務端: 打開一個 cmd 窗口 使用 cd 命令切換目錄到 redis安裝目錄(如:D :redis) 運行:redis-server.exe redis.windows.conf 啓動服務端,也可以直接點擊 redis.window.conf 進行運行。
訪問服務端:另啓一個 cmd窗口(原來打開的cmd窗口不要關閉,不然無法訪問服務端),使用cd命令切換到redis的安裝目錄下運行: redis-cli.exe -h 127.0.0.1 -p 6379
Redis 配置
Redis 的配置文件位於 Redis 安裝目錄下文件名爲 redis.windows.conf 中,也可以通過 config命令查看或設置配置項。

Redis CONFIG 命令格式如下:
redis 127.0 . 0.1 : 6379 > CONFIG GET CONFIG_SETTING_NAME

可以使用 號獲取所有配置項: config get

Redis 存儲數據類型
字符串( 字符串) : string 是 redis 最基本的類型,是二進制安全的,意思是 redis 的 string可以包含任何數據,比如 jpg 圖片或者序列化的對象。一個鍵最大存儲爲 512MB 。
(1) 存: set key1 value1

(2) 取: get key1

(3) 獲取並設置: getSet key1 value2

(4) 刪除: del key1

(5) 遞增: incr key1 ( 將 key1 的值遞增一次,如果不存在這個值,則先將這個值設置爲 0 ,然後遞增 1 ;如果不能轉爲整形,則返回錯誤信息。 )

(6) 遞減: decr key1 ( 將 key1 的值遞減一次,如果不存在這個值,則先將這個值設置爲 0 ,然後遞減 1 ;如果不能轉爲整形,則返回錯誤信息。 )

(7) 遞增值: incrby key1 val1 ( 將 key1 的值遞增 val1 ,如果不存在這個值,則先將這個值設置爲 0 ,然後遞增 val1 ;如果不能轉爲整形,則返回錯誤信息。 )

(8) 遞減值: decrby key1 val1 ( 將 key1 的值遞減 val1 ,如果不存在這個值,則先將這個值設置爲 0 ,然後遞減 val1 ;如果不能轉爲整形,則返回錯誤信息。 )

(9) 拼湊字符串: append key1 val1 ( 字符串拼接,將 redis 中 key1 的值後面拼接一個 val1字符串,返回拼接後字符串的長度,如果不存在,則進行創建設置爲 val1)

  1. 哈希 (hash) : hash 是一個鍵值對集合,是 string 類型的 field 和 value 的映射表, hash 特別適合用於存儲對象。

(1) 存:存 單個鍵值對 - hset key1 field1 value1 存多個鍵值對 - hmset key1 field1 value1 field2 value2 ... ...

(2) 取:取單個鍵值 - hget key1 field1 取多個鍵值 - hmget key1 field1 field2 ... ... 取 key1 對象的全部鍵值 - hgetall key1

(3) 刪除:刪除多個鍵值對 - hdel key1 field1 field2 ... 刪除全部 del key1

  1. 列表 (List) : list 是一個簡單字符串列表,按照插入順序排序。

(1) 兩端添加:左側 - lpush list1 value1 右側 - rpush list1 value2

(2) 查看: lrange list1 start_number end_number (num 可以爲負數,負數表示從尾部開始的索引位置 )

(3) 兩端彈出:左側 - lpop list1 右側 - rpop list1

(4) 長度: llen list1

(5) 插入: lpushx list1 value1 ( 僅當 list1 存在時纔在左側插入 ) rpushx list1 value1 ( 僅當 key1存在時纔在右側插入 )

(6) 刪除指定值得元素: lrem list1 count_number value1 ( 刪除 list1 中 count_number 個值爲 value1 的元素,如果 count_number > 0 ,表示從左側開始多少個;如果 count_number < 0 ,表示從右側開始多少個;如果 count_number = 0 ,表示全是全部值爲 value1 的元素。 )

(7) 在指定位置添加元素:在指定位置插入元素 - lset list1 index1 value1 在指定元素前插入元素- linsert list1 before value1 value2 在指定元素後插入元素 - linsert list1 after value1 value2

(8) 將 list1 中的尾部元素取出並添加到 list2 的頭部 : rpoplpush list1 list2

  1. 集合 (Set) : set 是 string 類型的無序集合, set 集合中不允許出現重複的元素。添加一個 string 元素到 key 對應的 set 集合中,成功返回 1 ,如果元素已經在集合中返回 0 ,如果 key 對應的 set 不存在則返回錯誤。

(1) 存: sadd set1 value1 value2 ...

(2) 查看: smembers set1

(3) 刪除: srem set1 value1 value2 ...

(4) 判斷在集合中元素是否存在: sismember myset value1 ( 如果存在,返回 1 ;不存在返回0)

(5) 差集: sdiff set1 set2 ( 返回在 set1 中存在的,在 set2 不存在的元素 )

(6) 交集: sinter set1 set2 ( 返回同時 set1 、 set2 中都存在的元素 )

(7) 並集: sunion set1 set2 ( 返回 set1 、 set2 的集合,會自動去重 )

(8) 獲取元素個數: scard set1

(9) 隨機返回一個元素: srandmember set1

(10) 將兩個 set(set1 、 set2) 的差集存放在另一個集合 (set3) 中: sdiffstore set1 set2 set3

(11) 將兩個 set(set1 、 set2) 的交集存放在另一個集合 (set3) 中: sinterstore set1 set2 set3

(12) 將兩個 set(set1 、 set2) 的並集存放在另一個集合 (set3) 中: sunionstore set1 set2 set3

  1. 有序集合 zset(Sorted set) : zset 和 set 一樣也是 string 類型元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個 double 類型的分數。 Redis 正是通過分數來爲集合中的成員進行排序。

(1) 添加元素: zadd sort1 score1 value1 score2 value2 ... ... ( 返回添加元素的個數 )

(2) 獲取元素:獲取元素的分數 - zscore sort1 value1 獲取元素的個數 - zcard sort1

(3) 刪除元素: zrem sort1 value1 value2 ... 範圍刪除 - zremrangebyrank sort1 num1 num2 按分數範圍刪除 - zremrangebyscore sort1 score1 score2

(4) 範圍查找: zrange sort num1 num2 顯示分數 - zrange sort1 num1 num2 withscores ( 分數由小到大 ) zreverange sort1 num1 num2 withscores ( 分數由大到小 ) 按分數由小到大查找 - zrangebyscore sort1 num1 num2 按分數由小到大查找,並顯示分數 - zrangebyscore sort1 num1 num2 withscores 分頁查找 - zrangebyscore sort1 num1 num2 limit start_num stop_num

(5) 分數加減: zscore sort1 score1 value1

(6) 統計分數範圍的元素個數: zcount sort1 score1 score2

Redis 的 keys 的通用操作
(1) 獲取所有 key : keys *

(2) 獲取字符開頭的 keys : keys prefix?

(3) 刪除 key : del key1 key2 ...

(4) 判斷是否存在: exists key1 ( 返回 1- 存在, 0- 不存在 )

(5) 重命名: rename key1 new_key1

(6) 設置過期時間 ( 單位: s) : expire key1 num

(7) 所剩時間: ttl key1 ( 無設置過期時間,返回 -1)

(8) 獲取類型: type key1

Redis 的特性:
多數據庫 :一個 redis 可以包含多個數據庫,客戶端可以指定連接某個 redis 實例的數據庫,一個 redis 最多可以提供 16 個數據庫,下標爲 0~15 ,客戶端默認連接下標爲 0 的數據庫。( index_ 表示下標,數值爲 0~15 )
(1) 指定連接那個數據庫: select index_

(2) 將 key1 移動到另一個數據庫: move key1 index_

  1. R edis 事務 : 事務中,所有命令都會串行執行,事務執行期間, redis 不會爲其它的客戶端提供服務,從而保證命令原子化執行 。 Redis 命令在事務中可能會執行失敗,但是 Redis 事務不會回滾,而是繼續會執行餘下的命令。這裏和關係型數據庫有點區別,因爲關係型數據在這種情況下都是會回滾的;在 multi 之後的事務語句,都會將事務放進隊列,這是會檢查語法等,也就是在事務執行期間語法都是沒有問題的,命令出錯的話就是程序有問題, redis 不會因爲一條錯誤而設計成回滾,降低存儲效率來彌補程序本身的錯誤 。redis 使用的是串行化隔離機制,串行化機制規定事務的提交必須有序的,如果一個事務打開了,未提交事務或者回滾事務,另外開啓一個事務的話,必須等待前一個事務處理完數據,才能處理數據,否則後面這個事務不能處理數據,所以後提交的數據時會出現鎖爲獲取或者未獲取鎖無法提交等等錯誤。

(1) 開啓事務: multi

(2) 提交事務: exec

(3) 回滾事務: discard

Redis 的持久化 :

redis 的高性能是因爲所有的數據都是保存在內存中。爲了保存數據不被丟失,就需要對數據進行持久化。

RDB 方式: 默認支持、不需要配置 , 在指定的時間間隔內,將內存中的數據集快照寫入磁盤 。
AOF 方式: 以日誌的方式,記錄服務器所處理的每一個操作,在 redis 啓動的時候會讀取該文件,來重新構建數據庫,保證啓動後數據庫中的數據是完整的 。
不持久化 : 通過配置禁用 redis 持久化的功能,這樣 redis 只是一個緩存的工具
可以 RDE 、 AOF 結合使用。
RDB :
優勢:
1 、 redis 的數據庫只包含一個文件,對於文件備份來說很完美

2 、備份: 如 每個小時歸檔一次最近 24 小時的數據,同時每天歸檔一次最近 30 天的數據,那麼當系統出現災難性故障的時候,可以恢復(對於災難恢復來說 RDB 是非常好的選擇,可以將一個單獨的文件壓縮後轉移到其他的存儲介質上)

3 、性能最大化:對於 redis 進程而言,在開始持久化的時候,它唯一需要做的是 分叉處 一些子進程,之後的由子進程完成這些持久化的工作,極大的避免服務器進程執行 IO 操作

4 、與 AOF 相比優勢:啓動效率更高

劣勢:
1 、想保證數據的高可用性(最大限度避免數據的丟失),那 RDB 不是一個很好的選擇(如果系統在定時持久化之前發生故障,那麼數據還沒來得及往磁盤上寫,數據就已經丟失了)

2 、子進程協助完成持久化,因此當數據集很大的時候,可能會導致服務器停止幾百毫秒

配置:
redis 默認使用 RDB 方式持久化 , 配置文件爲 redis.conf(window 下爲 redis.windows-service.conf)

save 900 1:表示 每 900 秒至少一個 key 發生變化,就保存一次
save 300 10: 表示每 300 秒至少有 10 個 key 發生變化,就保存一次
save 60 10000: 表示每 60 秒至少有 10000 個 key 發生變化,就保存一次
dbfilename dump.rdb:表示存儲數據的文件名
dir ./ :表示數據的存儲路徑
AOF
優勢:
1 、更高的數據安全性 。同步策略:每秒同步,每修改同步、不同步。每秒同步:異步完成,效率高,系統出現宕機,那麼這一秒中修改的數據就會丟失;每修改同步:可以看作同步持久化,麼一次發生數據的變化,都會立即寫到磁盤當中,效率低,但是最安全

2 、對日誌文件的寫入操作,採用的是追加模式( append ),因此在寫入過程中,即使出現了宕機的情況,也不會破壞日誌文件中已經存在的內容。如果本次寫入進行到一半就出現宕機,那麼這種方式也不必擔心, redis 在下一次啓動之前,可以通過 redis-check-aof 這個工具,幫助我們解決數據一致性的問題

3 、如果日誌過大, redis 可以自動啓動重寫機制, redis 以 append 模式不斷的將修改的數據寫入到老的磁盤文件當中,同時 redis 會創建一個新的文件,用於記錄此期間產生的哪些修改命令被執行。因此,在進行重寫切換的時候,可以更好的去保證數據的安全性

4 、 AOF 包含一個格式清晰易於理解的日誌文件用於記錄所有的修改操作,也可以通過這個文件完成數據的重建

劣勢
1 、對於相同數量的數據集而言, AOF 的文件要比 RDB 的文件大一些

2 、根據同步策略的不同, AOF 在效率上往往低於 RDB

配置:
redis 配置文件爲 redis.conf(window 下爲 redis.windows-service.conf)

打開 AOF : appenddonly yes
日誌文件名稱: appendfilename “appendonly.aof”
設置同步策略:每秒同步 - appendfsync always; 每修改同步 - appendfsync everysec; 不同步 - appendfsync no;
AOF 下的 Redis 持久化 :啓動後, 插入一些數據後,通過 flushall 清空數據庫 , 然後關閉 redis ,重新啓動 redis 之前,修改 日誌文件 配置文件,將最後一行的 flushAll 刪除,並保存 , 然後重啓 redis

需要java學習路線圖的私信筆者“java”領取哦!另外喜歡這篇文章的可以給筆者點個贊同,關注一下,每天都會分享Java相關文章!還有不定時的福利贈送,包括整理的學習資料,面試題,源碼等~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章