Redis學習(1)-基本命令與持久化機制

docker簡單安裝設置密碼並開啓持久化

docker run -d --name myredis -p 6379:6379 redis --requirepass "156967" --appendonly yes

文檔

文檔學習

特性

  1. 速度快
    數據放內存中是速度快的主要原因、C語言實現,與操作系統距離近、使用了單線程架構,預防多線程可能產生的競爭問題
  2. 豐富的功能:value可以爲string、hash、list、set、zset等多種數據結構,可以滿足很多應用場景。還提供了鍵過期,發佈訂閱,事務,流水線。(流水線: Redis 的流水線功能允許客戶端一次將多個命令請求發送給服務器, 並將被執行的多個命令請求的結果在一個命令回覆中全部返回給客戶端, 使用這個功能可以有效地減少客戶端在執行多個命令時需要與服務器進行通信的次數)
  3. 高可用和分佈式:哨兵機制實現高可用,保證redis節點故障發現和自動轉移
  4. 鍵值對的數據結構服務器
  5. 持久化:發生斷電或機器故障,數據可能會丟失,可以持久化到硬盤通過(aof、rdb)
  6. 主從複製:實現多個相同數據的redis副本

使用場景

  1. 緩存:合理使用緩存加快數據訪問速度,降低後端數據源壓力
  2. 排行榜:按照熱度排名,按照發布時間排行,主要用到列表和有序集合
  3. 計數器應用:視頻網站播放數,網站瀏覽數,使用redis計數
  4. 社交網絡:贊、踩、粉絲、下拉刷新
  5. 消息隊列:發佈和訂閱

工具說明

可執行文件 作用
redis-server 啓動redis
redis-cli redis命令行客戶端
redis-benchmark 基準測試工具
redis-check-aof AOF持久化文件檢測和修復工具
redis-check-dump RDB持久化文件檢測和修復工具
redis-sentinel 啓動哨兵

數據類型

數據類型(String)

設值命令:
//10秒後過期  px 10000 毫秒過期
set age 23 ex 10
//不存在鍵name時,返回1設置成功;存在的話失敗0
setnx name test  
//存在鍵age時,返回1成功
set age 25 xx 
//存在則返回value, 不存在返回nil
獲值命令:get age 
// mset k v k v
批量設值:mset country china city beijing
//返回china  beigjin, address爲nil
批量獲取:mget country city address      

常用命令–字符串計數

incr age   //必須爲整數自加1,非整數返回錯誤,無age鍵從0自增返回1
decr age   //整數age減1
incrby age 2 //整數age+2
decrby age 2//整數age -2
incrbyfloat score 1.1 //浮點型score+1.1

常用命令–字符串追加

append追加指令:
    set name hello; append name world //追加後成helloworld
字符串長度:
   set hello “世界”;strlen hello         //結果6,每個中文佔3個字節
截取字符串:
   set name helloworld ; getrange name 2 4//返回 llo

數據類型(Hash)

哈希hash是一個String類型的field和value的映射表,hash特適合用於存儲對象

hmset user:1 name yakax age 18 設值
   命令  hset key field value
   設值:hset user:1 name yakax           //成功返回1,失敗返回0
   取值:hget user:1 name                 //返回yakax
   刪值:hdel user:1 age                  //返回刪除的個數
   計算個數:hset user:1 name yakax; hset user:1 age 23; 
             hlen user:1                  //返回2,user:1有兩個屬性值
   批量設值:hmset user:2 name yakax age 23 sex boy //返回OK
   批量取值:hmget user:2 name age sex    //返回三行:yakax 23 boy
   判斷field是否存在:hexists user:2 name         //若存在返回1,不存在返回0
   獲取所有field: hkeys user:2            // 返回name age sex三個field
   獲取user:2所有value:hvals user:2                    // 返回yakax 23 boy
   獲取user:2所有field與value:hgetall user:2    //name age sex yakax 23 boy值
   增加1:hincrby user:2 age 1                                  //age+1
          hincrbyfloat user:2 age 2       //浮點型加2

三種方案實現用戶信息存儲優缺點

  1. 原生:
    set user:1:name yakax;
    set user:1:age 23;
    set user:1:sex boy;
    優點:簡單直觀,每個鍵對應一個值
    缺點:鍵數過多,佔用內存多,用戶信息過於分散,不用於生產環境

  2. 將對象序列化存入redis
    set user:1 serialize(userInfo);
    優點:編程簡單,若使用序列化合理內存使用率高
    缺點:序列化與反序列化有一定開銷,更新屬性時需要把userInfo全取出來進行反序列化,更新後再序列化到redis

  3. 使用hash類型:
    hmset user:1 name yakax age 23 sex boy
    優點:簡單直觀,使用合理可減少內存空間消耗
    缺點:要控制ziplist與hashtable兩種編碼轉換,且hashtable會消耗更多內存serialize(userInfo);

內部編碼:ziplist<壓縮列表>和hashtable<哈希表>
當field個數少且沒有大的value時,內部編碼爲ziplist
如:hmset user:3 name yakax age 24; object encoding user:3 //返回ziplist
當value大於64字節,內部編碼由ziplist變成hashtable
如:hset user:4 address “fsgst64字節”; object encoding user:3 //返回hashtable

