redis API的理解和使用

redis提供5中数据结构,理解每种数据结构的特点及命令,对开发运维非常重要。本文总结5种数据结构的特点、命令使用、应用场景和内部编码及单线程处理机制分析。

一、全局命令

1、查看所有键(keys *)

2、键总数(dbsize)

3、检查键是否存在(exists),存在返回1,不存在返回0

4、删除键(del)无论什么数据类型,都可以删除,成功返回删除键的个数,删除不存在的键,返回0

del支持删除多个键

5、键过期(expire key seconds)

redis支持对键添加过期时间,超过过期时间,redis自动删除键,其中ttl命令可以查看剩余过期时间,ttl命令有3种返回值,大于等于0:键剩余的过期时间;-1:键没有设置过期时间;-2:键不存在

6、建的数据结构类型(type key)

如果键不存在则返回none

二、数据结构和内部编码

1、查询内部编码(object encoding key)

2、数据结构与内部编码

设计优势:1、改进内部编码却不影响对外的数据结构和命令;2、多种内部编码实现可以适应不同场景,充分利用reidis的性能,例如少量数据可以使用ziplist比较节省内存,在列表元素比较多的时候应该选择linkedlist

三、单线程架构

1、redis基本模型

redis客户端命令到达服务端不会立刻被执行,所有命令都会进入一个队列中,逐个执行,执行顺序是不确定的,与客户端命令输入顺序无关。可以确定每次执行一条命令,不会产生并发问题。同时redis使用I/O多路复用技术解决I/O问题

2、redis基于单线程却快速的原因

第一、纯内存访问;第二、非阻塞I/O,redis使用epoll实现多路复用,避免网络I/O浪费时间;第三、单线程避免多线程模式下切换和竞争产生的消耗

3、redis缺陷

单线程模型无形中对每个命令执行时间进行了约束,假如某个命令执行时间过长,会造成队列中后续命令的阻塞,所以redis适合快速执行场景的应用。

四、数据结构解析

字符串

字符串是redis最基础的数据结构,最大不超过512M

1、  常用命令

(1)      设置值(set key value {ex second} {px milliseconds}{nx|xx})

(2)      获取值(get key)

(3)      批量设置值(mset key value[key value key value ····])

(4)      批量获取值(mget key key key·····)

(5)      计数(incr key自增)(decrkey自减)(incrby key increment自增指定数值)

2、  非常用命令

(1)追加值(append key value)

(2)字符串长度(strlen key)

(3)设置并返回原值(getset key value)

(4)设置指定位置的字符/替换(setrange key offeset value)

(5)获取部分字符/截取(getrang key start end)

 

3、  内部编码

Int:8字节的长整型

Embstr:小于等于39字节的字符串

Raw:大于39字节的字符串

哈希

哈希类型是指键值本身又是一个键值对结构,例如value={{filed1,value},{filed2,value},····}

1、命令

(1)设置值(hset key field value)

(2)获取值(hget key field)

(3)删除field(hdel key field[field,field····])

(4)计算field个数(hlen key)

(5)批量设置(hmset key field value[field value,field value···])

(6)批量获取(hmget key field [field,field,field····])

(7)判断field是否存在(hexists key field)

(8)获取所有field(hkeys key)

(9)获取所有value(hvals key)

(10)获取所有的field-value(hgetall key)

(11)自增(hincrby hincrbyfloat)

(12)计算value的字符串长度(hstrlen key field)

2、内部编码

Ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置、同事所有值都小于hash-max-ziplist-value时,redis使用ziplist,比hashtable更节省内存。

Hashtable(哈希表):当哈希类型无法满足ziplist的条件时,redis使用hashtable。

编码规则:

1)当field个数比较少且没有大的value时,内部编码为ziplist;

2)当有value大于64字节,内部编码由ziplist变为hashtable;

3)当field个数超过512,内部编码由ziplist变为hashtable;

列表

列表用于存储多个有序的字符串,一个列表最多存储-1个元素,redis可以对列表两端插入(push)和弹出(pop)。

1、命令

(1)添加

1)从右边插入元素(rpush key value[value value ····])

2)从左边插入元素(lpush key value[value value····])

3)向某个元素前或者后插入数据(linsert key before|afterpivot value)

(2)查找

1)获取指定范围内的元素列表(lrang key start end)

2)获取列表指定索引下标的元素(lindex key index)

3)获取列表长度(llen key)

(3)删除

1)从列表左侧弹出元素(lpop key)

