400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Redis由浅入深深深深深剖析-创新互联

前言

常用的SQL数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的IO压力,但由于数据库的缓存一般是针对查询的内容,而且粒度也比较小,一般只有表中的数据没有发生变动的时候,数据库的缓存才会产生作用,但这并不能减少业务逻辑对数据库的增删改操作的IO压力,因此缓存技术应运而生,该技术实现了对热点数据的高速缓存,可以大大缓解后端数据库的压力。

创新互联公司始终坚持【策划先行,效果至上】的经营理念,通过多达10多年累计超上千家客户的网站建设总结了一套系统有效的全网营销推广解决方案,现已广泛运用于各行各业的客户,其中包括:发电机回收等企业,备受客户赞扬。

主流应用架构

Redis由浅入深深深深深剖析

客户端在对数据库发起请求时,先到缓存层查看是否有所需的数据,如果缓存层存有客户端所需的数据,则直接从缓存层返回,否则进行穿透查询,对数据库进行查询,如果在数据库中查询到该数据,则将该数据回写到缓存层,以便下次客户端再次查询能够直接从缓存层获取数据。

缓存中间件 -- Memcache和Redis的区别

为什么Redis能这么快

Redis的效率很高,官方给出的数据是100000+QPS(query per second),这是因为:

1.Redis完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高。

2.Redis使用单进程单线程模型的(K,V)数据库,将数据存储在内存中,存取均不会受到硬盘IO的限制,因此其执行速度极快,另外单线程也能处理高并发请求,还可以避免频繁上下文切换和锁的竞争,如果想要多核运行也可以启动多个实例。

3.数据结构简单,对数据操作也简单,Redis不使用表,不会强制用户对各个关系进行关联,不会有复杂的关系限制,其存储结构就是键值对,类似于HashMap,HashMap大的优点就是存取的时间复杂度为O(1)。

4.Redis使用多路I/O复用模型,为非阻塞IO(非阻塞IO会另写一篇解释,可以先行百度)。


注:Redis采用的I/O多路复用函数:epoll/kqueue/evport/select

选用策略:

1.因地制宜,优先选择时间复杂度为O(1)的I/O多路复用函数作为底层实现。

2.由于select要遍历每一个IO,所以其时间复杂度为O(n),通常被作为保底方案。

3.基于react设计模式监听I/O事件。


Redis的数据类型

Redis由浅入深深深深深剖析

注:如果重复写入key相同的键值对,后写入的会将之前写入的覆盖。

Hash

String元素组成的字典,适用于存储对象。

Redis由浅入深深深深深剖析

List

列表,按照String元素插入顺序排序。其顺序为后进先出。由于其具有栈的特性,所以可以实现如“最新消息排行榜”这类的功能。

Redis由浅入深深深深深剖析

Set

String元素组成的无序集合,通过哈希表实现(增删改查时间复杂度为O(1)),不允许重复。

Redis由浅入深深深深深剖析

另外,当我们使用smembers遍历set中的元素时,其顺序也是不确定的,是通过hash运算过后的结果。Redis还对集合提供了求交集、并集、差集等操作,可以实现如同共同关注,共同好友等功能。

Sorted Set

通过分数来为集合中的成员进行从小到大的排序。

Redis由浅入深深深深深剖析

从海量Key里查询出某一个固定前缀的Key

如何通过Redis实现分布式锁

Redis由浅入深深深深深剖析

用法:EXPIRE key seconds

Redis由浅入深深深深深剖析

RedisService redisService = SpringUtils.getBean(RedisService.class);
long status = redisService.setnx(key,"1");
if(status == 1){
 redisService.expire(key,expire);
 doOcuppiedWork();
}
SET KEY value [EX seconds] [PX milliseconds] [NX|XX]
RedisService redisService = SpringUtils.getBean(RedisService.class);
String result = redisService.set(lockKey,requestId,SET_IF_NOT_EXIST,SET_WITH_EXPIRE_TIME,expireTime);
if("OK.equals(result)"){
 doOcuppiredWork();
}

如何实现异步队列

Redis由浅入深深深深深剖析

Redis由浅入深深深深深剖析

Redis由浅入深深深深深剖析

Redis由浅入深深深深深剖析

Redis由浅入深深深深深剖析

Redis持久化

save 900 1 #在900s内如果有1条数据被写入,则产生一次快照。
 save 300 10 #在300s内如果有10条数据被写入,则产生一次快照
 save 60 10000 #在60s内如果有10000条数据被写入,则产生一次快照
 stop-writes-on-bgsave-error yes 
 #stop-writes-on-bgsave-error :
 如果为yes则表示,当备份进程出错的时候,
 主进程就停止进行接受新的写入操作,这样是为了保护持久化的数据一致性的问题。

Redis由浅入深深深深深剖析

appendonly yes
 #appendsync always
 appendfsync everysec
 # appendfsync no

Redis数据的恢复

Redis由浅入深深深深深剖析

Pineline

Pipeline和Linux的管道类似,它可以让Redis批量执行指令。

Redis基于请求/响应模型,单个请求处理需要一一应答。如果需要同时执行大量命令,则每条命令都需要等待上一条命令执行完毕后才能继续执行,这中间不仅仅多了RTT,还多次使用了系统IO。Pipeline由于可以批量执行指令,所以可以节省多次IO和请求响应往返的时间。但是如果指令之间存在依赖关系,则建议分批发送指令。

Redis的同步机制

Redis由浅入深深深深深剖析

Redis集群

Redis由浅入深深深深深剖析

Redis由浅入深深深深深剖析

Redis由浅入深深深深深剖析

结语

这篇准(tou)备(lan)了相当久的时间,因为有些东西总感觉自己拿不准不敢往上写,差点自闭,就算现在发出来了也感觉有很多地方是需要改动的。如果有同学觉得哪里写的不对劲的,评论区或者私聊我...嗯,我不要你觉得,我要我觉得。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


当前标题:Redis由浅入深深深深深剖析-创新互联
文章路径:http://www.bluegullmedia.com/article/egjsg.html

其他资讯

让你的专属顾问为你服务

0.0482s