4 Leon_Jinhai_Sun

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 389

RDB 文件的优势和劣势

一、优势1.RDB 是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。2.生成RDB 文件的时候,redis 主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO 操作。3.RDB 在恢复大数据集时的速度比AOF 的恢复速度要快。二、劣势1、RDB 方式数据没办法做到实时持久化/秒级持久化。因为bgsave 每次运行都要执行fork 操作创建子进程,频繁执行成本过高。2、在一定间隔时间

2020-10-18 18:05:19

Redis的持久化机制

https://redis.io/topics/persistenceRedis 速度快,很大一部分原因是因为它所有的数据都存储在内存中。如果断电或者宕机,都会导致内存中的数据丢失。为了实现重启后数据不丢失,Redis 提供了两种持久化的方案,一种是RDB 快照(Redis DataBase),一种是AOF(Append Only File)。RDBRDB 是Redis 默认的持久化方案。当满足一定条件的时候,会把当前内存中的数据写入磁盘,生成一个快照文件dump.rdb。Redis 重启.

2020-10-18 17:58:39

Redis LRU 淘汰原理

思考(作业):基于一个数据结构做缓存,怎么实现LRU——最长时间不被访问的元素在超过容量时删除?问题:如果基于传统LRU 算法实现Redis LRU 会有什么问题?需要额外的数据结构存储,消耗内存。Redis LRU 对传统的LRU 算法进行了改良,通过随机采样来调整算法的精度。如果淘汰策略是LRU,则根据配置的采样值maxmemory_samples(默认是5 个),随机从数据库中选择m 个key, 淘汰其中热度最低的key 对应的缓存数据。所以采样参数m 配置的数值越大, 就越能精确的查

2020-10-18 17:50:59

Redis中的淘汰策略

Redis 的内存淘汰策略,是指当内存使用达到最大内存极限时,需要使用淘汰算法来决定清理掉哪些数据,以保证新数据的存入。最大内存设置redis.conf 参数配置:# maxmemory <bytes>如果不设置maxmemory 或者设置为0,64 位系统不限制内存,32 位系统最多使用3GB 内存。动态修改:redis> config set maxmemory 2GB到达最大内存以后怎么办?淘汰策略https://redis.io/..

2020-10-18 17:44:59

Redis中的过期策略

Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回收。内存回收主要分为两类,一类是key 过期,一类是内存使用达到上限(max_memory)触发内存淘汰。过期策略要实现key 过期,我们有几种思路。定时过期(主动淘汰)每个设置过期时间的key 都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU 资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。惰性过期(被动淘汰)只有当...

2020-10-18 17:39:51

Redis中的I/O 多路复用(I/O Multiplexing)

I/O 指的是网络I/O。多路指的是多个TCP 连接(Socket 或Channel)。复用指的是复用一个或多个线程。它的基本原理就是不再由应用程序自己监视连接,而是由内核替应用程序监视文件描述符。客户端在操作的时候,会产生具有不同事件类型的socket。在服务端,I/O 多路复用程序(I/O Multiplexing Module)会把消息放入队列中,然后通过文件事件分派器(File event Dispatcher),转发到不同的事件处理器中。多路复用有很多的实现,以select 为

2020-10-18 17:32:28

传统I/O 数据拷贝

以读操作为例:当应用程序执行read 系统调用读取文件描述符(FD)的时候,如果这块数据已经存在于用户进程的页内存中,就直接从内存中读取数据。如果数据不存在,则先将数据从磁盘加载数据到内核缓冲区中,再从内核缓冲区拷贝到用户进程的页内存中。(两次拷贝,两次user 和kernel 的上下文切换)。I/O 的阻塞到底阻塞在哪里?Blocking I/O当使用read 或write 对某个文件描述符进行过读写时,如果当前FD 不可读,系统就不会对其他的操作做出响应。从设备复制数据到内核缓冲区是阻

2020-10-18 17:29:25

文件描述符FD

Linux 系统将所有设备都当作文件来处理,而Linux 用文件描述符来标识每个文件对象。文件描述符(File Descriptor)是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O 操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以表明每个被进程打开的文件。Linux 系统里面有三个标准文件描述符。0:标准输入(键盘);1:标准输出(显示器);2:标准错误输出(显示器)。...

2020-10-18 17:19:44

进程的阻塞

正在运行的进程由于提出系统服务请求(如I/O 操作),但因为某种原因未得到操作系统的立即响应,该进程只能把自己变成阻塞状态,等待相应的事件出现后才被唤醒。进程在阻塞状态不占用CPU 资源。...

2020-10-18 17:18:08

进程切换(上下文切换)

