Redis數據類型及經常使用API

一、redis特性
速度快:redis是內存型
持久化:redis能夠持久化
數據結構:redis支持多種數據結構,string hash list set zset
多語言客戶端:redis支持多種客戶端語言
功能豐富:發佈訂閱、事務、pipeline、bitmap、geo
簡單:上手簡單,開源
複製:自帶RDB和AOF主從複製
高可用分佈式:自帶的分佈式redis

redis是單線程:純內存,非阻塞IO,避免線程切換和靜態消耗
redis使用場景:緩存系統,計數器,消息隊列,排行榜,社交網絡,實時系統

二、redis的啓動方式算法

  • 默認啓動 redis-server
  • 參數啓動 redis-server -h 127.0.0.1 -p 6379
  • 配置啓動(推薦)

三、redis通用命令
通用命令:緩存

  • keys * 遍歷全部的key (o(n))該命令通常不在生產環境使用 scan 或者熱備節點能夠遍歷
  • dbsize 計算key的總數 (o(1))
  • exists key 檢查key是否存在 存在返回1 不存在返回 0
  • del key 刪除指定的key
  • expire key seconds 設置key在seconds秒後過時
  • ttl key 查看key剩餘的過時時間 -2 表明已經不存在 -1 表明key存在,而且沒有過時時間
  • persist key 去掉key的過時時間
  • type key 返回key的類型 返回值包括:string hash list set zset none(不存在)
    • *

string字符串:
使用場景:緩存 計數器 分佈式鎖網絡

  • get 獲取key對應的value
  • set 設置key-value 無論key是否存在,都設置
  • del 刪除key-value
  • incr key自增1,若是key不存在,自增後get(key)=1
  • decr key自減1,若是key不存在,自減後get(key)=-1
  • incrby key自增k,若是不存在,自增後get(key)=k
  • decrby key自減k,若是不存在,自減後get(key)=-k
  • 實際使用:記錄網站每一個用戶我的主頁的訪問量
  • incr userid:pageview(單線程,無競爭)
  • setnx key不存在,才設置
  • set key value xx key存在才設置
  • mget 批量獲取key原子操做 一次獲取的key值有限
  • mset 批量設置key
n次get = n次網絡時間+n次命令時間
1次mget = 1次網絡時間+n次命令時間
  • getset key newvalue set key newvalue並返回舊的value
  • append key value 將value追加到舊的value
  • strlen key 返回字符串得長度
  • incrbyfloat key 增長key對應的值
  • getrange key start end 獲取字符串指定下標的全部值
  • setrange key index value 設置指定下標全部對應的值

hash類型
使用場景:存儲我的信息,記錄網站每一個用戶的我的主頁訪問量數據結構

  • hget key field 獲取hash對應的field的value
  • hset key field value 設置hash key 對應的field的value
  • hdel key field 刪除hash key 對應field的value
  • hexists key field 判斷key是否有field
  • hlen key 獲取hash key field的數量
  • hmget key field1 field2 批量獲取hash key的一批field對應的值
  • hmset key field1 value1 field2 value2 批量設置hash key的一批field value
  • hgetall key 獲取hash對應的key的全部field的value
  • hvals key 返回hash key對應全部field的value
  • hkeys key 返回hash key對應全部field
  • hsetnx key field value設置hash key對應field的value(如field已存在,則失敗)
  • hincrby key field intCounter hash key對應field的value自增intCounter
  • hincrbyfloat key field floatCounter hincrby的浮點數版

list隊列類型
使用場景 timeLineapp

  • rpush key value1 value2 從列表右端插入值
  • lpush key value1 value2 從列表左端插入值
  • linsert key before|after value newValue 在list指定的值前|後插入newValue
  • lpop key 從列表左側彈出一個item
  • rpop key 從列表右側彈出一個item
  • lrem key count value 根據count的值,從列表中刪除全部value相等的項
count > 0 從左到右,刪除最多count個value相等的項
count < 0 從右到左,刪除最多Math.abs(count)個value相等的項
count = 0 刪除全部value相等的項
  • ltrim key start end 按照索引範圍修剪列表
  • lrange key start end (包含end) 獲取列表指定索引範圍的索引item
  • lindex key index 獲取列表指定索引的item
  • llen key 獲取列表的長度
  • lset key index newValue 設置列表指定索引值爲newValue
  • blpop key timeout lpop阻塞版本,timeout是阻塞超時時間,timeout=0爲永遠不阻塞
  • brpop key timeout rpop阻塞版本,timeout是阻塞超時時間,timeout=0爲永遠不阻塞
    • *

