一、通用命令
1.1、通用命令
keys * :所有key
1 | 127.0.0.1:6382> set k1 v1 |
keys [..]
dbsize:数据库中key的总数
1 | 127.0.0.1:6382> dbsize |
exists key:key是否存在
1 | 127.0.0.1:6382> exists k1 |
del key [key …]:删除key-value
1 | 127.0.0.1:6382> del k1 |
expire key seconds:设置过期时间
1 | 127.0.0.1:6382> set k1 v1 |
ttl:查看过期时间
persis key:去掉过期时间
type key:返回key的类型
1 | 127.0.0.1:6382> type k2 |
1.2、数据结构和内部编码
1.3、单线程架构
单线程为什么还这么快?
(1)、redis是纯内存的
(2)、redis是非阻塞式IO
(3)、避免线程切换和竞态消耗
单线程需要注意什么?
(1)、一次只运行一条命令
(2)、拒绝长(慢)命令(keys flushall slow lua script mutil/exec operate big value(collection))
(3)、其实并不是单线程
二、字符串类型
2.1、结构命令
get 获取值
时间复杂度: O(1)
set 设置值 O(1)
del O(1)
incr 自增(线程安全)
decr
incrby
decrby
2.2、快速实战
做计数器
缓存视频的基本信息
分布式的id生成器
set:无论key是否存在都设置
setnx:key存在才设置
setxx:key存在才设置
1 | 127.0.0.1:6382> exists php |
mget:批量获取 O(n)
mset批量设置 O(n)
1 | 127.0.0.1:6382> mset k3 3 k4 4 k5 5 |
2.3、内部编码
2.4、查缺补漏
getset key newvalue: 返回旧值,设置新值
append key value:将value追加到旧值
strlen key:返回字符串的长度
incrbyfloat key 3.5
getrange key start end
setrange key index value
三、哈希类型
3.1、特点
key filed value
例如:
key:表名
filed:属性
value:属性值
filed不能相同
3.2、重要API
hget key filed
hset key filed value
hdel key filed
1 | 127.0.0.1:6382> hset user:1:info age 23 |
hexists
hlen
hmget
hmset
1 | 127.0.0.1:6382> hexists user:1:info name |
O(n)
hgetall key:返回hash key对应所有的field 和 value(小心使用)
hvals key:返回hash key 对应所有field的value
hkeys key:返回hash key对应所有field
3.3、string|hash
string | hash |
---|---|
get | hget |
set setnx | hset hsetnx |
del | hdel |
incr incrby decr decrby | hinc hdecr hincrby hincr |
mset | hmset |
mget | hmget |
3.4、实战
实现如下功能:
记录每个人主页访问量?
hincrby user:1:info pageview count
缓存视频的基本信息?
四、列表类型
key elements
user:1:message a b c d e f
4.1、特点
有序
可重复
左右两边插入弹出
4.2、重要API
rpush
rpush key v1 v2 v3...Vn:从列表右端插入值(1~N个)
rpush listkey c b a
c--->b--->a
lpush
lpush key v1 v2 v3...Vn:从列表左边插入值(1~N个)
lpush listkey c b a
a<---b<---c
linsert
linsert key before|after value newValue:在list指定的值前|后插入newValue
a---b---c---d
linsert listkey before b java
a---java---b---c---d
linsert listKey after b php
a---b---php---c---d
lpop
lpop:从列表左边弹出一个item
a--b--c--d
lpop listKey
--b--c--d
rpop
a--b--c--d
rpop listKey
a--b--c--
lrem
lrem key count value
#根据count值,从列表中删除所有与value相等的项
(1)、count>0,从左到右,删除最多count个value相等的项
(2)、从右到左,删除最多Math.abs(count)个value相等的项
(3)、count=0,删除所有value相等的项
a---c---a---c---b---f
lrem listkey 0 a
---c---c----b---f
lrem listkey -1 c
a---c---a---b---f
ltrim
ltrim key start end:按照索引范围修剪列表
a---b---c---d---e---f
ltrim listkey 1 4
---b---c---d---e
lrange
lindex
lindex key index:获取列表指定索引的值
lset
lset key index newValue:设置列表指定索引为newValue
4.3、实战
4.4、查缺补漏
blpop
blpop key timeout:lpop阻塞版本,timeout是阻塞超时时间,timeout=0表示永不阻塞
brpop
与blpop同理
五、集合类型
5.1、特点
不允许重复
无序
支持集合间的操作
5.2、集合内API和实战
sadd
sadd key elements:添加
srem
srem key element:删除
scard sismember srandmember smembers
scard user:1:follow = 4 #计算集合大小
sismember user:1:follow it =1#判断it是否存在集合中
srandmember user:1:follow count =his#从集合挑选count个元素,不会破坏原集合
spop user:!:follow =sports#从集合中随机弹出一个元素
1 | 127.0.0.1:6382> sadd user:1:follow it new his sports |
微博抽奖
给用户添加标签
5.3、集合间API和实战
sdiff sinter sunion:差、交、并
六、有序集合类型
key score value
user:ranking 1 james
6.1、特点
无重复元素
有序
element+score
6.2、重要API
zadd
zadd key score element:添加score和element O(logN)
zrem
1 | rem key element:删除元素 |
zscore
zscore key element:返回元素分数
zinsrby
zincrby key increScore element:增加或减少元素分数
zincrby user:1:ranking 9 mike
zcard:
zcard key :返回元素个数
zrange
zrange key start end [WITHSCORES]
6.3、实战
排行版
6.4、查缺补漏
zrevrank
zrevrange