一 通用命令
1.1 通用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
keys *
keys he*
keys he[h-l]
keys he?
dbsize
set a b
exists a (integer) 1
删除成功返回1,key不存在返回0
expire name 3 ttl name persist name
type name
info命令:内存,cpu,主从相关 client list 正在连接的会话 client kill ip:端口 dbsize 总共有多少个key flushall 清空所有 flushdb 只清空当前库 select 数字 选择某个库 总共16个库 monitor 记录操作日志,夯住
|
1.2 数据结构和内部编码
1.3 单线程架构
1.3.1 单线程架构,
一个瞬间只会执行一条命令
1.3.2 单线程为什么这么快
1 纯内存
2 非阻塞IO (epoll),自身实现了事件处理,不在网络io上浪费过多时间
3 避免线程间切换和竞态消耗
1.3.3 注意
1 一次只运行一条命令
2 拒绝长慢命令
-keys,flushall,flushdb,慢的lua脚本,mutil/exec,operate,big value
3 其实不是单线程(在做持久化是另外的线程)
-fysnc file descriptor
-close file descriptor
二 字符串类型
2.1 字符串键值结构
1 2 3 4 5 6
|
key value hello world 可以很复杂,如json格式字符串 counter 1 数字类型 bits 10101010 二进制(位图)
|
2.2 常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
get name set name lqz del name
incr age decr age incrby age 10 decrby age 10
set name lqz setnx name lqz set name lqz nx set name lqz xx
mget key1 key2 key3 mset key1 value1 key2 value2 key3 value3
getset name lqznb append name 666 strlen name
increbyfloat age 3.5 getrange key start end setrange key index value
|
三 哈希类型
###3.1 哈希值结构
3.2 重要api
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
hget key field hset key field value hdel key field
hset user:1:info age 23 hget user:1:info ag hset user:1:info name lqz hgetall user:1:info hdel user:1:info age
hexists key field hlen key hexists user:1:info name hlen user:1:info
hmget key field1 field2 ...fieldN hmset key field1 value1 field2 value2
hgetall key hvals key hkeys key
hincrby user:1:info pageview count
|
3.3 hash vs string
3.3.1相似的api
get | hget |
set /sentnx |
hset hsetnx |
del |
hdel |
incr incrby dear decrby |
hincrby |
mset |
hmset |
mget |
hmget |
3.3.2 缓存三种方案
直接json格式字符串
每个字段一个key
使用hash操作
3.4 其他操作
四 列表类型
4.1 列表特点
有序队列,可以从左侧添加,右侧添加,可以重复,可以从左右两边弹出
4.2 API操作
4.2.1 插入操作
1 2 3 4 5 6 7
|
rpush key value1 value2 ...valueN
|
4.2.2 删除操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
lpop key
|
4.2.3 查询操作
1 2 3 4 5 6 7 8 9
|
lrange key start end lrange listkey 0 2 lrange listkey 1 -1
lindex key index lindex listkey 0 lindex listkey -1
llen key
|
4.2.3 修改操作
1 2
|
lset key index newValue
|
4.3 实战
实现timeLine功能,时间轴,微博关注的人,按时间轴排列,在列表中放入关注人的微博的即可
4.4 其他操作
1 2 3 4 5 6 7 8 9 10 11
|
blpop key timeout
|
五 集合类型
5.1 特点
无序,无重复,集合间操作(交叉并补)
5.2 API操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
sadd key element
|
5.3 实战
抽奖系统 :通过spop来弹出用户的id,活动取消,直接删除
点赞,点踩,喜欢等,用户如果点了赞,就把用户id放到该条记录的集合中
标签:给用户/文章等添加标签,sadd user:1:tags 标签1 标签2 标签3
给标签添加用户,关注该标签的人有哪些
共同好友:集合间的操作
5.4 总结
sadd:可以做标签相关
spop/srandmember:可以做随机数相关
sadd/sinter:社交相关
六 有序集合类型
6.1 特点
1 2 3 4 5 6 7 8 9 10 11
|
key score value user:ranking 1 lqz user:ranking 99 lqz2 user:ranking 88 lqz3
集合:无重复元素,无序,element 有序集合:无重复元素,有序,element+score
列表:可以重复,有序,element 有序集合:无重复元素,有序,element+score
|
6.2 API使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
zadd key score element
zrem key element
zscore key element
zincrby key increScore element
zcard key
zrank key element
zrange key 0 -1 zrange player:rank 0 -1 withscores
zrangebyscore key minScore maxScore zrangebyscore user:1:ranking 90 210 withscores
zcount key minScore maxScore
zremrangebyrank key start end zremrangebyrank user:1:rangking 1 2
zremrangebyscore key minScore maxScore zremrangebyscore user:1:ranking 90 210
|
6.3 实战
排行榜:音乐排行榜,销售榜,关注榜,游戏排行榜
6.4 其他操作
6.5 总结
操作类型 | 命令 |
基本操作 |
zadd/ zrem/ zcard/ zincrby/ zscore |
范围操作 |
zrange/ zrangebyscore/ zcount/ zremrangebyrank |
集合操作 |
zunionstore/ zinterstore |
每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)