set集合類型
使用場景:抽獎系統,like 贊 踩,標籤分佈式

  • sadd key element 向集合key添加element(若是element已經存在,添加失敗)
  • srem key element 將集合key中的element移除掉
  • scard key 計算集合大小
  • sismember key element 判斷element是否在集合內
  • srandmember key 從集合中隨機抽取count個元素 (不改變原集合)
  • smembers key 獲取集合全部元素
  • spop key 從集合中彈出element (改變原集合)
  • sdiff key 差集
  • sinter key 交集
  • sunion key 並集
    • *

zset有序集合
使用場景:排行榜網站

  • zadd key score element(能夠是多對)添加score和element
  • zrem key element(能夠是多對) 刪除元素
  • zscore key element 返回元素的分數
  • zrank key element 返回元素的排名
  • zincrby key increScore element 增長或減小元素的分數
  • zcard key 返回元素的總個數
  • zrange key start end 返回指定索引範圍內的升序元素
  • zrangebyscore key minScore maxScore 返回指定分數範圍內的升序元素
  • zcount key minScore maxScore 返回有序集合內在指定分數範圍內的個數
  • zremrangebyrank key start end 刪除指定排名內的升序元素
  • zremrangebyscore key minScore maxScore 刪除指定分數內的升序元素
  • zrevrank 返回元素的排名 降序
  • zrevrange 返回指定分數範圍內的降序元素
  • zrevrangebyscore 返回有序集中指定分數區間內的全部成員
  • zinterscore 計算一個或多個有序集的交集
  • zunionscore 計算一個或多個有序集的並集

四、redis的特性
慢查詢
生命週期:①發送命令②排隊③執行命令④返回結果
慢查詢發生在第3階段,客戶端超時不必定慢查詢,但慢查詢是客戶端超時的一個可能
slowlog-max-len 先進先出隊列 固定長度 保存在內存中
slowlog-log-slower-than 慢查詢閾值 slowlog-log-slower-than=0 記錄全部命令 slowlog-log-slower-than < 0 不記錄全部命令
修改配置文件
config get slowlog-max-len=128
config get slowlog-log-slower-than=10000
修改配置文件重啓
動態配置
config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000
慢查詢命令:線程

slowlog get[n]:獲取慢查詢隊列長度
slowlog len:獲取慢查詢隊列長度
slowlog reset:清空慢查詢隊列

注意:
slowlog-max-len 不要設置過大,默認10ms,一般設置1ms
slowlog-log-slower-than不要設置太小,一般設置1000左右
理解命令生命週期
按期持久化慢查詢code

pipeline
網絡命令通訊模型:
傳輸命令=》返回結果
一次時間 = 一次網絡時間 + 一次命令時間
批量網絡命令通訊模型:
n次時間 = n次網絡時間 + n次命令時間
流水線:
1次pipeline(n條命令) = 1次網絡時間 + n次命令時間
注意:
*redis的命名時微秒級別
pipeline每次條數要控制住*
使用建議

注意每次pipeline攜帶的數據量
pipeline每次只能做用在一個Redis節點上
M操做與pipeline的區別

發佈訂閱

發佈者:publisher channel message 返回訂閱者的個數
訂閱者:subscriber channel 一個或多個
取消訂閱:unscribe channel 一個或多個
訂閱模式:psubscribe [pattern] punsubscribe channel
頻道:channel

bitmap位圖

使用場景:獨立用戶統計
setbit key offset value 給位圖指定索引設置值
getbit key offset 獲取位圖指定索引的值
bitcount key [start end] 獲取位圖指定範圍(從start到end,單位爲字節,若是不指定就是獲取所有)位值爲1的個數
bitop op destkey key [key ...] 作多個Bitmap的and(交集)、or(並集)、not(非)、xor(異或)操做並將結果保存在destkey中
bitos key targetBit [start] [end] 計算位圖指定範圍(start到end,單位爲字節,若是不指定就是獲取所有)第一個偏移量對應的值等於targetBit的位置

注意
一、type=string,最大512MB
二、注意setbit時的位移量,可能有較大的耗時
三、bitmap不是絕對的好

HyperLogLog

基於HtperLogLog算法:極小的空間完成獨立數據量統計,本質仍是字符串
pfadd key element 向hyperloglog添加元素
pfcount key 計算hyperloglog的獨立總數
pfmerge destkey sourcekey 合併多個hyperloglog數據

注意
一、是否能容忍錯誤(錯誤率0.81%)
二、是否須要單條數據

GEO地理信息

存儲經緯度,計算兩地距離,範圍計算等
geoadd key longtitude latitude member增長地理位置信息
geopos key member [member] 獲取地理位置信息
geodist key member1 member2 獲取兩個地理位置的距離

注意
一、since 3.2+
二、type geokey = zset
三、沒有刪除API:zrem key member
相關文章
相關標籤/搜索