redisAPI整理
全局命令
1、查看所有键 keys *
2、键总数 dbsize
3、检查键是否存在 exists key
4、删除键 del key del key1 key2 key3
5、键过期 expire key seconds 大于0的整数表示剩余过期时间;-1表示已过期;-2表示键不存在;ttl key返回键剩余时间
数据结构和内部编码
1、查询内部编码 object encoding key
字符串
命令
常用命令
1、设置值
set key value[ex seconds] [px milliseconds] [nx|xx]
setex key seconds value
setnx key value
2、获取值 get key
3、批量设置值 mset key value [key value]
4、批量获取值 mget key [key ...]
5、计数
incr key
decr key
incrby key increment
decrby key decrement
incrbyfloat key increment
不常用命令
1、追加值 append key value
2、字符串长度 strlen key 每个中文字占用3个字节
3、设置并返回原值 getset key value
4、设置指定位置的字符 setrange key offeset value
5、获取部分字符串 getrange key start end
字符串内部编码
1、int 8个字节的长整型
2、embstr 小于等于39个字节的字符串
3、raw 大于39个字节的字符串
应用场景
1、缓存功能
2、计数
3、共享session
4、限速
哈希
命令
1、设置值 hset key field value 例:hset user:1 name tom
2、获取值 hget key field 例:hget user:1 name
3、删除field hdel key field 例:hdel user:1 name
4、计算field个数 hlen key
5、批量设置或获取field-value hmget key field [field ...]
hmset key field value [field value ...]
6、判断field是否存在 hexists key field
7、获取所有field hkeys key
8、获取所有key hvals key
9、获取所有的field-value hgetall key
10、hincrby hincrbyfloat
11、计算value的字符串长度 hstrlen key field
内部编码
1、ziplist field个数比较少且没有大的value时
2、hashtable 当有value大于64字节/field个数超过512
使用场景
1、使用hash类型缓存用户信息
(1)原生字符串类型:每个属性一个键
(2)序列化字符串类型:将用户信息序列化后用一个键保存
Set user:1 serialize(userInfo)
(3)hash类型:每个用户属性使用一对field-value,但是只用一个键保存
列表
命令
添加操作
(1)从右边插入元素
rpush key value [value ...]
Lrange 0 -1从左到右获取列表所有元素
(2)从左边插入元素
lpush key value[value ...]
(3)向某个元素前或后插入元素
linsert key before|after pivot value
例:linsert listkey before b java
查找
(1)获取指定范围内的元素列表
lrange key start end
(2)获取列表指定索引下标的元素
lindex key index
(3)获取列表长度
Llen key
删除
(1)从列表左侧弹出元素
(2)从列表右侧弹出元素
(3)删除指定元素
(4)按照索引范围修剪列表
修改
修改指定索引下标的元素
lset key index newvalue
阻塞操作
blpop key [key ...] timeout
brpop key[key ...] timeout
timeout:阻塞时间(单位:秒)
(1)列表为空:如果timeout=3,那么客户端要等到3秒后返回,如果timeout=0,那么客户端一直阻塞等下去。
(2)列表不为空:客户端立即返回。
注意:在使用brpop时,有两点需要注意
1.如果是多个键,那么brpop会从左到右遍历键,一旦有一个键能弹出元素,客户端立即返回。
2.如果多个客户端对同一个键执行brpop,那么最先执行brpop命令的客户端可以获取到弹出的值。
内部编码:
(1)元素个数较少且没有大元素时,内部编码为ziplist
(2)元素个数超过512个,内部编码变为linkedlist
(3)某个元素超过64字节,内部编码也会变为linkedlist
使用场景
1、消息队列
2、文章列表
列表使用口诀:
lpush+lpop=Stack
Lpush+rpop=Queue
Lpush+ltrim=Capped Collection
Lpush+brpop=Message Queue
集合(无序,不重复)
命令
集合内操作
(1)添加元素
sadd key element [element...]
(2)删除元素
srem key element [element ...]
(3)计算元素个数
scard key
(4)判断元素是否在集合中
sismember key element
(5)随机从集合返回指定个数元素
srandmember key [count]
(6)从集合随机弹出元素
spop key
(7)获取所有元素
smember key
集合间操作
(1)求多个集合的交集
sinter key [key...]
(2)求多个集合的并集
sunion key [key...]
(3)求多个集合的差集
sdiff key [key...]
(4)将交集、并集、差集的结果保存
sinterstore destination key [key...]
sunionstore destination key[key...]
sdiffstore destination key[key...]
例:sinterstore user:1_2:inter user:1:follow user:2:follow
内部编码
(1)当元素个数较少且都为整数时,内部编码为intset
(2)当元素个数超过512个,内部编码变为hashtable
(3)当元素个数不为整数时,内部编码为hashtable
使用场景
1、给用户添加标签
2、给标签添加用户
3、删除用户下的标签
4、删除标签下的用户
5、计算用户共同感兴趣的标签
有序集合(不重复,有排序)
命令
集合内
(1)添加成员
zadd key score member [score member...]
例:zadd user:ranking 251 tom
nx:必须不存在,用于添加
xx:必须存在,用于更新
ch:返回此次操作后,有序集合元素和分数发生变化的个数
incr:对score做增加,相当于后面介绍的zincrby
(2)计算成员个数
zcard key
(3)计算某个成员的分数
zscore key member
(4)计算成员排名
zrank key member(从低到高)
zrevrank key member(从高到低)
(5)删除成员
zrem key member [member...]
(6)增加成员的分数
zincrby key increment member
例:zincrby user:ranking 9 tom
(7)返回指定排名范围的成员
zrange key start end [withscore]
zrevrange key start end [withscore]
(8)返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key min max [withscores] [limit offset count]
例:zrangebyscore user:ranking 200 tinf withsore
(9)返回指定分数范围成员个数
zcount key min max
(10)删除指定排名内的升序元素
zremrangebyrank key start end
(11)删除指定分数范围的成员
zremrangebyscore key min max
集合间操作
(1)交集
zinterstore destination numkeys key [key...] [weights weight [weight...]] [aggregate sum|min|max]
参数说明:
destination:交集计算结果保存到这个键
numkeys:需要做交集计算键的个数
key [key...]:需要做交集计算的键
weights weight [weight...]:每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1
aggregate sum|min|max:计算成员交集后,分值可以按照sum、min、max做汇总,默认值是sum
例:
zinterstore user:ranking:1_inter_2 2 user:ranking:1 user:ranking:2
zinterstore user:ranking:1_inter_2 2 user:ranking:1 user:ranking:2 weight 1 0.5 aggregate max
(2)并集
zunionstore destination numkeys ke [key...] [weights weight [weight...]] aggregate sum|min|max
内部编码
(1)当元素个数较少且每个元素较小时,内部编码为skiplist
(2)当元素个数超过128个,内部编码变为ziplist
(3)当某个元素大于64字节时,内部编码变为hashtable
使用场景
1、添加用户赞数
2、取消用户赞数
3、展示获取赞数最多的十个用户
4、展示用户信息以及用户分数
键管理
单个键管理
(1)键重命名
rename key newkey
renamenx只有newkey不存在时才被覆盖
(2)随机返回一个键
randomkey
(3)键过期
expire key seconds
expireat key timstamp
ttl/pttl用于查询键剩余过期时间,pttl精度更高,可以达到毫秒级
毫秒级过期方案:
pexpire key milliseconds:键在milliseconds毫秒后过期
pexpire key millseconds-timestamp 键在毫秒级时间戳timestamp后过期
注意:
如果expire key的键不存在,返回结果为0
如果过期时间为负值,键会立即被删除,如del一样
persist命令可以将键的过期时间清除
对于字符串类型间,执行set命令会去掉过期时间
不支持二级数据结构
setex命令作为set+expire的组合,不但是原子执行,同时减少了一次网络通讯的时间
(4)迁移键
move
move key db
dump+store
dump key
restore key ttl value
迁移过程如下:
1、在源Redis上执行dump
2、在目标Redis上执行restore
3、migrate(重要,需要深入研究)
遍历键
(1)全量遍历键
keys pattern
(2)渐进式遍历
scan cursor [match pattern] [count number]
数据库管理
(1)切换数据库
select dbIndex
(2)flushdb/flushall