redis的使用

簡介

這裏寫圖片描述

一、爲什麼使用

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

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

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

二、優點:

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

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

三、適用場景:

數據高併發的讀寫

海量數據的讀寫

對擴展性要求高的數據

四、不適場景:

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

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

五、Redis結構:

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

六、使用場景:

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

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

分佈式架構,做session共享

可以持久化特定數據。

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

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

七、Linux下redis:

redis目錄:usr/local/bin

linux下redis常用命令:

redis-benchmark:性能測試工具

redis-server:啓動redis服務器

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

八、Redis基礎知識

端口:6379

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

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

Memchached:多線程+鎖

redis數據類型:String set list hash zset

九。基本操作

1.0開啓服務

在redis目錄下的cmd窗口執行

redis-server.exe redis.windows.conf

開啓redis服務,監聽6379端口

2.執行指令(增刪改查)

再開一個窗口同樣在redis目錄下,如果設置了環境變量就直接運行

redis-cli

啓動客戶端口 再輸入auth 密碼 或者在上面的代碼後面加 -a 密碼就可以直接進入客戶端了
驗證是否成功:執行指令

ping

返回 PONG則完成

注意操作前先選定使用哪個庫

seclect num

更多操作命令和釋義可以參考:http://redis.cn/commands.html

@字符串的操作

set name bill //設置鍵值
setex name 20 bill //鍵值20秒後過期   --ttl name方法可以查看值還剩餘多少秒纔會過期
mset age 60 gender male //一次性存儲多個鍵值
get name //不存在則返回null (獲取該key的value)  
mget name age //一次性拿取多個鍵值 (查看多個value)
incr/decr age //將age加減1
incrby/decrby age 20 //將age加減20
append name gates //向原有value追加內容
strlen key //獲取值長度

@key鍵操作舉例

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

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

keys * //顯示所有鍵,慎用,數據量大時導致卡死
keys a* // 顯示所有以a開頭的鍵
exists name age //判斷name和age這兩個鍵存在幾個
type name //查看值的類型
del name age //刪除鍵
expire name 30 //name鍵值30秒過期
ttl name //查看鍵值的過期時間(-2表示已經過去   -1是永久存在)
persist name // 取消鍵的過期時間
rename name nickname // 重命名鍵(這樣做不安全,容易覆蓋已有數據)
renamenx name nickname // 確保不會覆蓋其它鍵才重命名(nx=not exists,x後綴=exists)

@哈希hash操作舉例

  • hash是將多個字段和值存儲在一個鍵中,類似對象
  • 鍵值對集合,類似map<String,Object>
hset p1 name bill // 設置p1對象的name爲bill
hset p1 age 18 // 設置p1對象的age爲18
hmset p2 name jobs age -1 //設置p2對象的name爲jobs,age爲-1
hget p1 name // 獲取p1的name屬性值
hmget p1 name age // 同時獲取p1的name和age
hgetall p1 // 獲取p1的全部字段和值
hkeys p1 // 獲取p1的全部字段
hvals p1 // 獲取p1的全部字段值
hlen p1 // 獲取p1中所有字段數(鍵值對的個數)
hexists p1 name // 判斷p1中是否有name字段
hdel p1 name // 刪除p1中的name字段
hdel p2 name age // 刪除p2中的name和age字段
hstrlen p1 age // p1中的age的長度

@列表list操作舉例

  • 在redis中也稱隊列,可按下標獲取元素,也可從頭尾彈出或放入
  • 單鍵多值
  • Redis列表是簡單的字符串列表,從左或者從右插入
  • 底層是雙向鏈表,對兩端的操作性能很高,通過下標查詢性能很低

       `lpush mlist 2 // 從左側向列表mlist追加元素2
        rpush mlist 3 // 從右側向列表mlist追加元素3
        linsert mlist after 3 4 // 在列表mlist中3的後邊追加元素4
        lset mlist 1 200 // 設置列表mlist中的第1個元素爲200(下標從0開始)
        lrange mlist 0 3 // 查看列表mlist中下標[0到3]的元素
        lrange mlist 0 -1 //從頭看到尾
        lpop mlist // 從列表左側彈出一個值
        rpop mlist // 從列表右側彈出一個值
        ltrim mlist 0 1 // 修剪掉mlist下標[0,1]以外的元素
        llen mlist // 列表元素個數
        lindex mlist 0 // 獲取mlist中下標0的元素
        `
    

