通用结构
- keys 键数
keys * 显示出所有键数
keys [pattern]
keys 命令一般不再生产环境中使用 - dbsize 计算key的总数
可在线上使用的 - exists key名 判断是否存在
0不存在 1存在 - del key名 [key名...]
0不存在 1成功 - expire key seconds 设置过期时间
key在seconds秒后过期
查询过期时间 ttl key
去掉过期时间 persist key
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 20
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 15
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> ttl hello
(integer) -2//过期 -1不存在过期时间
127.0.0.1:6379> get hello
(nil)
- type key 类型
数据类型
数据结构与内部编码

单线程

类型
字符串类型string
<code>value不能大于512m,最好不超过100k
场景:
缓存
计数器
分布式锁
命令:
get
set
del
---
incr key 自增1,如果key不存在,为1
decr key 自减1,如果key不存在,为-1
incrby key k 自增k,key不存在为k
decr key k 自减k,key不存在则为-k
---
set key value 不管key是否存在,都设置
setnx key value key不存在,才设置
set key value xx key存在,才设置
---
mget key1 key2 批量获取
mset key1 value2 key2 value 2 批量设置
n次get=n次网络时间+n次命令时间
1次mget = 1次网络时间+n次命令时间
---
getset key newvalue 设置新的value,并返回旧的value
append key value 将value追加到旧的value
strlen key 返回字符串的长度(注意中文)
---
incrbyfloat key 3.5 增加key对应的值3.5
getrange key start end 获取字符串指定下标所有的值
setrange key index value 设置指定下标所有对应的值

实战
1.浏览量:
incr userid:pageview(单线程无竞争)转化成json序列化
2.缓存视频的基本信息(数据源在数据库伪代码)

3.分布式id计数器
</code>
哈希类型hash
相当于小的redis

<code>命令:
hget key field 获取hash key对应的field的value
hset key field value 设置hash key 对应field的value
hdel key field 删除hash key对应field的value
例:
hset user:1:info age 23
hget user:1:info age
hgetall user:1:info
hdel user:1:info age
---
hexists key field 判断hash key 是否有field
hlen key 获取hash key field的数量
例:
hexists user:1:info name
hlen user:1:info
---
hmget key field1 field2 批量获取field的值
hmset key field1 value1 field2 value2
例:
hmset user:2:info age 30 name xx
hget user:2:info age name
---
hgetall key o(n) 返回hash key所对应的field和value
hvals key o(n) 返回hash key所对应的field和value
hkeys key o(n) 返回hash key所对应的field
例:
hgetall user:2:info
---
hsetnx key field value 设置hash key 对应field的value(如果field已经存在,则失败)
hincrby key field intCounter hash key对应的field的val自增intCounter
hincrbyfloat key field floatCounter 自增浮点数

实战:
1.用户的访问量
hincrby user:1:info pageview count
2.缓存视频的基本信息

</code>
列表类型list
特点:
有序
可重复
左右两边插入弹出
命令:
插
rpush key value1 value2... o(n) 从列表的右端插入值
lpush key value1 value2... o(n) 左端
linsert key before|after vlaue newValue o(n) 在list指定的值前|后插入newValue
删
lpop key o(1) 从左边弹出一个
rpop key o(1) 从右边弹出一个

ltrim key start end o(n) 按照索引范围修剪列表
ltrim key 1 5
查
lrange key start end (包含end) o(n) 获取列表指定索引范围的所有item
右->左 -1---
lindex key index o(n) 获取列表指定索引的item
llen key o(1) 获取列表长度
改
lset key index newValue o(n) 设置列表指定索引值为newValue

blpop key timeout o(1) lpop阻塞版本,timeout是阻塞超时时间,0为永不堵塞
brpop key timeout
实战:
1.微博列表
tip
1. lpush+lpop = stack
2. lpush+rpop = queue
3. lpush+ltrim = capped collection
4. lpush + brpop = message queue
集合类型set
特点:
无序/无重复/集合间的操作
sinter 两者的相同
sdiff 两者的不同
sunion 两者的全部
命令:
添加
sadd key element o(1) 向集合key中添加element(如果element已存在,添加失败)
删除
srem key element o(1) 将集合中element移除
scard user:1:follow (= 4) 计算集合的大小
sismember user:1:follow it (= 1(存在)) 判断it是否在集合中
srandmember user:1:follow count (= his) 从集合中挑选count个元素
spop user:1:follow (= sports) 从集合中随机弹出一个元素
smembers user:1:follow (= music his it) 获取集合中所有元素
---

集合间的命令
sdiff user:1:follow user :2:follow 差集
sinter user:1:follow user :2:follow 交集
sunion user:1:follow user :2:follow 并集
sdiff|sinter|sunion + store destkey... 将差交并的结果保存到destkey中

实战:
抽奖
有序集合类型zset


命令:
score可重复/element不能重复
添加
zadd key score element(可以是多对) o(logN) 添加score 和element
删除
zrem key element(可以是多对) o(1) 删除元素
zscore key element o(1) 返回元素的分数
zincrby key increScore element 增加或减少元素的分数
zincrby user:1:ranking 9 mike
zcard key o(1) 返回元素的个数

zrange key start end [WITHSCORES] o(log(n)+m) 返回指定索引范围内的升序元素[分值] n,总的个数 m,统计的个数
zrange user:1:ranking 1 3 withscores






实战:
排行榜