多任务操作系统是怎么实现运行远大于CPU 数量的任务个数的?当然,这些任务实际上并不是真的在同时运行,而是因为系统通过时间片分片算法,在很短的时间内,将CPU 轮流分配给它们,造成多任务同时运行的错觉。为了控制进程的执行,内核必须有能力挂起正在CPU 上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。什么叫上下文?在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU 寄存器和程序计数器(Program Counter

2020-10-18 17:14:34

用户user空间和内核kernel空间

为了避免用户进程直接操作内核,保证内核安全,操作系统将虚拟内存划分为两部分,一部分是内核空间(Kernel-space)/ˈkɜːnl /,一部分是用户空间(User-space)。内核是操作系统的核心,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的权限。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中,都是对物理地址的映射。在Linux 系统中, 内核进程和用户进程所占的虚拟内存比例是

2020-10-18 17:05:59

虚拟存储器(虚拟内存Vitual Memory)

因为Redis 是基于内存的操作,我们先从内存开始说起。虚拟存储器(虚拟内存Vitual Memory)名词解释:主存:内存;辅存:磁盘(硬盘)计算机主存(内存)可看作一个由M 个连续的字节大小的单元组成的数组,每个字节有一个唯一的地址,这个地址叫做物理地址(PA)。早期的计算机中,如果CPU 需要内存,使用物理寻址,直接访问主存储器。这种方式有几个弊端:1、在多用户多任务操作系统中,所有的进程共享主存,如果每个进程都独占一块物理地址空间,主存很快就会被用完。我们希望在不同的时刻,不同的

2020-10-18 16:58:53

Redis 为什么是单线程的?

不是白白浪费了CPU 的资源吗?https://redis.io/topics/faq#redis-is-single-threaded-how-can-i-exploit-multiple-cpu--cores因为单线程已经够用了,CPU 不是redis 的瓶颈。Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。...

2020-10-18 16:52:06

Redis为什么这么快?

总结:1)纯内存结构、2)单线程、3)多路复用内存KV 结构的内存数据库,时间复杂度O(1)。第二个,要实现这么高的并发性能,是不是要创建非常多的线程?恰恰相反,Redis 是单线程的。单线程单线程有什么好处呢?1、没有创建线程、销毁线程带来的消耗2、避免了上线文切换导致的CPU 消耗3、避免了线程之间带来的竞争问题,例如加锁释放锁死锁等等异步非阻塞异步非阻塞I/O,多路复用处理并发连接。...

2020-10-18 16:44:09

Redis 到底有多快?

https://redis.io/topics/benchmarkscd /usr/local/soft/redis-5.0.5/srcredis-benchmark -t set,lpush -n 100000 -q结果(本地虚拟机):SET: 51813.47 requests per second —— 每秒钟处理5 万多次set 请求LPUSH: 51706.31 requests per second —— 每秒钟处理5 万多次lpush 请求redis-benchmark

2020-10-18 16:41:47

Redis中的Lua脚本超时

Redis 的指令执行本身是单线程的,这个线程还要执行客户端的Lua 脚本,如果Lua脚本执行超时或者陷入了死循环,是不是没有办法为客户端提供服务了呢?eval 'while(true) do end' 0为了防止某个脚本执行时间过长导致Redis 无法提供服务, Redis 提供了lua-time-limit 参数限制脚本的最长运行时间,默认为5 秒钟。lua-time-limit 5000(redis.conf 配置文件中)当脚本运行时间超过这一限制后,Redis 将开始接受其他命令但

2020-10-18 16:39:01

Redis中缓存Lua 脚本

为什么要缓存在脚本比较长的情况下,如果每次调用脚本都需要把整个脚本传给Redis 服务端,会产生比较大的网络开销。为了解决这个问题,Redis 提供了EVALSHA 命令,允许开发者通过脚本内容的SHA1 摘要来执行脚本。如何缓存Redis 在执行script load 命令时会计算脚本的SHA1 摘要并记录在脚本缓存中,执行EVALSHA 命令时Redis 会根据提供的摘要从脚本缓存中查找对应的脚本内容,如果找到了则执行脚本,否则会返回错误:"NOSCRIPT No matching scri

2020-10-18 16:26:22

Redis中的Lua 脚本

Lua/ˈluə/是一种轻量级脚本语言,它是用C 语言编写的,跟数据的存储过程有点类似。使用Lua 脚本来执行Redis 命令的好处:1、一次发送多个命令,减少网络开销。2、Redis 会将整个脚本作为一个整体执行,不会被其他请求打断,保持原子性。3、对于复杂的组合命令,我们可以放在文件中,可以实现程序之间的命令集复用。在Redis 中调用Lua 脚本使用eval /ɪ'væl/ 方法,语法格式:redis> eval lua-script key-num [key1 .

2020-10-18 16:01:39

Redis事务

https://redis.io/topics/transactions/http://redisdoc.com/topic/transaction.html为什么要用事务我们知道Redis 的单个命令是原子性的(比如get set mget mset),如果涉及到多个命令的时候,需要把多个命令作为一个不可分割的处理序列,就需要用到事务。例如我们之前说的用setnx 实现分布式锁,我们先set,然后设置对key 设置expire,防止del 发生异常的时候锁不会被释放,业务处理完了以后再de

2020-10-18 15:40:10

Redis中的发布订阅模式

列表的局限前面我们说通过队列的rpush 和lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用lpop 查看List 中是否有等待处理的消息(比如写一个while 循环)。为了减少通信的消耗,可以sleep()一段时间再消费,但是会有两个问题:1、如果生产者生产消息的速度远大于消费者消费消息的速度,List 会占用大量的内存。2、消息的实时性降低。list 还提供了一个阻塞的命令:blpop,没有任何元素可以弹出的时候,连接会被阻塞。blpop queue 5基于

2020-10-18 15:26:58

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 技术圈认证
    技术圈认证
    用户完成年度认证,即可获得
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv2
    阅读者勋章Lv2
    授予在CSDN APP累计阅读博文达到7天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 1024超级勋章
    1024超级勋章
    授予原创文章总数达到1024篇的博主,感谢你对CSDN社区的贡献,CSDN与你一起成长。
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。