Redis入門

點擊圖片領取阿里云云產品幸運券

NoSql概述

爲什麼需要NoSql?

  • 高併發讀寫
  • 海量數據的高效率存儲和訪問
  • 高可擴展性和高可用性

NoSql數據庫的四大分類

  • 鍵值(Key-Value)存儲
  • 列存儲
  • 文檔數據庫
  • 圖形數據庫

四種NoSQL數據庫比較

NoSql的特點

  • 易擴展
  • 靈活的數據模型
  • 大數據量,高性能
  • 高可用

Redis概述

  • 高性能鍵值對數據庫
    支持的鍵值數據類型:字符串類型、散列類型、列表類型、集合類型、有序集合類型
  • Redis常用場景:緩存、任務隊列、網站訪問統計、數據過期處理、應用排行榜
  • 分佈式集羣架構中的session分離

Jedis介紹

Jedis是Redis 官方首選的java客戶端開發包

GitHub地址爲:http://github.com/xetorthio/jedis

maven倉庫地址:https://mvnrepository.com/artifact/redis.clients/jedis

Redis的數據結構

五種數據類型

  • 字符串(string)
  • 哈希(hash)
  • 字符串列表(list)
  • 字符串集合(set)
  • 有序字符串集合(sorted set)

常用的是字符串和哈希

Key的定義注意點:不要過長、不要過短、統一的命名規範

