Redis(2)API的理解和使用

通用命令

  • keys <pattern>:查看符合<pattern>的key,其中pattern是一個通配符,keys命令一般不在生產環境中使用,時間複雜度O(n);
  • dbsize:計算所有key的個數,時間複雜度O(1);
  • exists <key …>:判斷key列表中的key是否存在,列表中有任何一個key存在將返回1,否則返回0,時間複雜度O(1);
  • del <key …>:刪除key列表中的key,返回刪除的key個數,如果key列表中有3個key,但只有一個key在redis中存在,將返回1,時間複雜度O(1);
  • expire <key> <seconds>:設置key在seconds秒後過期,如果key存在將返回1,否則返回0,時間複雜度O(1);
  • ttl <key>:查看key離過期還剩多少時間,如果key不存在,將返回-2,如果沒有設置過期時間,將返回-1,否則返回剩餘時間,時間複雜度O(1);
  • persist <key>:去掉key的過期時間,讓其永不過期,時間複雜度O(1);
  • type <key>:返回key的類型:string/hash/list/set/zset/none,其中none代表key不存在,時間複雜度O(1)。

數據結構及內部編碼

  • string:raw/int/embstr
  • hash:hashtable/ziplist
  • list:linkedlist/ziplist
  • set:hashtable/intset
  • zset:skiplist/ziplist

單線程爲什麼這麼快

  1. 純內存操作
  2. 非阻塞IO,IO多路複用
  3. 避免多線程上下文切換和線程競爭帶來的額外消耗

單線程需要注意的問題

  1. 每次只會執行一條命令
  2. 拒絕使用執行時間長的命令
  3. 部分命令並不是單線程,而是開啓異步線程執行,比如fysnc file descriptor等

string

字符串的值並不僅僅是字符串,可以是真的字符串,也可以是數字或二進制串,但大小不可以超過512M,可以用與緩存、計數器、分佈式鎖等場景。

  • incr <key>:自增1,返回自增後的值,key不存在會創建並返回1;
  • decr <key>:自減1,返回自減後的值,key不存在會創建並返回-1;
  • incrby <key> <value>:自增value,返回自增後的值,key不存在會創建並返回value;
  • decrby <key> <value>:自減value,返回自減後的值,key不存在會創建並返回-value;
  • set <key> <value>:不管key存不存在,都設置key的值爲value(upsert);
  • set <key> <value> nx:key不存在才設置key的值爲value(insert);
  • setnx <key> <value>:key不存在才設置key的值爲value(insert);
  • set <key> <value> xx:key存在才設置key的值爲value(update);
  • mget <key ...>:獲取多個key的值;
  • mset <key1> <value1> <key2> <value2> …:同時設置多個key的值;
  • getset <key> <value>:將key的值設置爲value,並返回老的值;
  • append <key> <value>:在key原本的值後面追加value,返回追加後的字符串長度,若key不存在,append命令和set命令效果一樣,但會返回value的長度;
  • strlen <key>:返回字符串的長度,注意一箇中文字符的長度會返回2,如果key不存在會返回0;
  • incrbyfloat <key> <value>:key自增一個浮點數value,返回自增後的值;
  • getrange <key> <start> <end>:獲取key.substring(start, end),非法範圍會返回空字符串;
  • setrange <key> <index> <value>:從index開始替換字符串爲value,如果value的長度超出字符串剩餘長度,超出部分將會追加在字符串末尾,如果value超出字符串最大長度,將會用空格填補差值並append value。

hash

  • hget <key> <field>:獲取某個hash的屬性值,如果key不存在或field不存在,則返回nil;
  • hset <key> <field> <value>:設置某個hash的屬性值,如果key或field不存在,將自動創建對應的key或field;
  • hdel <key> <filed ...>:刪除某個hash的屬性,可以一次刪除多個field,如果key或field不存在,返回0,否則返回刪掉的屬性個數;
  • hgetall <key>:返回某個hash值的所有屬性,如果key不存在,返回empty list or set;
  • hexists <key> <field>:判斷某個hash值的field是否存在,如果key或field不存在,返回0,否則返回1;
  • hlen <key> :返回某個hash值的屬性個數,如果key不存在,返回0,否則返回屬性個數;
  • hmget <key> <field...>:獲取hash的多個屬性值,返回一個值列表,如果key不存在或者field不存在,對應下標的值將返回nil;
  • hmset <key> <field1> <value1> ... <fieldn> <valuen>:同時設置某個hash的多個屬性。
  • hincrby <key> <field> <count>:自增一個hash的屬性值,返回自增後的值;
  • hincrbyfloat <key> <field> <float>:自增一個hash的屬性值,自增的值爲浮點數,返回自增後的值;
  • hkeys <key>:返回hash的所有key,如果key不存在,返回empty list or set;
  • hvals <key>:返回hash所有的value,如果key不存在,返回empty list or set;
  • hsetnx <key> <field> <value>:當key不存在或field不存在時才創建key並設置field的值爲valve或設置field的值爲valve;

