Redis--基礎總結

Redis
一:初識Redisredis

一、Redis 是什麼? 數據庫

一款開源的基於C語言的內存的鍵值對存儲數據庫,支持多種數據結構如:Set、hash、List、Zset、等,高性能的內存數據庫。編程

二、Redis 特性 速度快 (10W Ops、單線程)
  持久化 (可異步保存到磁盤,斷電後不丟失數據)
  多種數據結構
  支持多種編程語言
  功能豐富
  簡單
  主從複製
  高可用、分佈式json

三、應用場景 緩存

  緩存、計數器、消息隊列、排行榜、社交網絡、實時系統、會話存儲、服務器

四、安裝 官方地址:https://redis.io/download
  $ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
  $ tar xzf redis-5.0.4.tar.gz
  $ cd redis-5.0.4
  $ make
  運行服務端
  $ src/redis-server
  客戶端訪問
  $ src/redis-cli
    備註: 能夠創建一個軟鏈接以備後續升級: ln -s redis-5.0.4 redis網絡

五、啓動方式 簡單啓動 sh 、動態參數啓動、配置文件啓動
  默認端口:6379
  中止方式爲:shoutdown 這樣Redis能夠保存相關操做後再進行關閉。
  指定修改後的conf啓動:/opt/software/redis-5.0.4/src/redis-server /opt/software/redis-5.0.4/redis.conf
  配置文件修改:
  關閉默認本地訪問:#bind 127.0.0.1
  關閉守護進程:protected-mode no
  設置訪問密碼:requirepass password
  本機訪問 src/redis-cli 鏈接後輸入驗證:auth root數據結構

六、Redis經常使用配置 app

  daemonize 是否守護進程(no/yes)修改爲yes 能夠進行日誌記錄
  port 設置對外訪問端口默認:6379
  logfile: 日誌名稱,記錄日誌
  dir:Redis工做目錄異步

七、通用命令

   keys * (獲取全部key)、
  dbsize(獲取數據庫大小)、
  exists key(判斷當前key是否存在)
  del key[key] (刪除key)
  expire key seconds(設置過時時間)
  type key (判斷類型)
  ttl key(查詢剩餘過時時間)
  persist key (去除過時時間)
  scan循環遍歷
  flushall 清除全部key value

八、名詞:   

  往返延遲:①客戶端向服務器發送指令;②服務端接收指令,存儲到執行隊列;③服務器開始執行指令;④服務器返回執行結果;整個系列中的總耗時稱之爲往返延遲。



2、數據類型

一、String

   key key1 value val{類型能夠是:字符、數字(整數、浮點數)、bits、json、xml}
  單個最大512MB。儘可能控制在100kb

一、1:經常使用操做   i

  ncr key :自增1; 若是key不存在增長後值爲 1;
  decr key :自減1: 若是key 不存在自減後爲 -1;
  incrby key k:key增長k;若是不存在增長後爲k;
  decrby key k:key減去k:若是不存在自減後爲-k;

  setnx key value :當key不存在時進行新增;成功返回1,失敗返回0
  set key value xx :當key存在時進行從新賦值,相似更新操做
  mset key1 value1 key2 value2 key3 value3 : 批量設置值
  mget key1 key2 key3 : 批量取值

  getset key:先返回原有值;在進行更新值
  append :追加操做,若是鍵不存在會先增長後返回
  strlen :獲取字符串長度(注意中文兩個字節)
  incrbyfloat:增長對應key浮點數
  getrange:獲取指定字符串下標的值
  setrange:設置指定字符串下標的值,相似替換操做

[總結]
①:Redis內部編碼
int:用於長度小於64位有符號整數表示的字符串<數字類型的字符串>
embstr: 用於長度小於等於44字節的字符串;這種類型的編碼在內存使用和性能方面更有效率
raw:用於長度大於44字節的字符
②:字符串能夠存儲普通的字符、整數、浮點數;若是存入的value 能夠被轉換爲整數或浮點數,則可使用incr、decr、incrby、decrby;若是對字符進行增減,則會返回錯誤異常,若是值爲空則當作0處理。
③:getrange key start end 當範圍值strlen key超出當前長度,則直接返回字符末端。
④:setrange key index value 當在指定index上對應一個長度value則只修改指定index,若是value長度不爲1則覆蓋其指定位置後其它value,超出部分會直接替換進去。


二、hash 哈希

