通用命令
1.keys pattern
- 含义:查找所有符合给定模式(pattern)的key
- keys * 遍历所有key
- keys he[h-l]* 遍历以he开头,第三个字符为h-l之间的所有key
- keys ph? ?代表一个字符
- 注意:keys命令一般不在生产环境中使用
- 生产环境的key比较多,keys这个命令是一个O(n)的命令
- 由于Redis是单线程的,这个命令的操作会阻塞其他操作
- 可以在从节点上执行keys命令
- 使用SCAN命令代替keys命令
2.dbsize
- 含义:查找当前数据库的key的数量
3.exists key
- 含义:检查给定的key是否存在
4.del key1 [key2…]
- 含义:在key存在时删除key
5.expire key second
- 含义:为给定key设置过期时间,单位为秒
6. ttl key
- 含义:以秒为单位,返回给定key的剩余生存时间(TTL , time to live)
- 不存在key返回-2
- 无过期时间的key返回-1
7.persist key
- 含义:移除key的过期时间,key将持久保存
8.type key
- 含义:返回key所存储的值的类型
- 不存在的key返回none
String数据类型
String-结构
- 结构:Key-Value对
- Value:可以是字符串、数字,也可以是二进制数组
- 限制:Value最大值为512MB
String-常用命令
1.get key
- 含义:获取指定key的值
2.set key value
- 含义:设置指定key的值
3.incr key
- 含义:将key中存储的数字值增一
4.incrby key increment
- 含义:将key所存储的数字值加上给定的增量
5.decr key
- 含义:将key中存储的数字值减一
6.decrby key decrement
- 含义:将key所存储的数字值减去给定的减量
7.setnx key value
- 含义:只有当key不存在时才设置key的值
8.set key value nx
- 含义:与⑦相同,只有当key不存在时才设置key的值
9.setex key second value
- 含义:设置指定key的值,同时设置该key的过期时间,单位为秒
10.set key second value ex
- 含义:与⑨相同,设置指定key的值,同时设置该key的过期时间,单位为秒
11.set key value xx
- 含义:只有key存在时才设置key的值
12.mget key1 [key2…]
- 含义:获取所有(一个或多个)指定key的值
13.mset key1 value1 [key2 value2…]
- 含义:同时设置一个或多个key-value对
String-不太常用命令
1.getset key value
- 含义:将给定key的值设置为value,并返回key的旧值
2.append key value
- 含义:将value追加到旧值的末尾
3.strlen key
- 含义:返回key所存储的字符串值的长度
- 当key不存在时,返回0
- 一个中文占2个字节
- 时间复杂度为O(1),strlen在redis内部不需要查询整个字符串来得到长度
4.incrbyfloat key increment
- 含义:将key所存储的值加上给定的浮点值
5.getrange key start end
- 含义:返回key中字符串区间为[start,end]的子串,索引从0开始
6.setrange key offset value
- 含义:用value擦书覆盖指定key所存储的字符串值,从偏移量offset开始,索引从0开始
- key = content的时候,执行setrange key 1 haha 之后,key=chahant
Hash数据类型
Hash-常用命令
1.hget key field
- 含义:获取存储在哈希表中指定field的值
2.hset key field value
- 含义:将哈希表中指定field的值设置为value
3.hdel key field1 [field2…]
- 含义:删除哈希表中一个或多个field
4.hexists key field
- 含义:判断哈希表中,指定field是否存在
5.hlen key
- 含义:获取哈希表中字段的数量
6.hmget key field1 [field2…]
- 含义:获取哈希表中所有给定field的值
7.hmset key field1 value1 [field2 value2…]
- 含义:同时将一个或多个field-value对设置到哈希表中
8.hincrby key fiel increment
- 含义:为哈希表中指定field的值加上一个整型增量
9.hgetall key
- 含义:获取哈希表中所有字段和值
- 时间复杂度为O(n),不建议使用
10.hkeys key
- 含义:获取哈希表中的所有字段
- 时间复杂度为O(n),不建议使用
11.hvals key
- 含义:获取哈希表中的所有值
- 时间复杂度为O(n),不建议使用
12.hsetnx key field value
- 含义:只有当哈希表中field不存在时,才设置该field的值
13.hincrbyfloat key field increment
- 含义:为哈希表中指定field的值加上一个浮点数增量
List数据类型
List-结构
- 列表:有序、可以有重复元素
- 索引相关知识
- 索引从左往右,从0开始逐个增大 0 1 2 3 4 5
- 索引从右往左,从-1开始逐个减小 -6 -5 -4 -3 -2 -1
List-常用命令
1.rpush key value1 [value2…]
- 含义:在列表后侧添加一个或多个值
2.lpush key value1 [value2…]
- 含义:在列表左侧添加一个或多个值
3.linsert key before/after value newValue
- 含义:在列表指定的value前/后插入newValue,时间复杂度为O(n)
4.lpop key
- 含义:从列表左侧弹出一个值
5.rpop key
- 含义:从列表右侧弹出一个值
6.lrem key count value
- 含义:根据count值,从列表中删除值为value的项,时间复杂度为O(n)
- count > 0 时,从左往右遍历,删除最多count个与value相等的值
- count < 0 时,从右往左遍历,删除最多Math.abs(count)个与value相等的值
- count = 0 时,删除所有与value相等的值
7.ltrim key start end
- 含义:对一个列表进行修剪,只保留指定区间内的元素,不在区间内的元素都将被删除,时间复杂度为O(n)
8.lrange key start end
- 含义:获取列表指定索引范围的所有元素,时间复杂度为O(n)
9.lindex key index
- 含义:获取列表指定索引的元素,时间复杂度为O(n)
10.llen key
- 含义:获取列表长度,时间复杂度为O(1)
11.lset key index newValue
- 含义:设置列表指定索引的值为newValue,时间复杂度为O(n)
- 注意:
- 必须存在这个值才能设置成功,否则会报错
12.blpop key timeout
- 含义:移除并获取列表左边第一个元素,如果列表没有元素会阻塞直到等待超时或可弹出元素为止
- timeout单位为秒,timeout=0时不阻塞
13.brpop key timeout
- 含义:移除并获取列表右边第一个元素,如果列表没有元素会阻塞直到等待超时或可弹出元素为止
- timeout单位为秒,timeout=0时不阻塞
Set数据类型
Set-结构
- 集合:无序、不能包含重复元素
Set-集合内操作
1.sadd key memebr1 [member2…]
- 含义:向集合中添加一个或多个成员
2.srem key member1 [member2…]
- 含义:从集合中删除一个或多个成员
3.scard key
- 含义:获取集合中的元素个数
4.sismember key member
- 含义:判断member元素是不是集合的成员
5.srandmember key count
- 含义:随机从集合中取出count个成员
6.spop key
- 含义:随机移除并返回集合中的一个成员
7.smembers key
- 含义:获取集合中的所有成员
- 时间复杂度为O(n),不建议使用,类似的操作可以使用SSCAN
Set-集合间操作
1.sdiff key1 [key2…]
- 含义:返回给定所有集合的差集
2.sdiffstore destKey key1 [key2…]
- 含义:计算给定所有集合的差集,并存入destKey
3.sinter key1 [key2…]
- 含义:返回给定所有集合的交集
4.sinterstore destKey key1 [key2…]
- 含义:计算给定所有集合的交集,并存入destKey
5.sunion key1 [key2…]
- 含义:返回给定所有集合的并集
6.sunionstore destKey key1 [key2…]
- 含义:计算给定所有集合的并集,并存入destKey
ZSet数据类型
ZSet-结构
- 有序集合:有序、不能包含重复元素
- 每个节点包含:score和value两个属性,根据score进行排序
- 索引相关知识
- 索引从左往右,从0开始逐个增大 0 1 2 3 4 5
- 索引从右往左,从-1开始逐个减小 -6 -5 -4 -3 -2 -1
ZSet-常用命令
1.zadd key score1 member1 [score2 member2…]
- 含义:向有序集合添加一个或多个成员,或者更新已存在成员的分数
2.zrem key member1 [member2…]
- 含义:从有序集合中删除一个或多个成员
3.zscore key member
- 含义:获取有序集合中成员的分数
4.zincrby key increment member
- 含义:对有序集合中指定成员的分数加上增量increment
5.zcard key
- 含义:返回有序集合中元素的总个数
6.zrange key start end [withscores]
- 含义:通过索引返回有序集合中指定区间的成员信息
- withscores 参数,加上代表一并将score数据返回
- 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=返回的总个数
7.zrangebyscore key min max [withscores][limit]
- 含义:通过score返回有序集合中指定分数区间的成员信息
- withscores 参数,加上代表一并将score数据返回
- limit参数,加上代表限制返回多少条数据
- 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=返回的总个数
8.zscore key min max
- 含义:返回有序集合中指定分数范围内的元素个数
- 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=指定分数范围内的元素个数
9.zremrangebyscore key min max
- 含义:删除有序集合中指定分数区间的所有成员
- 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=指定分数范围内的元素个数
10.zremrangebyrank key start end
- 含义:删除有序集合中给定索引区间的所有成员
- 时间复杂度:O(log(n) + m) , n=有序集合中的元素个数,m=指定索引范围内的元素个数
String VS Hash
相似的API
| String | Hash |
|---|---|
| get | hget |
| set setnx | hset hsetnx |
| del | hdel |
| incrby | hincrby |
| mget mset | hmget hmset |
保存对象的三种方式与优缺点
- 方式一:采用string,将整个对象进行序列化,设计Key为对象的业务ID
- 方式二:采用string,设计Key为对象的业务ID+属性名,对各个属性分散存储
- 方式三:采用hash,设计Key为对象的业务ID,属性名为field
| 优点 | 缺点 | |
|---|---|---|
| 方式一 | 访问Redis编程简单 相比方式二比较节约内存 |
序列化开销 修改属性需要操作整个数据 |
| 方式二 | Redis数据直观可查 可以方便更新属性 |
内存占用较大 key较为分散 |
| 方式三 | Redis数据直观可查 比起方式二比较节约内存 可以方便更新属性 |
访问Redis编码稍微比较复杂 TTL不好控制 |
API的理解和使用
通用命令
| 命令 | 说明 | 时间复杂度 |
|---|---|---|
| keys [pattern] | 遍历所有key | O(N) |
| dbsize | 遍历所有key | O(1) |
| exists | 检查key是否存在 | O(1) |
| del key | 删除指定的key-value | O(1) |
| expire key seconds | key在seconds秒后过期 | O(1) |
| ttl key | 查看key剩余的过期时间 | O(1) |
| persist key | 去掉key的过期时间 | O(1) |
| type key | 返回key的类型 | O(1) |
注意keys命令一般不再生产环境使用
** 演示**
1 | ➜ redis-4.0.8 redis-cli -h 127.0.0.1 -p 6382 |
数据结构和内部编码
图示