@集合set操作舉例

  • 無序元素集,經常用於求交集、並集、差集等;
  • 類似list的無序集合,保證列表中不會有重複數據,底層是一個value爲null的hash表
sadd mset 1 2 3 4 // 向集合mset中添加元素1,2,3,4
smembers mset // 查看集合mset中的元素
scard mset // 查詢集合元素個數
sinter mset mset2 //求mset和mset2的交集
sdiff mset mset2 //求mset相比mset2的差集(mset有而mset2無的部分)
sunion mset mset2 // 求mset和mset2的並集
sismember mset 3 //判斷3是否是mset中的元素

@有序集合zset

  • 可按權重對元素進行排列;
  • 與set集合非常相似,每個成員都關聯了score,可以用來排序
zadd mzset 10 bill 9 jobs 6 jackma // 添加多個值及相應權重
zrange mzset 0 -1 // 返回第一個到最後一個之間所有的元素,按權重升序排列
zcard mzset // 元素個數
zcount mzset 6 10 // 權重6-10之間的元素個數
zscore mzset jackma // 返回 jackma在mzset中的權重

十、redis持久化:

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

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

  • ①持久化過程:redis單獨創建(fork)一個進程來持久化,會先將數據寫入臨時文件中,待上次持久化結束後,會將該臨時文件替換上次持久化文件,比aof高效,但是最後一次數據可能會丟失
  • ②Fork:在linux中,fork()會產生一個跟主進程一樣的子進程,出於效率考慮,主進程和子進程會公用一段物理內存,當發生改變的時候,纔會把主進程“”寫時複製”一份給子進程
  • ③Redis備份的文件:在redis.conf中設置,dbfilename默認爲:dump.rdb
  • ④ Rdb保存策略:
900s 1 file change

300s 10file change

60s 10000file change

⑤Rdb的備份:

  • config get dir 得到備份的文件夾

    複製備份文件

⑥Rdb恢復:

  • 關閉redis

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

    啓動redis,自動加載

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

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

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

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

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

RDB和AOF對比

節省磁盤空間

恢復速度快

RDB優點:

ROD缺點:

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

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

c) AOF優點:

i. 備份機制更加穩健

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

d) AOF缺點:

i. 比RDB更佔磁盤

ii. 備份速度較慢

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

RDB和AOF哪個好

官方推薦都啓用

對數據不敏感,單獨用RDB

不建議單獨使用AOF

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

十一、Redis事務:

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

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

  • 悲觀鎖:每次拿到數據的時候都會上鎖,或者等待別人處理完再去拿鎖,傳統的關係型數據庫裏邊很多用到了這種鎖機制,比如行鎖、表鎖、讀鎖、寫鎖
  • 樂觀鎖:每次拿數據的時候總認爲別人不會修改數據,所以不會上鎖。但是更新的時候回去判斷別人有沒有更改數據,使用版本號機制。樂觀鎖適用於多讀的應用類型,可以提高吞吐量。
  • Redis使用樂觀鎖:redis就是利用check-and-set機制實現事務

三大特性:

  • 單獨的隔離操作:事務中的所有命令都會序列化,按順序執行。不會被其他客戶端打斷
  • 沒有隔離級別概念:隊列中的命令沒有提交之前不會被執行,事務外不能查看事務內的更新
  • 不能保證原子性:跳過錯誤,依舊執行,沒有回滾

十二、Redis訂閱/發佈:

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

十三、Redis主從複製:

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

用處:

讀寫分離,性能拓展。

容災快速恢復

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

拷貝多個redis.conf文件

開啓daemonize yes

Pid文件名字

指定端口

Log文件名字

Dump.rdb名字

Appendonly 關掉或者換名字

十四、Jedis:

所需jar包:

common-pool-1.6jar包

jedis-2.1

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

十五、集羣分佈:

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

配置conf文件:

拷貝多個redis.conf文件

開啓daemonize yes

Pid文件名字

指定端口

Log文件名字

Dump.rdb名字

Appendonly 關掉或者換名字

配置cluster文件:

cluster-enable yes 打開集羣模式

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

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

轉載自https://blog.csdn.net/u010986776/article/details/79796203
還有https://blog.csdn.net/u011277123/article/details/78692603

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