fsync

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之后的安全模式 # 安全模式可能会阻挡远程连接

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等也是面试中常问的话题,如果你想在这个行业混下去,这些已经是你必须要学的基础技术知识了,接下来我会根据我近两年的分布式微服务开发经验推出更多的文章

Node.js 文件系统

こ雲淡風輕ζ 提交于 2020-04-24 12:06:03
Node.js 中我们可以使用 fs(File System) 模块来操作文件,文件系统模块有两种不同的方法,分别是同步方法和异步方法。 同步和异步方法 Node.js 文件系统模块中的方法均有异步和同步版本,例如同步读取文件内容可以使用 fs.readFileSync() 方法,而异步读取文件内容可以使用 fs.readFile() 方法。 异步方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息。 在大型系统中,一般我们会使用异步方法,因为同步方法容易导致进程被锁死。所以比起同步方法,异步方法的性能更高、速度更快、而且没有阻塞。 示例: 假设有一个test.txt文件的内容如下所示: 学互联网工作技能,上侠课岛! 同步读取文件 我们使用同步方法来读取上面这个文件中的内容,创建一个名为 synchronization.js 的文件,文件中的内容如下,使用 readFileSync() 方法读取内容: var fs = require("fs"); var data = fs.readFileSync('test.txt'); console.log("同步读取文件内容为:\n" + data.toString()); console.log("程序执行完毕"); 启动这个 Node.js 文件,就会成功读取文件中的内容,如下所示: >node

曹工说Redis源码(7)-- redis server 的周期执行任务,到底要做些啥

淺唱寂寞╮ 提交于 2020-04-23 05:42:10
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读。由于我用c也是好几年以前了,些许错误在所难免,希望读者能不吝指出。 曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java一样的效果 曹工说Redis源码(2)-- redis server 启动过程解析及简单c语言基础知识补充 曹工说Redis源码(3)-- redis server 启动过程完整解析(中) 曹工说Redis源码(4)-- 通过redis server源码来理解 listen 函数中的 backlog 参数 曹工说Redis源码(5)-- redis server 启动过程解析,以及EventLoop每次处理事件前的前置工作解析(下) 曹工说Redis源码(6)-- redis server 主循环大体流程解析 本讲主题 本讲,聚焦于redis的周期执行任务。redis启动起来后,基本就剩下两件事,上一讲的主流程分析中,已经讲到了。1个是处理客户端请求,2就是指向周期任务。处理客户端请求,大概会细分为:处理客户端连接事件(客户端连接到redis)、客户端读写事件(客户端发送请求,redis返回响应); 周期任务呢,就是本讲主题

Redis核心原理与应用实践

◇◆丶佛笑我妖孽 提交于 2020-04-16 11:09:16
【推荐阅读】微服务还能火多久?>>> Redis核心原理与应用实践 在很多场景下都会使用Redis,但是到了深层次的时候就了解的不是那么深刻,以至于在面试的时候经常会遇到卡壳的现象,学习知识要做到系统和深入,不要把Redis想象的过于复杂,和Mysql一样,是个读取数据的软件。 有一个理解是Redis是key value缓存服务器,更多的优点在于对value的操作更加丰富。 安装 yum install redis #yum安装 brew install redis # brew安装 redis-cli Redis 基础数据结构 Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。 string (字符串) Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字 符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时, 扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是 字符串最大长度为 512M。 键值对 set name codehole get name 批量键值对

Redis相关操作指令

别说谁变了你拦得住时间么 提交于 2020-04-15 08:40:53
【推荐阅读】微服务还能火多久?>>> 1、redis info详解 127.0.0.1:6379> info all # Server(服务器信息) redis_version:3.0.0 #redis服务器版本 redis_git_sha1:00000000 #Git SHA1 redis_git_dirty:0 #Git dirty flag redis_build_id:6c2c390b97607ff0 #redis build id redis_mode:cluster #运行模式,单机或者集群 os:Linux 2.6.32-358.2.1.el6.x86_64 x86_64 #redis服务器的宿主操作系统 arch_bits:64 #架构(32或64位) multiplexing_api:epoll #redis所使用的事件处理机制 gcc_version:4.4.7 #编译redis时所使用的gcc版本 process_id:12099 #redis服务器进程的pid run_id:63bcd0e57adb695ff0bf873cf42d403ddbac1565 #redis服务器的随机标识符(用于sentinel和集群) tcp_port:9021 #redis服务器监听端口 uptime_in_seconds:26157730 #redis服务器启动总时间