存儲string

  • 賦值命令: set company imooc
  • 取值命令: get company結果爲imooc
  • 取值再賦值命令:getset key value就是先獲得key對應的值後更改key值爲value
    例子:getset company baidu``,結果爲imooc,然後get company“`,結果爲baidu
  • 刪除命令:del key刪除key
    例子:先set person jackdel person 返回數字1,鍵爲person的kv被刪除;如果再執行get person,結果:爲nil,代表不存在
  • 遞增命令:incr key將指定的key值增加1;如果key不存在,先添加key的值爲0,再增加1;key值存在時必須爲整型整數,否則會報錯(error) ERR value is not an integer or out of range
    例子:incr num,num不存在時執行後num爲1
  • 遞減命令:decr key將指定的key值減少1;如果key不存在,先添加key的值爲0,再減少1;同樣key值必須爲整型整數
    例子:decr num2,num2不存在時執行後num2爲-1
  • 指定步長的遞增命令:incrby key step將指定的key值增加指定整數大小step;如果key值不存在,會想添加key值爲0,再增加指定的整數大小step
  • 指定步長的遞減命令:decrby key step將指定的key值減少指定整數大小step;如果key值不存在,會想添加key值爲0,再減少指定的整數大小step
  • 追加命令:append key append_value將指定的key值後追加指定的值(相當於將原key值和追加的值連接成新的值);如果key值不存在,會先添加key值爲空字符串,再追加

存儲hash

String key和String value的map容器,每一個Hash可以存儲4294967295個鍵值對

  • 賦值命令:hset key field value
    例子:hset myhash username jackhset myhash age 18,其中myhash就是key,而username 和age都是字段名稱,而後面的值jack和18就是對應字段裏的值。
  • 批量賦值命令:hmset key field1 value1 field2 value2 ...
    例子:hmset myhash2 username joe age 18,myhash2中有兩個字段,username值爲joe和age值爲18
  • 取值命令:hget key field,獲取指定hash類型key中名爲filed的字段對應的值
    例子:hget myhash username,結果爲jack
  • 批量取值命令:hmget key field1 field2 ...獲取指定的hash類型key中字段field1、field2…等字段中的值
  • 取全部值命令:hgetall key獲取hash類型key中的全部字段和值信息
  • 批量刪除字段命令: hdel key field1 field2 ...刪除hash類型key中field1、field2等字段的
  • 刪除鍵值命令:del key刪除這個key值對
  • 指定步長的遞增命令:hincrby key filed step將指定的hash類型key中的字段field增加指定整數大小step;如果key不存在或者key中filed不存在,會想添加filed值爲0,再增加指定的整數大小step
  • 判斷指定字段是否存在命令:hexists key filed如果存在,返回1,不存在返回0
  • 獲取key值中鍵值對個數:hlen key返回hash類型key中鍵值對的個數
  • 獲取全部屬性名命令:hkeys key返回hash類型key中全部的屬性名
  • 獲取全部屬性值命令:hvals key返回hash類型key中全部的屬性值

存儲list

  • ArrayList使用數組方式
  • LinkedList使用雙向鏈接方式
  • 雙向鏈表中增加數據
  • 雙向鏈表中刪除數據

存儲list常用命令:

兩端添加、查看列表、兩端彈出、獲取列表元素個數、擴展命令

  • 左端批量添加命令:lpush key value1 value2 ...
    例子:lpush mylist3 a b c 1 2 3
  • 查看命令:lrange key start stop
    例子:lrange mylist3 0 5,結果就是 3 2 1 c b a,當然也可以這樣取值 lrange mylist3 0 -1 (-1表示從左端第0爲開始到右端數的第一個數結束),結果和上面還是一樣的。0代表第一個元素,而-1 代表最後一個元素。
  • 左端彈出命令:lpop key移出並獲取列表的第一個元素
  • 查看列表長度:llen key獲取列表長度
  • 僅當存在時,左端添加命令:lpushx key value
  • 從某端刪除指定個數的指定值命令:lrem key count valuekey爲list,count絕對值爲要刪除的個數,value爲要刪除的元素值,count的符合表示刪除方向(正數:和命令一直的方向開始(左端),負數:和命令相反的方向開始(右端));特別的,當count爲0時表示刪除其中值爲value的全部元素
  • 指定位置重置值:lset key index value將指定索引位置上的值設置爲value;但index爲正數時表示從左端開始,index爲負數時表示從右端開始
  • 指定位置插入指定值:linsert key before|after element_value value左端起第一個爲element_value的元素前面或者後面添加值value。
  • 彈出再壓入命令:rpoplpush key1 key2將key1的最右端元素彈出,並壓入到key2的最左端

存儲set

和list類型不同的是,set集合中不允許出現重複的元素;set可包含的最大元素數量是4294967295

存儲set常用命令:添加/刪除元素、獲得集合中的元素、擴展命令、集合中的差集運算、集合中的交集運算、集合中並集運算

  • 添加命令:sadd key value1 value2 ...向key中添加元素value1、value2等
    例子:sadd myset a b c結果爲 3
  • 刪除命令:srem key value1 value2 ...刪除集合key中的元素value1、value2等
    例子:srem myset a b結果就是:c
  • 判斷元素是否存在命令:sismember key value存在返回1,不存在返回0
    例子:sismember myset a返回0,經過上面的操作,集合中不包含a
  • 顯示集合中所有元素命令:smembers key
  • 顯示集合中成員數量命令:scard key
  • 隨機取集合中指定個數的元素命令:srandmember key [count]不指定count時默認爲1
  • 差集運算:sdiff key1 key2 ...在集合key1中但不再集合key2中的元素(結果和key的順序有關
  • 交集運算:sinner key1 key2 ...集合key1、key2等都有的元素
  • 並集運算:sunion key1 key2 ...
  • 差集另存到新集合:sdiffstore storekey key1 key2 ...將集合key1、key2等的差集結果存儲到集合storekey中;如果集合storekey中原本存在元素,會被全部移出後添加差集結果
  • 交集另存到新集合:sinterstore storekey key1 key2 ...
  • 並集另存到新集合:sunionstore storekey key1 key2 ...

存儲set使用場景

  • 跟蹤一些唯一性數據
  • 用於維護數據對象之間的關聯關係

存儲sorted-set

添加元素、查詢元素、刪除元素、範圍查詢、擴展命令

  • 添加命令:zadd key score1 member1 score2 member2 ...
  • 獲取元素分數:zscore key member
  • 獲取元素和數:zcard key
  • 刪除元素:zrem key member1 member2 ...
  • 範圍查詢:zrange key start stop [withscores]帶withscores參數時連帶輸出分數,輸出結果按照分數從小到大排列;從大到小排列,使用命令zrevrange
  • 按照分數範圍查詢:zrangebyscore key lowscore highscore [withscores] [limit offset count]limit控制輸出個數
    例子:zrange setname 0 -1當stop爲-1時輸出全部的元素
  • 範圍刪除:zremrangebyrank key start stop將刪除到指定範圍內的元素
  • 按照分數範圍刪除:zremrangebyscore key lowscore highscore
  • 給指定屬性的分數增加指定數目:zincrby key increment member
  • 某個分數段中元素個數:zcount key lowscore highscore

Redis的keys通用操作

  • keys pattern查看指定特徵的key
    例子:keys *查看全部的key
       keys name?查看名以name爲前綴的key
  • del key1 key2刪除某些key
  • exists key1 key2查看key是否存在 返回0是存在,1不存在
  • rename key1 key2將key1重命名爲key2
  • expire key seconds爲key設置過期時間
  • TTL key以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)
  • type key查看key的類型

Redis特性

  • 相關特性
  • 多數據庫
  • redis事務

多數據庫

  • 共16個數據庫(0到15),默認選擇0號數據庫
  • select db_index選擇使用哪一個數據庫
  • move key db_index將當前數據庫中的key移動到指定的數據庫中db_index

redis事務

redis事務執行過程中,全部的命令串行化執行,並且停止向其他客戶端提供服務,以保證事務的原子性。

事務的執行

  • multi:標記一個事務塊的開始
  • exec:執行所有事務塊內的命令
  • discard:取消事務,放棄執行事務塊內的所有命令

Redis持久化

  • RDB方式
  • AOF方式

持久化使用方式

RDB持久化(快照)、AOF持久化(日誌)、無持久化、同時使用RDB和AOF

RDB

  • 優勢
    RDB 是一個非常緊湊(compact)的文件,它保存了 Redis 在某個時間點上的數據集。 這種文件非常適合用於進行備份: 比如說,你可以在最近的 24 小時內,每小時備份一次 RDB 文件,並且在每個月的每一天,也備份一個 RDB 文件。 這樣的話,即使遇上問題,也可以隨時將數據集還原到不同的版本。RDB 非常適用於災難恢復(disaster recovery):它只有一個文件,並且內容都非常緊湊,可以(在加密後)將它傳送到別的數據中心,或者亞馬遜 S3 中。RDB 可以最大化 Redis 的性能:父進程在保存 RDB 文件時唯一要做的就是 fork 出一個子進程,然後這個子進程就會處理接下來的所有保存工作,父進程無須執行任何磁盤 I/O 操作。RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。
  • 劣勢
    如果你需要儘量避免在服務器故障時丟失數據,那麼 RDB 不適合你。 雖然 Redis 允許你設置不同的保存點(save point)來控制保存 RDB 文件的頻率, 但是, 因爲RDB 文件需要保存整個數據集的狀態, 所以它並不是一個輕鬆的操作。 因此你可能會至少 5 分鐘才保存一次 RDB 文件。 在這種情況下, 一旦發生故障停機, 你就可能會丟失好幾分鐘的數據。每次保存 RDB 的時候,Redis 都要 fork() 出一個子進程,並由子進程來進行實際的持久化工作。 在數據集比較龐大時, fork() 可能會非常耗時,造成服務器在某某毫秒內停止處理客戶端; 如果數據集非常巨大,並且 CPU 時間非常緊張的話,那麼這種停止時間甚至可能會長達整整一秒。 雖然 AOF 重寫也需要進行 fork() ,但無論 AOF 重寫的執行間隔有多長,數據的耐久性都不會有任何損失

AOF

  • 優勢
    使用 AOF 持久化會讓 Redis 變得非常耐久(much more durable):你可以設置不同的 fsync 策略,比如無 fsync ,每秒鐘一次 fsync ,或者每次執行寫入命令時 fsync 。 AOF 的默認策略爲每秒鐘 fsync 一次,在這種配置下,Redis 仍然可以保持良好的性能,並且就算髮生故障停機,也最多隻會丟失一秒鐘的數據( fsync 會在後臺線程執行,所以主線程可以繼續努力地處理命令請求)。AOF 文件是一個只進行追加操作的日誌文件(append only log), 因此對 AOF 文件的寫入不需要進行 seek , 即使日誌因爲某些原因而包含了未寫入完整的命令(比如寫入時磁盤已滿,寫入中途停機,等等), redis-check-aof 工具也可以輕易地修復這種問題。Redis 可以在 AOF 文件體積變得過大時,自動地在後臺對 AOF 進行重寫: 重寫後的新 AOF 文件包含了恢復當前數據集所需的最小命令集合。 整個重寫操作是絕對安全的,因爲 Redis 在創建新 AOF 文件的過程中,會繼續將命令追加到現有的 AOF 文件裏面,即使重寫過程中發生停機,現有的 AOF 文件也不會丟失。 而一旦新 AOF 文件創建完畢,Redis 就會從舊 AOF 文件切換到新 AOF 文件,並開始對新 AOF 文件進行追加操作。AOF 文件有序地保存了對數據庫執行的所有寫入操作, 這些寫入操作以 Redis 協議的格式保存, 因此 AOF 文件的內容非常容易被人讀懂, 對文件進行分析(parse)也很輕鬆。 導出(export) AOF 文件也非常簡單: 舉個例子, 如果你不小心執行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫, 那麼只要停止服務器, 移除 AOF 文件末尾的 FLUSHALL 命令, 並重啓 Redis , 就可以將數據集恢復到 FLUSHALL 執行之前的狀態。
  • 劣勢
    對於相同的數據集來說,AOF 文件的體積通常要大於 RDB 文件的體積。根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB 。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。AOF 在過去曾經發生過這樣的 bug : 因爲個別命令的原因,導致 AOF 文件在重新載入時,無法將數據集恢復成保存時的原樣。 (舉個例子,阻塞命令 BRPOPLPUSH 就曾經引起過這樣的 bug 。) 測試套件裏爲這種情況添加了測試: 它們會自動生成隨機的、複雜的數據集, 並通過重新載入這些數據來確保一切正常。 雖然這種 bug 在 AOF 文件中並不常見, 但是對比來說, RDB 幾乎是不可能出現這種 bug 的。

linux下搭建redis教程:http://download.csdn.net/detail/sinat_27406925/9873195

轉載自:Redis簡單入門


點擊圖片領取阿里云云產品幸運券

發佈了52 篇原創文章 · 獲贊 105 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章