redies用途和使用場景

Redis

一、爲什麼使用

  1. 解決應用服務器的cpu和內存壓力

  2. 減少io的讀操作,減輕io的壓力

  3. 關係型數據庫的擴展性不強,難以改變表結構

二、優點:

  1. nosql數據庫沒有關聯關係,數據結構簡單,拓展表比較容易

  2. nosql讀取速度快,對較大數據處理快

三、適用場景:

  1. 數據高併發的讀寫

  2. 海量數據的讀寫

  3. 對擴展性要求高的數據

四、不適場景:

  1. 需要事務支持(非關係型數據庫)

  2. 基於sql結構化查詢儲存,關係複雜

五、Redis結構:

Redis是一個開源的key—value型數據庫,支持string、list、set、zset和hash類型數據。對這些數據的操作都是原子性的,redus爲了保證效率會定期持久化數據。

六、使用場景:

  1. 配合關係型數據庫做高速緩存

  • 緩存高頻次訪問的數據,降低數據庫io

  • 分佈式架構,做session共享

  1. 可以持久化特定數據。

  • 利用zset類型可以存儲排行榜

  • 利用list的自然時間排序存儲最新n個數據

七、Linux下redis:

  1. redis目錄:usr/local/bin

  2. linux下redis常用命令:

  1. redis-benchmark:性能測試工具

  2. redis-server:啓動redis服務器

  3. redis-cli:啓動redis客戶端,操作入口

八、Redis基礎知識

  1. 端口:6379

  2. 默認16個數據庫,下標從0開始

  3. 單線程:redis是單線程+io多路複用:檢查文件描述的就緒狀態

Memchached:多線程+鎖

  1. redis數據類型:String set list hash zset

九、Redis命令:

  1. key操作

keys *查看當前庫所有的鍵
exists <key>判斷是否存在key
del <key>刪除某個鍵
expire <key> <second>設置鍵過期時間 單位是s秒
ttl <key>查看還有多少秒過期 -1表示用不過期 -2表示已經過期
move <key> <db>把鍵移到另一個庫下
dbsize查看數據庫key的數量
flushdb清空當前庫
flushall通殺所有庫
  1. String類型:String是二進制安全的,可以包含任何數據源,最大512m

get <key>查看對應的鍵值
set <key> <value>添加鍵值對
append <key> <value>將給定的value 追加到原值的末尾
strlen < key >獲取值得長度
setnx <key> <value>當key 不存在的時候設置key值
incr <key>將key中儲存的數字加1,如果爲空,則值爲1
decr <key>將key中儲存的數字減1,如果爲空,則值爲-1
incrby/decrby <key> <步長>將key中的數字增減

String批量處理:

mset <key1> <value1> <key2> <value2>同時設置多個鍵值對
mget <key1> <key 2>同時獲得多個值
msetnx <key1> <value1> <key2> <value2>當給定的key都不存在
getrange <key> <start> <stop>類似sunstring
setrange <key> <start> <stop>類似sunstring覆蓋原始值
setex <key> <過期時間> <value>設置鍵值的同時,給定過期時間
getset <key> <value>以舊換新,設置了新的值同時得到舊值
  1. List:鏈表

1、特點:

單鍵多值

Redis列表是簡單的字符串列表,從左或者從右插入

底層是雙向鏈表,對兩端的操作性能很高,通過下標查詢性能很低

lpush/rpush <key> <value1> <value2> ..從左或從右插入多個值
lpop/rpop <key>從左邊或右邊吐出一個值,值光鍵亡
rpoplpush <key1> <key2>從key1 右邊吐出一個值到key2的左邊
lrange <key> <index>按照索引下標獲取元素 從左到右
lindex <key> <index>按照索引下標獲取元素 從左到右
llen <key> 獲取列表長度獲取列表長度
linsert <key> before <value> <newvalue>在key中value前插入newvalue
  1. Set:類似list的無序集合,保證列表中不會有重複數據,底層是一個value爲null的hash表

sadd <key> <value1> <value2>將多個元素加入到key中,重複值忽略
smembers <key>取出該集合的所有值
sismember <key> <value>判斷集合key中是否有該value值 有就1 沒有0
scard <key>返回該集合的元素個數
srem <key> <value1> <value2>刪除集合中的某個元素
spop <key>隨機吐出該集合一個值
srandmember <key> <n>隨機從集合中取出n個值,不會從集合中刪除
smove <key1> <key2> <value>將key1中的value 移動到key2 中
sinter <key1> <key2>返回兩個集合的交集元素
sunion <key1> <key2>返回兩個集合的並集
  1. hash:鍵值對集合,類似map<String,Object>

hset <key> <filed> <value>給key 集合中的file 鍵賦值value
hget <key1> <field>從key1 集合file取出value
hmset <key1> <field1> <value1> <field2> <value2>批量設置hash的值
hexists <key> <field>查看key中的field 是否存在
hkeys <key>列出key中所有的filed
hvals <key>列出該hash集合中所有的value
  1. zset:與set集合非常相似,每個成員都關聯了score,可以用來排序

zadd<key><score1><value1><score2><value2>將一個或多個元素以及score加入zset
zrange<key><start><stop> withscore返回下標在區間內的集合,帶有score
zrangebyscore <ket> <min> <max>[withscore] [limit offset count]返回key中 score介於min和max中的成員,升序排列
zrevrangerbyscore <key> <min> <max> [withscore] [limit offset count]降序
zincrby <key> <increment> <value>在key集合中的value上增加increment
zrem <key> <value>刪除key集合下的指定元素
zcount <key> <min><max>統計 區間內的元素個數
zcord <key>獲取集合中的元素個數
zrank <key><value>查詢value在key中的排名,從0開始

