redis學習筆記(1):

一、初始

1.redis特性

1.1:速度快(使用內存條內存、代碼簡潔而且是C語言、單線程【避免線程切換和靜態資源消耗】)

1.2:持久化

1.3:多種數據結構(String、List、Set、Zset、Hash)

1.4:支持多種編輯語言

1.5:功能豐富(發佈訂閱、Lua腳本實現自定義功能、支持簡單事務、pipeline提高客戶端的併發效率)

1.6:簡單(代碼簡潔、使用簡單)

1.7:主從複製

1.8:分佈式、集羣高可用

2.使用場景

2.1:緩存功能

2.2:計數器

2.3:消息隊列模式

2.4:排行榜

2.5:社交網絡

2.6:實時系統(垃圾郵件)

3.啓動方式

3.1:默認直接啓動

3.2:帶參數啓動

3.3:指定配置文件啓動

4.常用配置

4.1:端口(port)

4.2:是否設置爲守護進程(建設設置爲:yes)

4.3:日誌文件(logdir)

4.4:文件存放地址(dir)

二、API的理解和使用

1.通用命令

1.1:keys *(羅列所有的keys、不建議使用【可在從節點使用】)、keys h*【羅列h開頭的key】

1.2:dbsize(統計存在的key數量、有統計數據機制)

1.3:del key(刪除指定的key,可刪除多個)

1.4:exists key(判斷key是否存在,不存在返回0,存在返回1)

1.5:expire key(設置key過期時間)、ttl(查看還有多長時間過期。-2表示已經過期不存在。-1表示key存在而且沒有過期時間)、persist(去掉key的過期時間)

1.6:type key(判斷key值的類型。String、List、Hash、Set、Zset、None【不存在key時返回】)

2.數據結構和內部編碼

使用空間換時間方式:

string=》(raw、int、embstr)、hash=》(hashtable、ziplist)、list=》(linkedList、ziplist)、set=》(hashtable、intset)、zset=》(skiplist、ziplist)

redisObject存在兩種數據(數據類型:type【string、list、hash、set、zset】、編碼方式:encoding【raw、int、ziplist、hashtable、linkedlist、hashmap、intset】)

3.單線程

redis屬於單線程模式【拒絕長命令(keys、flushall、slow lua script....)】,會出現阻塞現象

3.1:redis單線程快=》純內存【主要原因】、非阻塞IO、避免線程切換和靜態資源消耗

4.字符串(緩存、計數器、分佈式鎖)

4.1:命令

get key(獲取key對應的值)

mget key1 key2 key3...(批量獲取值,時間複雜度O(n))

mset key1 value1 key2 value2...(批量設置值,時間複雜度O(1))

set key value(設置key的值爲value、不管key是否存在、都設置)

set key value nx(設置key的值爲value、key不存在、才設置)

set key value xx(設置key的值爲value、key存在、才設置)

