API的理解和使用
2.1 预备
2.1.1 全局命令
查看所有键
key *
插入字符串键值对
set hello world:hello是key,world是value
dbsize:键总数
插入列表类型的键值对:
rpush mylist a b c d e f g
dbsize直接获取Redis内置的键总数变量:O(1)
keys *则O(N)
检查键是否存在
exists key
del key无论值是什么数据结构类型
键过期
expire key seconds
查看键过期还剩多少时间
ttl
> 0
-1 键没设置过期时间
-2 键不存在
键的数据结构类型
type key
2.1.2 数据结构和内部编码
string 、hash、list、set、zset,每种数据结构有自己的底层的内部编码实现
例如list数据结构包含了linkedlist和ziplist两种内部编码
2.1.3 单线程架构
Redis使用了单线程架构和I/O多路复用模型
每次客户端调用都会经历发送命令、执行命令、返回结果三个过程,
第二步需要重点讨论,因为Redis是单线程来处理命令,所以一条命令
发送后,所有命令会进入一个队列中。
为什么单线程还能这么快?
第一,纯内存访问,内存的响应时间长约为100纳秒
第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术,
第三,单线程避免了线程切换和竞争产生的消耗
2.2 字符串
set命令有几个选项
ex seconds
px milliseconds
nx:键必须不存在,用于添加
xx:键必须存在,用于更新
setxx和setnx和带参数的set对应的用法相同,那么setnx
和setxx在有什么实际应用场景嘛?例如setnx,如果多个客户端
执行setnx key value,只有一个客户端能设置成功,setnx可以作为
分布式锁的一种实现方案。
批量设置值
mset key value [key value ...]
批量获取值
mget key [key...]
批量操作命令有效提高开发效率,例如mget,要执行n次
get命令,如果用get来,则需要耗时:n次网络时间+n次命令时间
mget则只需要一次网络时间+n次命令时间
2.2.2 内部编码
int:8个字节的长整型
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
典型使用场景:
限速,如发送短信验证码,限制短信接口不被频繁访问
集中管理session:一个分布式Web服务将用户的session信息保存在
各自的服务器中,这样造成一个问题,用户刷新一次,可能需要重新登陆。
主要是负载均衡,分布式服务会将用户访问均衡到不同服务器。
可以使用Redis对用户session进行集中管理。
2.3 哈希
也叫哈希、字典、关联数组。我们可以通过key直接访问。
哈希类型中的映射关系叫做field-value,不是key-value
2.3.1 命令
hset key filed value
hset user:1 name tom
此外也提供hsetnx命令
hget key field
批量设置或获取field-value
hmget key field [field...]
hmset key filed value [field value...]
2.3.2 内部编码
ziplist压缩列表的使用条件?
hashtable哈希表的使用条件?
哪几种情况内部编码会由ziplist转为hashtable?
2.3.3 使用场景
有哪三种方法缓存用户信息?
1)原生字符串类型:每个属性一个键
set user:1:name tom
set user:1:age 23
set user:1:city beijing
占用过多键,内存占用量大,用户内聚性较差
2)序列化字符串类型:将用户信息序列化后用一个键保存,取出后
反序列化即可
set user:1 serialize(userInfo)
序列化和反序列化有一定开销,同时每次更新属性需要把全部数据
取出来反序列化,更新后序列化到redis
3)哈希类型:field-value
要控制哈希在ziplist和hashtable两种内部编码转换,hahstable会
消耗更多内存
2.4 列表
可以对列表两端插入和弹出,可以充当队列和栈
2.4.1 命令
rpush key value [value...]
rpush listkey c b a
从左到右获取列表所有元素
lrange listkey 0 -1
2.4.2 内部编码
ziplist
linkedlist
和哈希的限制一样
2.4.3 使用场景
1.消息队列
lpush+brpop组合可实现阻塞队列,生产者客户端使用lpush从列表
左侧插入元素,消费者客户端使用brpop阻塞式抢列表尾部元素
2.文章列表
2.5 集合,待续