通用命令
- 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
單線程爲什麼這麼快
- 純內存操作
- 非阻塞IO,IO多路複用
- 避免多線程上下文切換和線程競爭帶來的額外消耗
單線程需要注意的問題
- 每次只會執行一條命令
- 拒絕使用執行時間長的命令
- 部分命令並不是單線程,而是開啓異步線程執行,比如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,表示參與集合運算的集合中如果有相同元素,分數該如何處理,是相加,取最大值還是取最小值,默認是相加;