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,表示参与集合运算的集合中如果有相同元素,分数该如何处理,是相加,取最大值还是取最小值,默认是相加;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章