Redis 常用 API 总结

常用基本命令

  • keys [pattern] 所有满足pattern的key,一般不用 O(n)
  • dbsize 所有key的总数 O(1)
  • exists key 检查key是否存在 O(1)
  • del key 删除指定的key-value,可以删除多个 O(1)
  • expire key seconds 设置key在seconds秒之后过期 O(1)
  • ttl key 查询key剩余的过期时间 O(1)
  • persist key 去掉过期时间,不再过期 O(1)
  • type key 返回key的类型[string hash list set zset none] O(1)

数据结构API

redis 对外的数据类型有 string,hash,list,set,sorted set,但对于同一种数据类型的不同键值对,其内部的编码方式可能不同。 我们可以用OBJECT ENCODING key 命令来查看对应的key的内部编码方式。

string 字符串

字符串类型的结构: key -> value
内部编码包括 raw, int, embstr
常用API:

  • get key 获取key的value
  • getrange key start end 获取子串
  • mget key1 key2 key3 批量获取,为原子操作
  • set key value 设置key为value
  • setnx key value 当key不存在时,设置key为value
  • set key value xx 当key存在时才设置
  • setrange key index value 指定下标设置一个新的值
  • mset key1 value1 key2 value2 批量设置值
  • getset key newvalue 返回旧值并设置新值
  • append key value 追加字符串
  • strlen key 获取value的长度(字节数)O(1) 可得内部其实记录了字符串的长度。
  • del key 删除
  • incr key +1
  • decr key -1
  • incrby key k +k
  • decrby key k -k

hash 哈希

hash类型的结构: key==>{filed1: value1 field2: value2 ... } 可以看做是一个关系型数据库的一张表,虽然不太恰当

特点: 其实像是个small redis,或者map map。 注意filed不能相同,value可以相同。

内部编码包括 hashtable, ziplist

常用API

  • hget key field 获取hash key的field字段值
  • hmget key field1 field2 field3... 一次获取多个filed的值
  • hset key field value 设置hash key的filed字段值为value
  • hmset key field1 value1 filed2 value2 ... 一次设置多个值
  • hdel key field 删除
  • hexists key field 判断hash key是否有field
  • hlen key 获取hash key有多少个字段
  • hgetall key 获取key中所有对应的field和value PS. 小心使用下面这三个命令
  • hvals key 返回hash key中所有field的values
  • hkeys key 返回hash key对应的所有的field

可以发现,很多的API都是可以和string类型对应起来的,很多时候只是加了个h

list 列表

list类型的结构: key==>elements[a,b,c,...]
特点: 有序,可重复,双端操作
内部编码:linkedlist, ziplist
常用API:

  • rpush key value1 value2 ... 从右端插入值,同样还有lpush
  • rpop key 从列表右端弹出一个item,同样的还有lpop
  • linsert key before|after value newValue 在list的指定值前插入newValue
  • lrem key count value 根据count值,从列表中删除所有value相等的项,如果count>0 则从左到右删除, 如果count<0 则从右往左删,如果count=0,则删除全部value值
  • lrange key start end 获取列表指定索引范围内的所有item,注意包含end,且支持负索引
  • ltrim key start end 按照索引范围修剪列表
  • llen key 获取列表的长度
  • lset key index newValue 设置列表指定索引值为newValue
  • brpop key timeout 在没有元素时,阻塞直到有元素能够pop,类似的还有blpop,在做消息队列的时候会很有用

set 集合

set类型的结构 key==> {a,b,c,d}
特点:无序,不可重复,支持集合间操作
内部编码:hashtable intset

集合内的API:

  • sadd key element1 element2 ... 添加元素,如果存在则添加失败 O(1)
  • srem key element1 element2 ... 移除元素 O(1)
  • scard key 计算集合的大小
  • sismember key element 判断是否在集合中
  • srandmember key count 从集合中随机挑选count个元素,不会破坏集合
  • spop key 从集合中随机弹出一个元素,注意是弹出,元素就从集合中移除了
  • smembers key 所有元素,注意可能会导致阻塞,小心使用

集合间的API

  • sdiff key1 key2 获取差集
  • sinter key1 key2 获取交集
  • sunion key1 key 获取并集

sorted set (zset) 有序集合

set类型的结构 key==> {score1:value1, score2:value2, ...}
特点:有序,不可重复
内部编码:skiplist ziplist
常用API:

  • zadd key score element 注意score可以重复,但element不可以重复,时间复杂度为O(logN)
  • zrem key element 删除,复杂度为O(1)
  • zscore key elment 获取score
  • zincrby key increSocre elemnt 增加指定元素的score
  • zcard key 获取元素个数 时间复杂度为O(1)
  • zrank key element 获取元素的排名
  • zrange key start end [WITHSCORES] 返回指定排名范围的元素,并指定是否返回分数,时间复杂度为O(log(n) + m)
  • zrangebyscore key start end [WITHSCORES] 返回指定score范围的元素,并指定是否返回分数,时间复杂度为O(log(n) + m)
  • zount key minScore maxScore 返回指定score范围的元素个数,时间复杂度为O(log(n) + m)
  • zremrangebyrank key start end 删除指定排名范围的元素 时间复杂度为O(log(n) + m)
  • zremrangebyscore key start end 删除指定score范围的元素 时间复杂度为O(log(n) + m)

一些问题

为什么单线程还这么快?

  1. 纯内存操作
  2. 采用非阻塞IO, 内部io模型利用epoll并进行了优化
  3. 没有线程的切换,没有线程切换和竞态消耗

怎样避免单线程导致的阻塞问题?

拒绝长慢命令,包括keys, flushall, flushdb等,不要在线上执行