rdb

【Redis】基础学习概览【汇总】

不羁的心 提交于 2020-05-01 06:13:46
一、概述 1.1 简介 1.2 Redis单线程好处 1.3 单线程弊端 1.4 Redis应用场景 1.5 Redis 和 Memecached 的区别 二、安装、开启以及关闭 三、Redis基本数据类型 四、SpringBoot整合Redis 五、Redis发布订阅 六、Redis主从复制 七、Redis哨兵机制 八、Redis事务 九、SpringBoot+Redis+Ehcache实现二级缓存 十、Redis持久化方式 十一、Redis集群方式 十二、Redis 缓存雪崩和缓存穿透 十三、用Redis解决分布式Session 一、概述 1.1 简介 Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。 Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由 C语言 编写。官方提供的数据是可以达到100000+的qps, Redis是一个非关系型数据库(NoSQL) 内存数据库,以key value方式进行存储 Redis以单线方式存储,既然是单线程

017.redis 在实践中的一些常见问题以及优化思路(包含 linux 内核参数优化)

北战南征 提交于 2020-05-01 06:11:44
[toc] fork 耗时导致高并发请求延时 RDB 和 AOF 的时候会存在 RDB 快照生成、AOF rewrite,耗费磁盘 IO 的过程 主进程 fork 子进程的时候,子进程是需要拷贝父进程的空间内存页表的,也是会耗费一定的时间的 一般来说,如果父进程内存有 1 个 G 的数据,那么 fork 可能会耗费在 20ms 左右,如果是 10G~30G,那么就会耗费 20 * 10,甚至 20 * 30,也就是几百毫秒的时间 info stats 中的 latest_fork_usec,可以看到最近一次 fork 的时长 redis 单机 QPS 一般在几万,fork 可能一下子就会拖慢几万条操作的请求时长,从几毫秒变成 1 秒 优化思路 :fork 耗时跟 redis 主进程的内存有关系,一般控制 redis 的内存在 10GB 以内;否则 slave -> master 在全量复制等时候就可能会出现一些问题 AOF 的阻塞问题 redis 将数据写入 AOF 缓冲区,单独开一个线程做 fsync 操作,每秒一次 但是 redis 主线程会检查两次 fsync 的时间,如果距离上次 fsync 时间超过了 2 秒,那么写请求就会阻塞 everysec,最多丢失 2 秒的数据 一旦 fsync 超过 2 秒的延时,整个 redis 就被拖慢 优化思路 :优化硬盘写入速度

【Redis实现运行状态下切换RDB备份至AOF备份】

落花浮王杯 提交于 2020-04-30 22:12:19
redis持久化方式有哪些?又有何区别? rdb :基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能。 aof :以追加的方式记录redis操作日志的文件,可最大程度的保证redis数据安全,类似于mysql的binlog。 本文将在redis5.0.2版本中,通过 CONFIG SET 命令,达到不重启redis服务的情况下,从RDB存储模式切换至AOF存储模式。 <font color=blue>确保redis版本在2.2以上</font> [root@master redis5]# redis-server -v Redis server v=5.0.2 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=55a56548bc97ef03 <font color=blue>redis当前的配置文件如下</font> # pid文件路径 pidfile /var/run/redis/6380.pid # 日志级别 loglevel notice # redis数据存放位置 dir /usr/local/redis5/db/6380/ # 日志文件路径 logfile /var/log/redis/6380.log # redis3.0之后的安全模式 # 安全模式可能会阻挡远程连接

Redis的Linux系统优化

淺唱寂寞╮ 提交于 2020-04-30 20:01:02
通常来看,Redis开发和运维人员更加关注的是Redis本身的一些配置优化,例如AOF和RDB的配置优化、数据结构的配置优化等,但是对于操作系统是否需要针对Redis做一些配置优化不甚了解或者不太关心,然而事实证明一个良好的系统操作配置能够为Redis服务良好运行保驾护航。 众所周知Redis的作者对于Windows操作系统并不感冒,目前大部分公司都会将Web服务器、数据库服务器等部署在Linux操作系统上,Redis也不例外。所以接下来介绍Linux操作系统如何优化Redis,包含如下七个方面。 目录 一. 内存分配控制 1. vm.overcommit_memory 2. 获取和设置 3. 最佳实践 二. swappiness 1. 参数说明 2. 设置方法 3. 如何监控swap 4. 最佳实践 三. Transparent Huge Pages 四. OOM killer 运维提示: 五. 使用NTP 六. ulimit 七. TCP backlog 一. 内存分配控制 1. vm.overcommit_memory Redis在启动时可能会出现这样的日志: 1 2 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this