reidsObject

单线程
定义
单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。

单线程为什么这么快
- 纯内存
- 非阻塞IO
- 避免线程切换和竞态消耗
使用单线程要注意什么
- 一次只能运行一条命令
- 拒绝长(慢)命令
- keys
- flushall
- flushdb
- slow lua script
- mutil/exec
- operate big value(collection)
string
结构
| key | value |
|---|---|
| hello | world |
| counter | 1 |
| bits | 101111101110 |
可以是字符串(json);数字,以及二进制
使用场景
- 缓存
- 计数器
- 分布式锁
API
| 命令 | 说明 | 时间复杂度 |
|---|---|---|
| get key | 获取key对应的value | O(1) |
| set key value | 设置key value | O(1) |
| del key | 删除key-value | O(1) |
| incr | key自增1, 如果key不存在,自增后get(key) = 1 | O(1) |
| decr | key自减1, 如果key不存在,自增后get(key) = -1 | O(1) |
| incrby key k | key自增k, 如果key不存在,自增后get(key) = k | O(1) |
| decr key k | key自减k, 如果key不存在,自增后get(key) = -k | O(1) |
| set key value | 不管可以是否存在 | O(1) |
| setnx key value | key不存在,才设置 | O(1) |
| set key value xx | key存在,才设置 | O(1) |
| mget key1 key2 key3 | 批量获取key,原子操作 | O(N) |
| mset key1 value1 key2 value2 | 批量设置key-value | O(1) |
| getset key newvalue | set key newvalue并返回旧的value | O(1) |
| append key value | 将value追加到旧的value | O(1) |
| strlen key | 返回字符串的长度(注意中文,utf8下一个中文占用3个字符) | O(1) |
| incrbyfloat key 3.5 | 增加key对应的值3.5 | O(1) |
| getrange key start end | 获取字符串指定下标所有的值 | O(1) |
| setrange key index value | 设置指定下标所有对应的值 | O(1) |
练习
1 | 127.0.0.1:6382> set hello "world" |