2.一、經常使用操做

   hget key field : 獲取 鍵map中指定字段的屬性值
  hset key field value: 設置 鍵map中指定字段的屬性值;當map中的field已存在時使用重複field可覆蓋value
  hdel key field : 刪除 鍵map中指定字段的屬性值
  hgetall key : 獲取key哈希表全部屬性包含:字段名、字段屬性值<注意不要濫用:redis是單線程>
  hkeys key : 獲取key中全部字段名稱
  hvals key : 獲取key中全部值
  hexists key field : 判斷指定列表中某個字段是否存在
  hlen:計算指定key哈希的長度;注意返回字段屬性長度
  hmset key1 field1 value1 field2 value2 field3 value3:批量設置值
  hmget key1 field1 field2 :批量取值

  hsetnx key value :當key不存在時進行新增;成功返回1,失敗返回0
  hset key value xx :當key存在時進行從新賦值,相似更新操做
  hincrby 自增
  hincrbyfloat 浮點數增長


三、list列表

三、1:經常使用操做   

  ’rpush keylist value1 value2 value3 : 從當前列表的value右側開始插入數據 ===>>>value一、value二、value3
  lpush keylist value1 value2 vlaue3 : 從當前列表的value左側開始插入數據 ===>>>value三、value二、value1
  linsert keylist befor|after value newValue :在當前列表value值以前插入仍是以後插入數據
  lpop keylist : 從左邊刪除一個元素
  rpop keylist : 從右邊刪除一個元素
  lrem keylist 0|1|-1 value: 刪除列表中值等與value的相同元素;0 全部;1從左到右;-1從右到左
  ltrim keylist start end : 列表修剪,只保留當前keylist中start到end之間的元素,其中start與end會被保留
  lrande keylist start end : 獲取列表從右到左指定範圍內的值,包含start與end對應座標值會返回
  lindex keylist index : 獲取指定下標的值
  llen keylist : 獲取列表長度
  lset keylist index newValue: 更新指定下標值
    備註:0~ -1 範圍內返回的是整個列表。


四、set無序集合

特色:集合不容許重複,集合內元素無序,支持集合間操做(交集、並集、差集)
  集合排序分值相等會按照名稱進行排序;key不能夠重複,value 能夠重複(重複後會替換原有值)

四、1:經常使用操做 sadd key element(多個元素):增長元素
  srem key element :刪除元素
  scard key: 計算集合元素個數
  sismember key: 判斷值是否存在
  srandmember key: 從集合中隨機取出一個或多個元素;參數:[count] 當count爲正數隨機返回元素不會重複;當count爲負數時隨機返回元素可能會出現重複值
  smembers key: 取出集合全部元素
  spop key:從集合中隨機移除一個元素,並返回被移除的元素
  smove key1 key2: 若是key1中存在element那麼從key1中移除element,並將element添加至key2中成功返回1;失敗返回0

四、2:集合間操做 sinter key1 [key2,key3...]: 求交集;返回同時存在第一個集合,而又存在於其它集合中的元素。
  sinterstore desc_key1 key1[key2,key3...]: 求交集;將同時存在全部集合中的元素,存儲到desc_key1集合中。
  sdiff :求差集
  sdiffstore desc_key1 key1[key2,key3...]: 求差集;將只存key而不存在其它集合中的元素,存儲到desc_key1集合中。
  sunion :求並集
  sunionstore desc_key1 key1[key2,key3...]: 求並集;將至少存在一個元素中的值,存儲到desc_key1集合中。(不含重複值)


五、sorted set有序集合

特色:不容許重複,集合內元素有序。存在分值排序。形式 key score element;集合排序分值相等會按照名稱進行排序;
  key不能夠重複,value 能夠重複(重複後會替換原有值)

五、1:經常使用操做

  zadd key score element: 增長元素score 能夠重複
  zrem key element :從指定集合中移除指定元素,並返回移除個數。
  zscore key element:獲取指定集合中元素的分數
  zincerby key increscore element:自增,自減分值
  zcard key :返回集合元素個數
  zrank key element: 獲取元素排名;排名規則是根據分支score 從小到大--->>>0-100排序規則。
  zrange key start end :獲取指定範圍內排名的值:指定範圍內排序規則是升序。從低到高
  zrangebyscore key minScore maxScore 獲取指定分數內的元素值,從低到高
  zcount key minScore MAxScore 獲取指定分數內的元素個數
  zremrangebyrank key start end :移除指定集合中排名介於start至end之間的全部成員 zremrangebyrankkey 0 -4<減去第四個>
  zremrangebyscore key minScore maxScore : 移除指定集合中分數介於minScore至maxScore之間的全部成員