SpringBoot微服务电商项目开发实战 --- Redis缓存雪崩、缓存穿透、缓存击穿防范

荒凉一梦 提交于 2020-04-29 18:15:58
最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容。 系列(一): 主要说了使用IDEA对SpringBoot项目的创建,SpringBoot架构下Web项目Maven的基本依赖及实现。 系列(二): 主要讲了Maven父子级项目创建依赖、分环境部署配置及服务端口号统一配置,Dubbo的集成接入、服务层(提供者)分模块实现,提供者(四个)和消费者(一个)的配置及服务调用,微服务落地实现。 系列(三): 开始讲了项目及依赖的版本号统一配置管理(子模块和第三方依赖Jar),数据库的连接配置及Redis接入、分布式缓存实现。 系列(四): 接口安全实现(防恶意请求、数据篡改等),过滤器配置及签名、token检验拦截、Aop签名实现、防SQL注入等。 学而时习之,不亦说乎。作为我本次推出的系列文章,目的很简单,就是旨意帮助那些不懂分布式开发微服务落地的小伙伴们。目前的IT市场,分布式开发微服务落地已成为主流。SpringBoot,Dubbo,Zookeeper,Redis,Kafka,SpringCloud等也是面试中常问的话题,如果你想在这个行业混下去,这些已经是你必须要学的基础技术知识了,接下来我会根据我近两年的分布式微服务开发经验推出更多的文章

深入学习Redis(3):主从复制

五迷三道 提交于 2020-04-29 17:36:07
前言 在前面的两篇文章中,分别介绍了 Redis的内存模型 和 Redis的持久化 。 在Redis的持久化中曾提到,Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。其中持久化侧重解决的是Redis数据的单机备份问题(从内存到硬盘的备份);而主从复制则侧重解决数据的多机热备。此外,主从复制还可以实现负载均衡和故障恢复。 这篇文章中,将详细介绍Redis主从复制的方方面面,包括:如何使用主从复制、主从复制的原理(重点是全量复制和部分复制、以及心跳机制)、实际应用中需要注意的问题(如数据不一致问题、复制超时问题、复制缓冲区溢出问题)、主从复制相关的配置(重点是repl-timeout、client-output-buffer-limit slave)等。 系列文章 深入学习Redis(1):Redis内存模型 深入学习Redis(2):持久化 深入学习Redis(3):主从复制 深入学习Redis(4):哨兵 深入学习Redis(5):集群 目录 一、主从复制概述 二、如何使用主从复制 1. 建立复制 2. 实例 3. 断开复制 三、主从复制的实现原理 1. 连接建立阶段 2. 数据同步阶段 3. 命令传播阶段 四、【数据同步阶段】全量复制和部分复制 1. 全量复制 2. 部分复制 3. psync命令的执行 4. 部分复制演示 五、【命令传播阶段】心跳机制 1.

2020.4面试分享(7面收割5个offer)