实战
- 记录网站每个用户个人主页的访问量
1 | incr userid: pageview (**主要的是:单线程,所以无竞争)**) |
- 缓存视频的基本信息(数据源在mysql中)伪代码

- 分布式id生成器(单线程的好处)
1 | incr id |
hash
哈希键值结构

特点
- mapmap
- small redis
- field不能相同,value可以相同
API
| 命令 | 说明 | 时间复杂度 |
|---|---|---|
| hget key field | 获取hash key对应field的value | O(1) |
| hset key field value | 设置has key 对应的field的value | O(1) |
| hexists key field | 判断hash key 是否有field | O(1) |
| hlen key | 获取hash key field的数量 | O(1) |
| hmget key field1 field2…fieldN | 批量获取hash key的一批field对应的值 | O(N) |
| hset key field1 value1 field2 value2…fieldN valueN | 批量设置hash key的一批field value | O(1) |
| hgetall key | 返回hash key对应所有的field和value | O(N) |
| hvals key | 返回hash key对应所有的field的value | O(N) |
| hkeys key | 返回hash key对应所有的field | O(N) |
| hsetnx key field value | 设置has key 对应的field的value(如果field已经存在,则失败) | O(1) |
| hincrby key field intCounter | hash key对应的field的value自增intCounter | O(1) |
| hincrbyfloat key field floatCounter | 浮点数版本 | O(1) |
注意小心使用hgetall(牢记单线程)
练习
1 | 127.0.0.1:6382> hset user1 age 26 |
list
列表结构