數據類型(List)

用來存儲多個有序的字符串,一個列表最多可存2的32次方減1個元素

添加命令:
 rpush yakax c b a    //從右向左插入cba, 返回值3
          lrange yakax 0 -1    //從左到右獲取列表所有元素 返回 c b a
          lpush key c b a        //從左向右插入cba
          linsert yakax before b teacher //在b之前插入teacher, after爲之後,使					                用lrange yakax 0 -1 查看:c teacher b a
查找命令:
 lrange key start end //索引下標特點:從左到右爲0到N-1
          lindex yakax -1 //返回最右末尾a,-2返回b
          llen yakax         //返回當前列表長度
          lpop yakax        //把最左邊的第一個元素c刪除
          rpop yakax        //把最右邊的元素a刪除

數據類型(Set)

用戶標籤,社交,查詢有共同興趣愛好的人,智能推薦,保存多元素,與列表不一樣的是不允許有重複元素,且集合是無序,一個集合最多可存2的32次方減1個元素,除了支持增刪改查,還支持集合交集、並集、差集;

 exists user       //檢查user鍵值是否存在
 sadd user a b c//向user插入3個元素,返回3
 sadd user a b  //若再加入相同的元素,則重複無效,返回0
 smember user //獲取user的所有元素,返回結果無序
 srem user a     //返回1,刪除a元素
 scard user       //返回2,計算元素個數

場景

標籤,社交,查詢有共同興趣愛好的人,智能推薦
使用方式:
給用戶添加標籤:
  sadd user:1:fav basball fball pq
  sadd user:2:fav basball fball   
或給標籤添加用戶
  sadd basball:users user:1 user:2
  sadd fball:users user:1 user:2
計算出共同感興趣的人:
  sinter user:1:fav user:2:fav

數據類型-有序集合(ZSet)

常用於排行榜,如視頻網站需要對用戶上傳視頻做排行榜,或點贊數與集合有聯繫,不能有重複的成員。

添加     鍵    分數  key 
ZADD page_rank 15 1223 
指令:   
   zadd key score member [score member......]
   zadd user:zan 200 yakax            //yakax的點贊數1, 返回操作成功的條數1
   zadd user:zan 200 yakax 120 mike 100 lee    // 返回3
   zadd test:1 nx 100 yakax                     //鍵test:1必須不存在,主用於添加
   zadd test:1 xx incr 200 yakax              //鍵test:1必須存在,主用於修改,此時爲300
   zadd test:1 xx ch incr -299 yakax       //返回操作結果1,300-299=1
   zrange test:1 0 -1 withscores   //查看點贊(分數)與成員名
   zcard test:1       //計算成員個數, 返回1
排名場景:
   zadd user:3 200 yakax 120 mike 100 lee      //先插入數據
   zrange user:3 0 -1 withscores              //查看分數與成員
  zrank user:3 yakax           //返回名次:第3名返回2,從0開始到2,共3名
  zrevrank user:3 yakax     //返回0, 反排序,點贊數越高,排名越前

差別
數據結構 是否允許元素重複 是否有序 有序實現方式 應用場景
列表 索引下標 時間軸,消息隊列
集合 標籤,社交
有序集合 分值 排行榜,點贊數

位圖-BitMaps

基於字符串的位操作的數據類型

set k1 a
獲取 value 在 offset 處的值(a 對應的 ASCII 碼是 97,轉換爲二進制數據是 01100001)
getbit k1 0
修改二進制數據(b 對應的 ASCII 碼是 98,轉換爲二進制數據是 01100010)
setbit k1 6 1
setbit k1 7 0
get k1
統計二進制位中 1 的個數
bitcount k1
獲取第一個 1 或者 0 的位置
bitpos k1 1
bitpos k1 0
BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 這四種操作中的任意一種參數:
BITOP AND destkey srckey1 … srckeyN ,對一個或多個 key 求邏輯與,並將結果保存到 destkey
BITOP OR destkey srckey1 … srckeyN,對一個或多個 key 求邏輯或,並將結果保存到 destkey
BITOP XOR destkey srckey1 … srckeyN,對一個或多個 key 求邏輯異或,並將結果保存到 destkey
BITOP NOT destkey srckey,對給定 key 求邏輯非,並將結果保存到 destkey

約數統計-Hyperloglogs

用最少的內存統計大數據量的數據

redis> PFADD  nosql  "Redis"  "MongoDB"  "Memcached"
(integer) 1
redis> PFADD  RDBMS  "MySQL" "MSSQL" "PostgreSQL"
(integer) 1
redis> PFMERGE  databases  nosql  RDBMS
OK
redis> PFCOUNT  databases
(integer) 6

地理位置-GEO

這個可以解決我們業務中用戶的點位設置,以及點位附近的其他用戶運算

redis> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"

Streams-Redis流

5.0 推出的數據類型。支持多播的可持久化的消息隊列,用於實現發佈訂閱功能,借鑑了 kafka 的設計。

全局命令

查看所有鍵:
  keys *
