Redis由浅入深深深深深剖析

发布时间:2020-07-03 15:26:50 作者:wx5d6cccb1cb158
来源:网络 阅读:800

前言

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

主流应用架构

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


推荐阅读:
  1. spark2.x由浅入深深到底系列七之py4j在spark中python api的使用
  2. spark2.x由浅入深深到底系列七之RDD python api详解一

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java redis sql

上一篇:FastCgi与PHP-fpm之间的关系

下一篇:hadoop学习笔记2---hadoop的三种运行模式

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》