特点
- 有序
- 可以重复
- 左右两边插入弹出
API
练习
1 | 127.0.0.1:6382> rpush list1 a b c d |
应用

set
定义
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
特点

- 无序
- 无重复
- 集合间操作
API
- 集合内的操作
| 命令 | 说明 | 时间复杂度 |
|---|---|---|
| sadd key element | 向集合key添加element(如果element已经存在,添加失败) | O(1) |
| srem key element | 将集合key中的element移除掉 | O(1) |
| scard key | 计算集合大小 | O(1) |
| sismember key element | 判断element 是否在集合中 | O(1) |
| srandmember key count | 从集合中随机挑count个元素 | O(1) |
| spop key | 从集合中随机弹出一个元素 | O(1) |
| smembers key | 获取集合所有元素 | O(1) |
| srem key element | 将集合key中的element移除掉 | O(1) |
- 集合间的操作
| 命令 | 说明 | 时间复杂度 |
|---|---|---|
| sdiff key1 key2 | 差集 | O(1) |
| sinter key1 key2 | 交集 | O(1) |
| sunion key1 key2 | 并集 | O(1) |
| sidff/sinter/suion + store destkey | 将差集、交集、并集保存在destkey中 | O(1) |
注意
- srandmember不会破坏集合
- spop会破会
- smembers 返回的是无序集合,并且要注意量很大的时候回阻塞
练习
1 | 127.0.0.1:6382> sadd set1 a b c d |
实战
- 抽奖系统, 用spop
- 赞过的文章,收藏过的文章等
- 标签
- 共同关注
总结
zset
定义
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
API
| 命令 | 说明 | 时间复杂度 |
|---|---|---|
| zadd key score element | 添加score和element | O(logN) |
| zrem key element(可以是多个) | 将集合key中的element移除掉 | O(1) |
| zscore key element | 返回元素的分数 | O(1) |
| zincrby key increScore element | 增加或减少元素的分数 | O(1) |
| zcard key | 返回元素的总个数 | O(1) |
| zrank(zrevrank) key member | 返回元素的排名 | O(1) |
| zrange(zrevrank) key start end [WITHSCORES] | 返回指定索引范围内的升序元素[分值] | O(logN + m) |
| zrangebyscore(zrevrangebyscore) key minScore maxScore | 返回指定分数范围内的升序元素 | O(logN + m) |
| zcount key minScore maxScore | 返回有序集合内在指定分数范围内的个数 | O(logN + m) |
| zremrangebyrank key start end | 删除指定排名内的升序元素 | O(logN + m) |
| zremrangebyscore key minScore maxScore | 删除指定分数内的升序元素 | O(logN + m) |
| ZINTERSTORE destination numkeys(表示key的个数) key [key …] | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 | |
| ZUNIONSTORE destination numkeys key [key …] | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
实战
- 各种榜单(score:timestamp, saleCount, followCount)
总结。 ⭐️ ⭐️ ⭐️ ⭐️

#