鍵總數 :
  dbsize         //2個鍵,如果存在大量鍵,線上禁止使用此指令
檢查鍵是否存在:
  exists key    //存在返回1,不存在返回0
刪除鍵:
  del key       //del hello school, 返回刪除鍵個數,刪除不存在鍵返回0
鍵過期:
  expire key seconds   //set name test  expire name 10,表示10秒過期
  ttl key              // 查看剩餘的過期時間
鍵的數據結構類型:
  type key      //返回string,鍵不存在返回none

數據庫命令

redis數據庫管理方式
select 0 切換數據庫
flushdb 清空當前庫
flushall 清空全部
dbsize 數據庫大小

持久化機制

redis是一個支持持久化的內存數據庫,也就是說redis需要經常將內存中的數據同步到磁盤來保證持久化,持久化可以避免因進程退出而造成數據丟失;

RDB持久化把當前進程數據生成快照(.rdb)文件保存到硬盤的過程,有手動觸發和自動觸發
   手動觸發有save和bgsave兩命令 
   save命令:阻塞當前Redis,直到RDB持久化過程完成爲止,若內存實例比較大會造成長時間阻塞,線上環境不建議用它
   bgsave命令:redis進程執行fork操作創建子線程,由子線程完成持久化,阻塞時間很短(微秒級),是save的優化,在執行redis-cli shutdown關閉redis服務時,如果沒有開啓AOF持久化,自動執行bgsave;
RDB

命令:config set dir /usr/local //設置rdb文件保存路徑
備份:bgsave //將dump.rdb保存到usr/local下
恢復:將dump.rdb放到redis安裝目錄與redis.conf同級目錄,重啓redis即可

  • 優點:
    壓縮後的二進制文,適用於備份、全量複製,用於災難恢復
    加載RDB恢復數據遠快於AOF方式

  • 缺點:
    無法做到實時持久化,每次都要創建子進程,頻繁操作成本過高
    保存後的二進制文件,存在老版本不兼容新版本rdb文件的問題

AOF

針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決
開啓:redis.conf設置:appendonly yes (默認不開啓,爲no)
默認文件名:appendfilename “appendonly.aof”

  • 所有的寫入命令(set hset)會append追加到aof_buf緩衝區中
  • AOF緩衝區向硬盤做sync同步
  • 隨着AOF文件越來越大,需定期對AOF文件rewrite重寫,達到壓縮
  • 當redis服務重啓,可load加載AOF文件進行恢復

    配置詳解
appendonly yes           //啓用aof持久化方式
# appendfsync always //每收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用
appendfsync everysec //每秒強制寫入磁盤一次,性能和持久化方面做了折中,推薦(默認)
no-appendfsync-on-rewrite  yes  //正在導出rdb快照的過程中,要不要停止同步aof
auto-aof-rewrite-percentage 100  //aof文件大小比起上次重寫時的大小,增長率100%時,重寫
auto-aof-rewrite-min-size 64mb   //aof文件,至少超過64M時,重寫
aof如何恢復-----------------------------------------
1. 設置appendonly yes;
2. 將appendonly.aof放到dir參數指定的目錄;
3. 啓動Redis,Redis會自動加載appendonly.aof文件。
因爲AOF的特性的原因,aof文件會越來越大,每次命令都是單獨記錄的所有redis提供了一個重寫操作
BGREWRITEAOF 
執行一個 AOF文件 重寫操作。重寫會創建一個當前 AOF 文件的體積優化版本。
即使 BGREWRITEAOF 執行失敗,也不會有任何數據丟失,因爲舊的 AOF 文件在 BGREWRITEAOF 成功之前不會被修改。

如果 AOF 文件出錯了,怎麼辦
服務器可能在程序正在對 AOF 文件進行寫入時停機, 如果停機造成了 AOF 文件出錯(corrupt), 那麼 Redis 在重啓時會拒絕載入這個 AOF 文件, 從而確保數據的一致性不會被破壞。

爲現有的 AOF 文件創建一個備份。
使用 Redis 附帶的 redis-check-aof 程序,對原來的 AOF 文件進行修復。
$ redis-check-aof --fix
可以使用 diff -u 對比修復後的 AOF 文件和原始 AOF 文件的備份,查看兩個文件之間的不同之處。
重啓 Redis 服務器,等待服務器載入修復後的 AOF 文件,並進行數據恢復
持久化順序

如果 AOF 文件出錯了,怎麼辦
服務器可能在程序正在對 AOF 文件進行寫入時停機, 如果停機造成了 AOF 文件出錯(corrupt), 那麼 Redis 在重啓時會拒絕載入這個 AOF 文件, 從而確保數據的一致性不會被破壞。

爲現有的 AOF 文件創建一個備份。
使用 Redis 附帶的 redis-check-aof 程序,對原來的 AOF 文件進行修復。
$ redis-check-aof --fix
可以使用 diff -u 對比修復後的 AOF 文件和原始 AOF 文件的備份,查看兩個文件之間的不同之處。
重啓 Redis 服務器,等待服務器載入修復後的 AOF 文件,並進行數據恢復
持久化順序

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