通用命令
- 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,表示参与集合运算的集合中如果有相同元素,分数该如何处理,是相加,取最大值还是取最小值,默认是相加;