十、redis持久化:

  1. 兩種方式:rdb(redis database)和aof(append of file)

  2. RDB:在指定時間間隔內,將內存中的數據作爲一個快照文件(snapshot)寫入到磁盤,讀取的時候也是直接讀取snapshot文件到內存中

①持久化過程:redis單獨創建(fork)一個進程來持久化,會先將數據寫入臨時文件中,待上次持久化結束後,會將該臨時文件替換上次持久化文件,比aof高效,但是最後一次數據可能會丟失

②Fork:在linux中,fork()會產生一個跟主進程一樣的子進程,出於效率考慮,主進程和子進程會公用一段物理內存,當發生改變的時候,纔會把主進程“”寫時複製”一份給子進程

③Redis備份的文件:在redis.conf中設置,dbfilename默認爲:dump.rdb

④ Rdb保存策略:


    1. 900s 1 file change

    2. 300s 10file change

    3. 60s 10000file change


⑤Rdb的備份:


    1. config get dir 得到備份的文件夾

    2. 複製備份文件


⑥Rdb恢復:


    1. 關閉redis

    2. 將備份文件複製到工作目錄下

    3. 啓動redis,自動加載


  1. AOF : 以日誌形式記錄每個寫操作,啓動時通過日誌恢復操作

    1. 開啓AOF:默認不開啓,進入redis.conf找到appendonly yes打開

    2. 修復AOF:redis-check-aof –fix appendonly.aof

    3. 同步頻率:每秒記錄一次,如果宕機該秒記可能失效

    4. Rewrite:bgrewriteaof 因爲日誌是追加方式,文件會越來越大,當超過了設置的閾值時,日誌文件會壓縮,保留僅可以恢復的日誌


  2. RDB和AOF對比


    1. 節省磁盤空間

    2. 恢復速度快

    3. RDB優點:


    1. ROD缺點:


    1. 數據太大時,比較消耗性能

    2. 一段時間保存一次快照,宕機時最後一次可能沒有保存



c) AOF優點:

i. 備份機制更加穩健

ii. 可讀的日誌文件,通過aof恢復更加穩健,可以處理失誤

d) AOF缺點:

i. 比RDB更佔磁盤

ii. 備份速度較慢

    1. iii每次都同步日誌,有性能壓力


  1. RDB和AOF哪個好

    1. 官方推薦都啓用

    2. 對數據不敏感,單獨用RDB

    3. 不建議單獨使用AOF

    4. 若作爲純緩存使用,可以都不開啓


十一、Redis事務:輸入multi,輸入的命令都會依次進入到隊列中,但不會執行,直到輸入exec,redis會將之前命令隊列中的命令依次執行,通過discard可以放棄組隊。

  1. 主要作用:序列化操作,串聯多個命令防止別的命令插隊

  2. 悲觀鎖:每次拿到數據的時候都會上鎖,或者等待別人處理完再去拿鎖,傳統的關係型數據庫裏邊很多用到了這種鎖機制,比如行鎖、表鎖、讀鎖、寫鎖

  3. 樂觀鎖:每次拿數據的時候總認爲別人不會修改數據,所以不會上鎖。但是更新的時候回去判斷別人有沒有更改數據,使用版本號機制。樂觀鎖適用於多讀的應用類型,可以提高吞吐量。

  4. Redis使用樂觀鎖:redis就是利用check-and-set機制實現事務

  5. 三大特性:

    1. 單獨的隔離操作:事務中的所有命令都會序列化,按順序執行。不會被其他客戶端打斷

    2. 沒有隔離級別概念:隊列中的命令沒有提交之前不會被執行,事務外不能查看事務內的更新

    3. 不能保證原子性:跳過錯誤,依舊執行,沒有回滾


十二、Redis訂閱/發佈:

是進程中的一種消息通信模式,發送者pub發送消息,訂閱者sub接收消息 剩下的略。。。

十三、Redis主從複製:

  1. 是什麼:主從複製就是主機數據更新後根據配置和策略,自動同步到備份機的master/slaver機制,master寫爲主,slave讀爲主

  2. 用處:

    1. 讀寫分離,性能拓展。

    2. 容災快速恢復


  3. 配置服務器(配從不配主):

    1. 拷貝多個redis.conf文件

    2. 開啓daemonize yes

    3. Pid文件名字

    4. 指定端口

    5. Log文件名字

    6. Dump.rdb名字

    7. Appendonly 關掉或者換名字


十四、Jedis:

  1. 所需jar包:

    1. common-pool-1.6jar包

    2. jedis-2.1


  2. 獲取jedis對象:Jedis jedis = new Jedis(“ip” ,端口號);

十五、集羣分佈:

實現對redis的水平拓展,啓動n’的redis節點,將整個數據分佈在這n個節點中

  1. 配置conf文件:

    1. 拷貝多個redis.conf文件

    2. 開啓daemonize yes

    3. Pid文件名字

    4. 指定端口

    5. Log文件名字

    6. Dump.rdb名字

    7. Appendonly 關掉或者換名字


  2. 配置cluster文件:

    1. cluster-enable yes 打開集羣模式

    2. cluster-config-file xxx.conf 設置生成的節點配置文件名

    3. cluster-node-timeout 15000設置節點失聯時間,超多該時間(毫秒),集羣自動進入主從切換


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