跟面试官侃半小时MySQL事务,说完原子性、一致性、持久性的实现

*爱你&永不变心* 提交于 2020-04-14 09:49:42
【今日推荐】:为什么一到面试就懵逼!>>> 提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关。 而事务的ACID(即原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)可以说涵盖了事务的全部知识点,所以,我们不仅要知道ACID是什么,还要了解ACID背后的实现,只有这样,无论在日常开发还是面试求职,都能无往而不利。 上一篇 跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现 主要围绕“隔离性”展开,从基本概念,到隔离性的实现,最后以一个实战案例进行融会贯通。本篇内容将介绍原子性、一致性、持久性相关实现,由于这部分内容可能很多人会相对陌生,因为日常业务开发可能不太会去接触和深究,但是了解完后,你对MySQL会有更深刻的认识。 1.基本概念 原子性。 整个事务是不可分割的最小单位,事务中任何一个语句执行失败,所有已经执行成功的语句也要回滚,整个数据库状态要恢复到执行事务前到状态。 一致性。 事务将数据库从一种状态转变为下一种一致的状态。在事务的前后,数据库的完整性约束没有被破坏。(事务的acid不是完全正交的,尤其是一致性,可能跟原子性、隔离性都有一定关系,后面会看到) 持久性。 事务一旦提交,那么就是永久性的,不会因为宕机等故障导致数据丢失

Perl IO:操作系统层次的IO

三世轮回 提交于 2020-04-13 16:50:39
【今日推荐】:为什么一到面试就懵逼!>>> sysopen() open()和sysopen()都打开文件句柄,open()是比较高层次的打开文件句柄,sysopen()相对要底层一点。但 它们打开的文件句柄并没有区别 ,只不过sysopen()有一些自己的特性:可以使用几个open()没有的flag,可以指定文件被创建时的权限等。 一定要注意的是,io buffer和open()、sysopen()无关,而是和读、写的方式有关,例如read()、getc()以及行读取都使用io buffer,而sysread、syswrite则直接绕过io buffer。 例如: sysopen HANDLE, "file.txt", O_RDONLY; open HANDLE, $filename, O_WRONLY|O_CREAT, 0644; open HANDLE, $filename, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH; 其中sysopen支持的flag部分有以下几种: # 三种基本读写模式 O_RDONLY O_RDWR O_WRONLY # 配合基本读写模式的额外模式 O_APPEND O_TRUNC O_CREAT O_EXCL 只能配合CREAT使用,只有文件 不存在时才创建,文件存在时直 接失败而不是打开它 O

曹工说Redis源码(2)-- redis server 启动过程解析及简单c语言基础知识补充

风格不统一 提交于 2020-04-12 09:11:15
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读。由于我用c也是好几年以前了,些许错误在所难免,希望读者能不吝指出。 曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java一样的效果 一些补充知识 项目结构及入口 除了大学那些玩具,一个真正的项目,都是由大量源代码文件组成一个工程。在Java里,一个 java 文件要使用其他 java 文件中的函数、类型、变量等,都需要使用import语句来引入。在c语言里,也是一样的,在c语言中,要引入其他文件的功能,需要使用include语句。 比如,在redis的主入口,redis.c文件中,就包含了如下一堆语句: #include "redis.h" #include "cluster.h" #include "slowlog.h" #include "bio.h" #include <time.h> #include <signal.h> 其中,以<开头的,比如<time.h>是标准库的头文件,会在系统指定的路径下查找,可类比为 jdk 官方的class;"bio.h"这种,以""包裹的,则是工程里自定义的。 比如,time.h