五、2:其它操做

   zrevrank key element: 獲取指定集合key中指定元素element的排名;排名從高到低
  zrevrange key start end :獲取指定範圍內排名的值:指定範圍內排序規則是升序。從高到低
  zrevrangebyscore key minScore maxScore 獲取指定分數內的元素值,從高到低
  zinsterstore desc_key1 key1[key2,key3] :對指定集合進行交集運算,key返回一個新的集合
  zunionstore desc_key1 key1[key2,key3] :對指定集合進行並集運算,key返回一個新的集合


六、HyperLogLog 惟一計數

特色:當數據量達到千萬等級別的時使用HyoerLogLog所消耗的內存較小

六、1:經常使用操做 pfadd key value: 增長元素
  pfcount key : 獲取key 去重複值統計
  pfmerge newKey key1 key2 :合併兩個key 產生彙總集合。

六、2:其它操做


七、geo 地理位置   

特色:存儲基於地理信息座標的集合

七、1:經常使用操做

   e maxScore 獲取指定分數內的元素值,從高到低
  zunionstore 有序集合合併



八、pipeline : 批量執行,能夠一次性執行一批get/set 命令;pipeline只適用於單節點
  conn.pipelined(true|false); true 使用事務執行;false不開啓事務執行

示例:
public void updateTokenPipeline(Jedis conn, String token, String user, String item) {
long timestamp = System.currentTimeMillis() / 1000;
Pipeline pipe = conn.pipelined(false);
pipe.multi();
pipe.hset("login:", token, user);
pipe.zadd("recent:", timestamp, token);
if (item != null){
pipe.zadd("viewed:" + token, timestamp, item);
pipe.zremrangeByRank("viewed:" + token, 0, -26);
pipe.zincrby("viewed:", -1, item);
}
pipe.exec();
}


九、過時時間:

   persist key:移除過時時間 ttl key //查看給定鍵距離過時還有多少秒 查詢結果 -1 沒有設置過時時間;-2 已通過期
  expire "key" time:設置過時時間《單位:秒》
  expireat key timestamp :將給定的鍵的過時時間設置爲unix時間戳
  pttl key: 查看給定鍵過時時間還有多少毫秒
  pexpire key milliseconds :讓給定鍵在指定的毫秒後過時
  pexpireat key : 將一個毫秒級的unix時間戳設置爲給定的過時時間

  當鍵的值被:set、getset、*store在內的命令,鍵的過時時間會被清除。
  當被一個重名的key,會沖掉過時時間。


十、排序sort

   sort key [BY pattern]
  [LIMIT offset count] //限制排序返回數量 offset開始下標 count返回數量
  [GET pattern [GET pattern ...]]
  [ASC|DESC] //ASC 默認升序 | desc 降序
  [ALPHA] //費字符排序
  [STORE destination] //按照權重排序


十一、發佈與訂閱

   subscribe channel [channel ...] 訂閱給定的一個或多個頻道
  unsubscribe channel [channel ...] 退訂一個或多個頻道
  publish channel message 向給定的一個頻道發送消息
  psubscribe pattern [pattern ...] 訂閱與給定模式匹配的全部頻道
  punsubscribe pattern [pattern ...] 退訂給定模式,若是執行時沒有給定任何模式,那麼退訂全部模式


十二、事務概念

   redis的基本事務涉及到MULTI(開始)、EXEC(結束);還有WATCH、UNWATCH、DISCARD
  執行流程:MULTI : 逐條操做;EXEC 結束;當redis接收到multi命令時會將以後的每一條操做都存放到隊列中去;直到接收到exec結束;
  開始執行每條操做;遇到錯誤所有回滾



3、持久化
一、快照(Snapshotting)
能夠在某一時刻將全部數據所有寫入硬盤

二、只追加文件(AOF)
只有當執行寫入命令才進行磁盤寫入。

0、RDB 快照
RDB持久化方式;redis在本地生成一份RDB二進制文件,當須要恢復數據,或持久化到數據庫時,可以使用RDB文件進行。
1.一、生成RDB文件的三種方式:
save: 在執行數據返回前首先保存至本地RDB文件中,而後進行結果返回。(同步執行),數據量較大容易形成單線程阻塞。執行策略,當本地已經存在RDB文件時,生成一份新的文件,以後替換舊的RDB文件。
bgsave: 執行完Redis操做直接返回,異步進行更新本地RDB文件。(異步執行),生成一個fork()子進程執行保存。
自動:定時進行更新本地RDB文件。須要知足下列條件之一後執行:
配置 seconds changes
save 900s 1條
save 300s 10條
save 60s 1000條

修改配置: redis.conf dbfilename dump.rdb 修改默認文件名 dir ./ 修改默認存儲文件夾 stop-writes-on-bgsave-erroe yes --------------------------------------------------------------未完待續,20190706

相關文章
相關標籤/搜索