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 数据结构和内部编码

2-3 单线程架构
Redis中,所有命令都是串行执行,不存在并发同步问题。
为什么采用单线程架构还能保持高性能?
- 纯内存操作
- 使用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开始,用新值覆盖旧值。
整型操作
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。
命令
所有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是可以重复的。
命令
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:求并集
