2-1 通用命令

  • keys 键名 :遍历key,输出匹配key。如果要输出所有key,则可使用 keys *
  • dbsize :返回数据库中键的数量。
  • exists 键名 :返回是否存在指定键。是则返回1,否则返回0。
  • del 键名 [键名 ...] :删除一个key。
  • flushdb :删除当前数据库中的所有key。
  • flushall :删除所有数据库中的所有key。
  • expire 键名 秒数 :指定一个key的过期时间。
  • ttl 键名 :返回一个key的剩余存活时间。如果key存在,但没有过期时间,则返回-1;如果key不存在,则返回-2。
  • persist 键名 :去掉一个key的过期时间。
  • type 键名 :返回key关联的值的类型。可能的返回值:string,hash,list,set,zset,none(key不存在)。
  • help 命令 :查看命令的帮助文档。

时间复杂度:

命令 时间复杂度
keys O(n)
dbsize O(1)
del O(1)
exists O(1)
expire O(1)
type O(1)

keys命令一般不要在生产环境使用。因为生产环境的key可能非常多,而遍历key是一个O(n)操作,需要花费很长时间。Redis是单线程执行模型,因此会阻塞其他功能的执行。如果有变量需求,则应使用scan命令。


2-2 数据结构和内部编码

image.png


2-3 单线程架构

Redis中,所有命令都是串行执行,不存在并发同步问题。
image.png
为什么采用单线程架构还能保持高性能?

  • 纯内存操作
  • 使用IO多路复用,减少了IO等待。
  • 避免了线程上下文切换和线程同步的消耗。

单线程的优点是不用考虑同步问题。但是也有缺点是慢指令会阻塞后续所有命令。所以应该避免在生产环境执行慢指令。
需要注意,Redis是“单线程执行模型”,但是其本身并不是单线程的。有很多独立的线程负责不同的工作。


2-4 基本数据结构——字符串

字符串键值结构

虽然名字叫字符串,但实际上有其他的数据类型也是以数据串作为底层结构来存储的。比如数字,bitmap。另外json字符串也是以字符串形式存储的。
string的值最大512MB。

命令

基本操作

  • get 键名 :获取key对应的value。O(1)。
  • set 键名 值 :设置key-value,不管key是否已存在。value必须为string类型。O(1)。
  • set 键名 值 nx :key不存在时,才设置。value必须为string类型。
  • set 键名 值 xx :key存在时,才设置。value必须为string类型。
  • setnx 键名 值 :key不存在时,才设置。(和set nx等价,未来该命令可能会移除)
  • getset 键名 新值 :将key设置为新值,并返回旧值。
  • append 键名 新值 :将新值追加到旧值后面。
  • strlen 键名 :返回值的字符串长度(注意中文)。
  • del 键名
  • mget key1 key2 key3 ... :批量获取。
  • mset key1 value1 key2 value2 key3 value3 ... :批量设置。批量操作节省了多次网络来回的时间,并且该命令是原子操作,所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。
  • getrange 键名 startIndex endIndex :获取值在指定index范围内的子串。
  • setrange 键名 index value :从index开始,用新值覆盖旧值。

    set文档:http://doc.redisfans.com/string/set.html

整型操作

  • incr 键名 :将key对应的value加1。如果key不存在,则新建该key,value为1。
  • decr 键名 :将key对应的value减1。如果key不存在,则新建该key,value为-1。
  • incrby 键名 n :将key对应的value加n。如果key不存在,则新建该key,value为n。
  • decrby 键名 n :将key对应的value减n。如果key不存在,则新建该key,value为-n。

    由于redis是单线程执行模型,因此它的整数操作都是原子性的。不会存在并发情况下的计数错误的情况。因此redis非常适合分布式环境下的计数。

浮点操作

  • incrbyfloat 键 浮点值 :将key对应的value加浮点值。如果key不存在,则新建该key,value为浮点值。

2.5 基本数据结构——Hash

Hash键值结构

Hash的的键是字符串,值是一个键值对的集合,键值对有field和value两个属性。同一个Hash中field不能重复。可见Hash类型就是一个嵌套的HashMap,或者说一个子Redis。
image.png

命令