list

  • rpush <key> <value ...>:從列表右邊添加元素,返回列表長度;
  • lpush <key> <value ...>:從列表左邊添加元素,返回列表長度;
  • rpop <key>:從列表右邊彈出元素,返回彈出元素,若列表不存在或爲空返回nil;
  • lpop <key>:從列表左邊彈出元素,返回彈出元素,若列表不存在或爲空返回nil;
  • llen <key>:返回列表元素個數,如果列表不存在或爲空,返回0;
  • lindex <key> <index>:返回列表index下標的元素,若列表不存在或index不在列表元素下標範圍,返回nil,其中負數表示從末尾開始計算下標,比如-1表示列表最後一個元素;
  • lrem <key> <count> <value>:刪除列表中值爲value的元素,最多值刪除count個,如果list不存在或value元素不存在,返回0,否則返回刪除的元素個數,如果count爲正數,表示從左邊開始刪除,如果爲負數表示從有邊開始刪除,如果爲0表示刪除所有符合條件的元素;
  • lrange <key> <start> <stop>:返回子列表,如果list不存在、下標範圍不在list下標範圍內或start>stop將返回empty list or set,否則返回包含start和stop下標的子列表,如果stop超過最大下標,不會用nil填補,如果star爲負數,stop爲正數,將會把負數替換爲對應正數後再計算子列表;
  • linsert <key> <before|after> <pivot> <value>:在列表的第一個值爲pivot的元素前/後插入一個value元素,返回元素個數,如果列表不存在返回0,如果pivot元素不存在,返回-1;
  • ltrim <key> <start> <stop>:刪除列表下標在start-stop以外的元素,注意如果start>stop也會刪除成功,star超過list最大下標也會刪除成功;
  • lset <keu> <index> <value>:設置列表index下標的值爲value,index可以爲負數,若index超出list範圍,返回ERR index out of range;
  • brpop <key ...> <timeout>:阻塞右彈出,和右彈出類似,但如果隊列中沒有元素,會一直等待直至有元素插入或等待時間超過timeout,timeout=0表示用不超時;
  • blpop <key ...> <timeout>:類似阻塞右彈出;

一些list衍生的數據結構:

  • lpush + lpop = stack
  • lpush + rpop = queue
  • lpush + ltrim = capped collection
  • lpush + brpop = mesage queue

set

  • sadd <key> <member ...>:添加元素到集合,返回添加成功的元素個數,如果key不存在將創建key並添加元素;
  • srem <key> <member ...>:從集合中刪除元素,返回刪除元素個數,如果集合不存在或者集合中沒有元素列表中的任何一個元素,將返回0;
  • scard <key>:查詢集合元素個數,如果key不存在,將返回0;
  • sismember <key> <member>:驗證member是否是key集合中的元素,如果是返回1,否則哦;
  • srandmember <key> <count>:隨機獲取集合中的count個元素,不指定count,默認返回一個元素;如果key不存在或元素個數不夠,返回空集合或包含最大元素個數的集合;
  • spop <key> <count>:從集合中隨機彈出count個元素,彈出後元素將從集合中刪除,count默認值爲1;
  • smembers <key>:返回集合中的所有元素;
  • sscan <key> <cursor> [match <pattern>] [count <count>]:遍歷集合元素,可以設置pattern和返回條數,返回兩個值,第一行是可以繼續遍歷的cursor,第二行開始爲第一次遍歷的結果,count默認值爲10;
  • sdiff <key1> <key2>:求取兩個集合的差集;
  • sinter <key1> <key2>:求取兩個集合的交集;
  • sunion <key1> <key2>:求取兩個集合的並集。
  • [sdiffstore | sinterstore | sunionstore] <destkey> <key1> <key2>:將集合運算保存至新的集合。

zset

  • zadd <key> <score1> <member1> ... <scoren> <membern>:向有序集合添加多個元素並分別指定score,返回添加成功的元素個數;
  • zrem <key> <member ...>:刪除有序集合中的元素,返回刪除的元素個數;
  • zscore <key> <menber>:獲取有序集合中元素的score,返回score,若key或element不存在,返回nil;
  • zincrby <key> <increment> <member>:給有序集合某一個元素的score增加increment,返回元素增加後的score,若key不存在或element不存在,將創建key或element,並返回element;
  • zcard <key>:返回有序集合中元素個數,若key不存在返回0;
  • zrank <key> <element>:返回有序集合中某個元素的的排序,分數最小的排在第一,排在第一的返回0,如果元素不存在或key不存在返回nil;
  • zrevrank <key> <element>:返回有序集合中某個元素的的排序,分數最大的排在第一,排在第一的返回0,如果元素不存在或key不存在返回nil;
  • zrange <key> <start> <stop> [withscores]:返回有序集合rank在start和stop之間的元素,如果有withscores選項,會連帶分數一起返回,返回值默認按照分數升序排序;
  • zrevrange <key> <start> <stop> [withscores]:和zrange類似,排序方式按照score倒序;
  • zrangebyscore <key> <min> <max> [withscores] [limit offset count]:返回有序集合中分數在min-max之間的元素,包括min和max,如果有withscores選項或limit offset count選項,會一併返回score並限制返回條數,按照分數升序排列;
  • zrevrangebyscore <key> <min> <max> [withscores] [limit offset count]:返回有序集合中分數在min-ma之間的元素,包括min和max,如果有withscores選項或limit offset count選項,會一併返回score並限制返回條數,按照分數倒序排列;
  • zcount <key> <min> <max>:返回分數在min-max之間的元素個數;
  • zremrangebyrank <key> <start> <stop>:刪除排序在start-stop之間的元素,返回刪除的元素個數;
  • zremrangebyscore <key> <min> <max>:刪除分數在min-max之間的元素,返回刪除的元素個數;
  • [zunionstore | zinterstore] <deskey> <numkeys> <key ...> [weight <weight ...>] [aggregate sum|min|max]:求多個集合的並集或交集,保存到deskey,numkeys必須指定,是參與計算的集合個數,如果指定weight,表示參與計算時對應集合分數會乘以相應的倍數,如果指定了aggregate,表示參與集合運算的集合中如果有相同元素,分數該如何處理,是相加,取最大值還是取最小值,默認是相加;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章