天天看點

介紹Redis的各種用途以及使用場景

介紹Redis的各種用途以及使用場景

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檔案:
  2. 配置cluster檔案:
    1. cluster-enable yes 打開叢集模式
    2. cluster-config-file xxx.conf 設定生成的節點配置檔案名
    3. cluster-node-timeout 15000設定節點失聯時間,超多該時間(毫秒),叢集自動進入主從切換
    4. 原文位址https://blog.csdn.net/weixin_42786143/article/details/81205453