所有Hash特有的命令都是以h开头。

  • hget key field :获取key对应的Hash的field的值。
  • hgetall key :获取key对应的Hash的所有键值对信息。
  • hvals key :获取key对应的Hash的所有值。
  • hkeys key :获取key对应的Hash的所有Field。
  • hset key field value :设置key对应的Hash的field的值。
  • hsetnx key field value :当field不存在时,设置。(若key不存在,则新增)
  • hmget key field1 field2 field3 ... :批量获取
  • hmset key field1 value1 field2 value2 .... :批量设置
  • hdel key field :删除key对应的Hash的field。
  • hexists key field :判断key对应的Hash是否有filed。
  • hlen key :获取key对应的hash的field的数量。
  • hincrby key filed value :filed自增。
  • hincrbyfloat key filed value :filed自增。

    2.6 基本数据结构——List

    List结构

    list是一个有序的双端列表。

    命令

    List的命令以l开头。个别以r开头,代表right。

  • rpush key value1 value2 ... valueN :从列表右端插入值。key不存在则新增。
  • lpush key value1 value2 ... lvaueN :从列表左端插入值。key不存在则新增。
  • linsert key before|after value newValue :在value前或后插入newValue。

  • lpop key :从列表左侧弹出一个item。

  • rpop key :从列表右侧弹出一个item。
  • blpop key timeout :lpop的阻塞版本,除非有元素可以pop,否则一直阻塞。timeout是超时时间,0代表永不超时。该命令可实现阻塞队列。
  • brpop key timeout :rpop的阻塞版本。该命令可实现阻塞队列。

    注意,当有多个客户端同时Block时,这几个队列是抢占式的。如果列表中插入新元素,则只会有一个客户端获取到这个新元素,并退出阻塞状态,其他客户端将继续阻塞。

  • lrem key count value :根据count的值,从列表中删除所有与value相等的项:

    • count>0,从左到右,删除最多count个value相等的项;
    • count<0,从右到左,删除最多Math.abs(count)个value相等的值;
    • count=0,删除所有与value相等的值。
  • ltrim key startIndex endIndex :只保留指定范围内的元素,其他都删除。

  • lset key index newValue :设置指定索引值为newValue。

  • lrange key startIndex endIndex :获取指定范围内的所有Item。包含startIndex和endIndex。startindex和endIndex可以为负数。查询所有元素: lrange key 0 -1

  • lindex key index :获取指定索引处的元素。
  • llen key :获取列表长度。

    Stack = rpush + rpop Queue = rpush + lpop 固定大小集合 = rpush + ltrim MQ = rpush + blpop


2.7 基本数据结构——Set

Set结构

不允许存在重复元素。
元素没有顺序。
直接Set间求并、交、差。

命令

Set命令以S开头。

  • sadd key element1 element2 ... :向set中添加元素,返回成功添加的元素数量。
  • srem key element1 element2 ... :从set中移除元素,返回成功移除的元素数量。
  • smembers key :返回Set中所有元素。元素多时谨慎使用。考虑使用 sscan
  • scard key :获取Set中元素个数。
  • sismember key value :判断一个value是否在set中。如果在,则返回1;否则返回0。
  • srandmember key [count] :从set中随机返回一个或多个元素。不会删除元素。
  • spop key :从set中随机删除一个元素,并返回该元素。
  • sscan

集合间的操作:

  • sinter key1 key2 [key3 key4 ...] :求交集。
  • sunion key1 key2 [key3 key4 ...] :求并集。
  • sdiff key1 key2 [key3 key4 ...] :求差集。

2.8 基本数据结构——Sorted Set

Sorted Set结构

sorted set的值由score和value两部分组成,值按照score从小到大排序。Sorted Set的value也是不可以重复的,但score是可以重复的。
image.png

命令

Sorted Set命令以z开头

  • zadd key score element [score2 element2] :添加score和element。O(logN)。
  • zrem key element element2 :删除element。O(1)。
  • zscore key element :获取element的score。O(1)
  • zincrby key increScore element :增加或减少元素的分数。O(1)
  • zcard key :返回元素的总个数。O(1)。
  • zrank key element :返回指定元素在Set中从低到高排序的排名。
  • zrange key start stop [WITHSCORES] :返回指定index范围内的元素,元素从低到高排序。O(logN+m)。
  • zrangebyscore key minSocre maxScore [WITHSCORES] :返回指定分数范围内的元素,元素从低到高排序。O(logN+m)。
  • zcount key minScore maxScore :返回指定分数范围内的元素个数。O(logN+m)。
  • zremrangebyrank key start end :删除指定排名范围内的元素。O(logN+m)。
  • zremrangebyscore key minSocre maxScore :喊出指定分数范围内的元素。O(logN+m)。
  • ……
  • zrevrank key element :返回指定元素在Set中从高到低排序的排名。
  • zrevrange key start stop [WITHSCORES] :返回指定index范围内的元素,元素从高到低排序。O(logN+m)。
  • zrevrangebyscore key start stop [WITHSCORES] :返回指定分数范围内的元素,元素从高到低排序。O(logN+m)。
  • zinterstore :求交集
  • zunionstore :求并集