2)从列表右侧弹出(rpop key)

3)删除指定元素(lrem key count value)

4)按照索引范围截取列表(ltrim key start end)

(4)修改

1)修改指定索引下标的元素(lset key indexnewvalue)

(5)阻塞

1)阻塞弹出

blpop key[key ···]timeout

brpop key[key ···]timeout

注:

1)

2、内部编码

Ziplist(压缩列表):当哈希类型元素个数小于list-max-ziplist-entries配置、同时所有值都小于list-max-ziplist-value时,redis使用ziplist,比hashtable更节省内存。

linkedlist(链表):当哈希类型无法满足ziplist的条件时,redis使用linkedlist。

编码规则:

1)当field个数比较少且没有大的value时,内部编码为ziplist;

2)当元素value大于64字节,内部编码由ziplist变为linkedlist;

3)当元素个数超过512个,内部编码由ziplist变为linkedlist;

集合

集合类型用来保存多个的字符串元素,但和列表类型不一样,集合中不允许有重复元素,且元素是无序,不能通过索引下标获取元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。

1、集合内操作

1)添加元素(sadd key element[elementelement····])

2)删除元素(srem key element[elementelement····])

3)计算元素个数(scard key)

4)判断元素是否在集合中(sismember key element)

5)随机从集合返回指定个数元素(srandmember key [count])

6)从集合随机弹出元素(spop key)

7)获取所有元素(smembers key)

2、集合间操作

1)多个集合的交集(sinter key [key ····])

2)多个集合的并集(suinon key[key ····])

3)多个集合的差集(sdiff key [key ····])

4)将交集、并集、差集的结果保存

sinterstore destination key [key ····]

suinonstore destination  key[key ····]

sdiffstore destination  key [key ····]

3、内部编码

inset(整数集合):当哈希类型元素个数小于set-max-inset-entries配置,redis使用inset,比hashtable更节省内存。

hashtable(哈希表):当哈希类型无法满足inset的条件时,redis使用hashtable。

编码规则:

1)当元素个数比较少且都为整数时,内部编码为inset;

2)当元素value不为整数,内部编码由inset变为hashtable;

3)当元素个数超过512个,内部编码由inset变为hashtable;

有序集合

有序集合不能重复,可以排序。它和列表使用索引下标作为排序依据不同,它给每个元素设置一个分数作为排序依据。(元素不能重复,score可以重复)

1、集合内

1)添加成员(zadd key score member[scoremember ····])

2)计算成员个数(zcard key)

3)计算某个成员的分数(zscore key member)

4)计算成员排名(zrank key member)

5)删除成员(zrem key member[membermember····])

6)增加成员的分数(zincrby key incrementmember)

7)返回指定排名范围的成员

zrang key start end[withscores]从低到高

zrevrang key startend[withscores]从高到底

8)返回指定分数范围的成员

zrang key min max[withscores] [limit offset count]从低到高

zrevrang key min max[withscores] [limit offset count]从高到底

9)返回指定分数范围成员个数(zcount key min max)

10)删除指定排名内的升序元素(zremrangbyrank key startend)

11)删除指定分数范围的成员(zremrangbyscore by min max)

2、集合间

1)交集

zinterstore destination numkeyskey[key ···] [weights weight [weight ····]] [aggregate sum|min|max]

2)并集

Zunionstore destination numkeys key[key ···] [weights weight [weight ···]] [aggregate sum|min|max]

3、内部编码

ziplist(压缩列表):当哈希类型元素个数小于zset-max-ziplist-entries配置、同事所有值都小于zset-max-ziplist-value时,redis使用ziplist,比skiplist更节省内存。

skiplist(跳跃表):当哈希类型无法满足ziplist的条件时,redis使用skiplist。

编码规则:

1)当元素个数比较少且没有大的value时,内部编码为ziplist;

2)当元素value大于64字节时,内部编码变为skiplist;

3)当元素个数超过128个,内部编码由ziplist变为skiplist;

键管理

1、单个键管理

1)键重命名(rename key newkey)

2)随机返回一个键(randomkey)

3)键过期

Expire key seconds:键在seconds秒后过期

Expireat

4)迁移键

a)        move直接迁移

b)        dump(序列化)+restore(反序列化)

c)        migrate

2、遍历键

1)全量遍历键(keys *)

2)渐进式遍历(scan cursor [match pattern][count number] )

2、数据库管理

1)切换数据库(select dbindex)

2)清除数据库(flushdb/flushall)