和自甴很熟 提交于 2020-04-29 17:13:00
   都说金三银四是找工作的最佳时节,由于本人的个人职业规划跟目前工作内容不太相符(具体原因就不透露了,领导平时也要来这里逛,哈哈),四月份挑选了10多家公司投递简历(公司规模从几十人到上万人都有),参加了7家公司的电话面试,收获了5个offer,也还算不错。下面就分享一下面试过程中一些基础的,又最常见的问题。不啰嗦了,直接看题。 1、synchronized你用过吗?synchronized和Lock的区别?synchronized偏向锁的获取和撤销?   前2个问题,之前在多线程专题有详细的介绍,欢迎阅读《 java线程间的共享 》和《 java之AQS和显式锁 》。这里着重分析一下第三个问题。   对于synchronized这个关键字,鄙人刚实习还是一只菜鸡的时候,就听周围的大神说,synchronized是一个 重量级锁 ,开销很大要少用,本菜只能一脸崇拜(一脸懵逼)的看着他们,不明觉厉。但是本菜也不能一直菜下去是不是,所以也打算对synchronized的原理进行学习,看下大神们为什么要这样说。其他的都不管,遇到问题先百度,查看了各种博客,各种资料,其实发现并不像大神们说的那样子,毕竟JDK团队也不能忍受世界各地的程序员对他们无休止的吐槽,所以在JDK1.6就对synchronized进行了大量的优化,在JDK1.6之前synchronized的实现统一采用重量级锁(

redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案

假如想象 提交于 2020-04-29 13:59:40
前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。 为了克服上述的问题,项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。 redis技术就是NoSQL技术中的一种,但是引入redis又有可能出现缓存穿透,缓存击穿,缓存雪崩等问题。本文就对这三种问题进行较深入剖析。 redis缓存穿透,缓存击穿,缓存雪崩原因 缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。 缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

缓存穿透、缓存击穿、缓存雪崩及其解决方案

爷,独闯天下 提交于 2020-04-29 13:13:22
###前言:缓存的使用场景 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。 1.缓存穿透   缓存穿透是指查询一个一定不存在的数据,因为缓存中也无该数据的信息,则会直接去数据库层进行查询,从系统层面来看像是穿透了缓存层直接达到db,从而称为缓存穿透,没有了缓存层的保护,这种查询一定不存在的数据对系统来说可能是一种危险,如果有人恶意用这种一定不存在的数据来频繁请求系统(准确的说是攻击系统),请求都会到达数据库层导致db瘫痪从而引起系统故障。 解决方案 在缓存使用的场景中,缓存KEY值失效的风暴(单个KEY值失效,PUT时间较长,导致穿透缓存落到DB上,对DB造成压力)。可以采用 布隆过滤器 、单独设置个缓存区域存储空值,对要查询的key进行预先校验 、缓存降级等方法。 缓存穿透业内的解决方案已经比较成熟,主要常用的有以下几种: bloom filter:类似于哈希表的一种算法,用所有可能的查询条件生成一个bitmap,在进行数据库查询之前会使用这个bitmap进行过滤,如果不在其中则直接过滤,从而减轻数据库层面的压力。 guava中有实现BloomFilter算法 。 空值缓存:一种比较简单的解决办法,在第一次查询完不存在的数据后,将该key与对应的空值也放入缓存中,只不过设定为较短的失效时间,例如几分钟,这样则可以应对短时间的大量的该key攻击

面试官:你对Redis缓存了解吗?面对这11道面试题你是否有很多问号?

狂风中的少年 提交于 2020-04-29 09:01:05
前言 关于Redis的知识,总结了一个脑图分享给大家 1、在项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 面试官心理分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚,那确实比较尴尬。 只要问到缓存,上来第一个问题,肯定是先问问你项目哪里用了缓存?为啥要用?不用行不行?如果用了以后可能会有什么不良的后果? 这就是看看你对缓存这个东西背后有没有思考,如果你就是傻乎乎的瞎用,没法给面试官一个合理的解答,那面试官对你印象肯定不太好,觉得你平时思考太少,就知道干活儿。 面试题剖析 项目中缓存是如何使用的? 这个,需要结合自己项目的业务来。 为什么要用缓存? 用缓存,主要有两个用途:高性能、高并发。 高性能 假设这么个场景,你有个操作,一个请求过来,吭哧吭哧你各种乱七八糟操作 mysql,半天查出来一个结果,耗时 600ms。但是这个结果可能接下来几个小时都不会变了,或者变了也可以不用立即反馈给用户。那么此时咋办? 缓存啊,折腾 600ms 查出来的结果,扔缓存里,一个 key 对应一个 value,下次再有人查,别走 mysql折腾 600ms 了,直接从缓存里,通过一个 key 查出来一个 value,2ms 搞定。性能提升 300 倍。 就是说对于一些需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是有很多读请求,那么直接将查询出来的结果放在缓存中