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 集合,待续

 

2.6 有序集合,待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值