incr key(#key自增1、如果key不存在、自增後get(key)=1)

decr key(#key自減1、如果key不存在、自減後get(key)=-1)

incrby key k(#key自增1、如果key不存在、自增後get(key)=k)

decrby key(#key自減k、如果key不存在、自減後get(key)=-k)

getset key newvalue(#set key newvalue並返回舊的value)

append key value(#將value追加到舊的value)

strlen key(返回字符串長度【注意中文】)

incrbyfloat key 4.5(增加key對應的值3.5)

getrange key start end(獲取字符串指定下標所有的值)

setrange key index value(設置指定下標所對應值)

5.Hash

hget key field(獲取hash key對應的field的value)

hset key field value(設置hash key對應的field的value)

hdel key field(刪除hash key對應的field的value)

hexists key filed(判斷hash key是否有field)

hlen key(獲取hash key field的數量)

hgetall key(獲取key下所有的field和value【牢記單線程,謹慎使用】)

hvals key(返回hash key對應所有的field的value)

hkeys key(返回kash key對應所有的field)

hmget key filed1 field2 ...fieldN(批量獲取hash key的一批field對應的值【O(N)】)

hmset key field1 value1 field2 value2 ...fieldN value2(批量設置hash key的一批filed value【O(N)】)

hsetnx key field value(設置hash key對應field的value(如field已經存在,則失敗))

hincrby key field intCounter(hash key對應的field的value自增的intCount)

hincrbyfloat key field floatCount(hincrby浮點數版)

6.List(有序、可重複、左右兩邊插入或彈出)

6.1:命令

rpush key value1 value2...valueN(從列表右端插入值(1-N個)【O(1-N)】)

lpush key value1 value2...valueN(從列表左邊插入值(1-N個)【O(1-N)】)

linsert key before|afyer value newVlaue(在list指定的值前面|後面插入newVlaue【O(N)】)

lpop key (從列表左側彈出一個item)

rpop key(從列表右側彈出一個item)

lrem key count value(根據count值,從列表中刪除所有value相等的項【1.count>0,從左到右,刪除最多count個value相等的項、2.count<0,從右到左,刪除最多Math.abs(count)個value相等的項、3.count=0,刪除所有value相等的項】)

ltrim key start end(按照索引範圍修剪列表【O(N)】)

lrange key start end(獲取列表指定索引範圍所有item【包含end】)

lindex key index(獲取列表指定索引的item,index=-1時獲取最後一個【O(N)】)

llen key(獲取列表長度)

lset key index newVlaue(設置列表指定索引值爲newValue【O(N)】)

blpop key timeout(lpop阻塞版本。timeout時阻塞超時時間,timeout=0永遠不阻塞)

brpop key timeout(rpop阻塞版本。timeout時阻塞超時時間,timeout=0永遠不阻塞)

6.2:TIPS

1.LPUSH + LPOP = STACK

2.LPUSH + RPOP = QUEUE

3.LPUSH + LTRIM = CAPPED COLLECTION

4.LPUSH + BRPOP = MESSAGE QUEUE

7.Set(無序集合=》無重複、集合間可操作、無序)

7.1:命令

sadd key elelment(向集合key添加element【如果element已經存在,添加失敗】)

srem key element(將集合key中的element移除掉)

scard key(計算集合大小)

sismember key value(判斷value是否存在集合中,返回1代表存在)

srandmember key count(從集合中隨機挑選count個元素)

spop key (從集合中隨機彈出一個元素)

smembers key(獲取集合所有的元素,返回值爲無需【集合中存在很多數據時,謹慎使用】)

sdiff key1 key2(兩個key對應集合之間的差集)

sinter key1 key2(兩個key對應集合之間的交集)

sunion key1 key2(兩個key對應集合之間的並集)

sdiff|sinter|sunion + store deskey...(將差集|交集|並集結果保存在destkey中)

7.2:TIPS

1.SADD= Tagging(標籤)

2.SPOP/SRANDMEMBERS = Random item(隨機數)

3.SADD +SINTER = Social Graph(社交相關)

8.Zset(有序集合=》無重複、集合間可操作、有序)

zadd key score element(添加score和element,score是可以重複,element不可以重複、可以同時添加多對【O(long(n))】)

zrem key element(刪除元素、可以是多個)

zscore key element(返回元素的分數)

zincrby key increScore element(增加或減少元素的分數)

zcard key(返回元素的總個數)

zrank key element(返回element排名)

zrange key start end [withscores](獲取指定索引範圍內的升序element[score]【O(long(n)+m)】)

zrangebyscore key minScore maxScore [withscores](獲取指定分數範圍內的升序element[score]【O(long(n)+m)】)

zcount keyminScore maxScore(返回有序集合內在指定分數範圍內的個數【O(long(n)+m)】)

zremrangebyrank key start end(刪除指定排名內的升序元素【O(long(n)+m)】)

zremrangebyscore key minScore maxScore(刪除制定分數內的升序元素)

zrevrank(從高到低進行排序)

zrevrange (獲取指定排序範圍內)

zrevrangebyscore (給定一個分數,獲取高到低的一個結果)

zinterscore (對兩個集合進行交集計算)

zunionstore(對兩個集合進行並集計算)

三、功能豐富

1.慢查詢

1.1、慢查詢發生在執行階段;客戶端發生超時不一定是慢查詢引起,但是慢查詢是客戶端超時的一個可能

1.2、慢查詢特點(1.先進先出隊列、2.固定長度、3.保存在內存當中{重啓之後就會消失})

1.3、兩個配置

     1.3.1:slowlog-max-len(設置慢查詢隊列長度。默認值128)

     1.3.2:slowlog-log-slower-than(慢查詢閾值,默認值10000,即10毫秒【單位:微秒】、等於0【記錄所有的命令】、小於0【不記錄任何命令】)

1.4、修改設置慢查詢

    1.4.1:修改配置文件後進行重啓

    1.4.2:config set slowlog-max-len 1000、config set slowlog-log-slower-than 1000

1.5、慢查詢命令

slowlog get[n](獲取慢查詢隊列指定條數)

slowlog len(獲取慢查詢隊列長度)

slowlog reset(清空慢查詢隊列)

1.6、運維經驗

    1.6.1:slowlog-max-len(不要設置過大,默認10毫秒,通常設置1ms)

    1.6.2:slowlog-log-slower-than(不要設置過小,通常設置1000左右)

    1.6.3:理解命令生命週期(發起請求、隊列排隊、執行命令、返回結果)

    1.6.4:定期持久化慢查詢

2.pipeline(流水線,批量操作)

2.1:一次pipeline(n條命令)= 1此網絡事件 + n次命令(redis的命令時間是微妙級別的)【主要控制網絡時間,即使用pipeline網絡時間】

2.2:pipeline不是原子操作

2.3:使用建議

    2.3.1、注意每次pipeline攜帶數據量

    2.3.2:pipeline每次只能作用在一個redis節點上

    2.3.3:M操作與pipeline區別

3.發佈訂閱(注意消息隊列和發佈訂閱的區別、使用場景)

3.1:API命令

  publish channelName publicMessage(發佈消息,返回訂閱者個數)

  subscribe 【[channelName](訂閱一個或多個頻道) 

  unsubscribe[channelName](取消訂閱一個或多個頻道)

  psubscribe [patter...](根據頻道模式訂閱)

  punsubscribe [patter...](根據頻道模式退訂)

  pubsub channels(列出至少有一個訂閱者的頻道)

  pubsub numsub [channel...](列出給定頻道的訂閱者數量)

  pubsub numpat(列出被訂閱模式的數量)

4.bitmap(位圖)

4.1:API

  setbit key offset value(給位圖指定索引設置值,offset偏移量,value只能是0或者1)

  getbit key offset(獲取位圖指定索引的值)

  bitcount key [start end](獲取位圖指定範圍start到end,單位爲字節,如果不指定就是獲取全部)位置爲1的個數

  bitop op destkey key[key...](做多個bitmap的and【交集】、or【並集】、not【非】、xor【異或】操作並將結果保存在destkey中)

  bitpos key targetBit [start] [end] (計算位圖指定範圍(start到end,單位爲字節,如果不指定就是獲取全部)第一個偏移量隊以ing的值等於targetBit的位置)

4.2:使用經驗

  4.2.1、type=String, 最大512MB

  4.2.2、注意setbit時的偏移量,可能有較大耗時

  4.2.3、位圖不是絕對好

5.hyperloglog

5.1:概念

5.1.1、基於hyperloglog算法:極小空間完成獨立數量統計

5.1.2、本質還是字符串

5.2:API

  pfadd key element [element...](向hyperloglog添加元素)

  pfcount key [key...](計算hyperloglog的獨立總數)

  pfmerge destkey sourcekey [sourcekey ...] (合併多個hyperloglog)

6.geo(地理信息定位,存儲經緯度,計算兩地距離,範圍計算...)

6.1:API

  geoadd key longitude latitude member [longitude latitude member...](增加地理位置信息,longitude經度、latitude緯度、member 名稱)

  geopos key member [member...](獲取地理位置信息)

  geodist key member1 member2... [unit](獲取兩個地理位置的距離。m【米】、km【千米】、mi【英里】、ft【尺】)

  georadius key member unit(獲取指定位置unit距離的範圍內的地理信息集合命令...)

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