一、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