redis持久化

redis学习笔记---redis的持久化(RDB和AOF方式)

我怕爱的太早我们不能终老 提交于 2019-12-26 17:08:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> redis支持两种持久化的方式,可以单独使用或者结合起来使用 第一种:RDB方式(redis默认的持久化方式) 第二种:AOF方式 一、RDB rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在redis根目录的dump.rdb文件中。(文件名在配置文件中dbfilename) redis进行快照的时机 (在配置文件redis.conf中) save 900 1:表示900秒内至少一个键被更改则进行快照。 save 300 10 save 60 10000 redis自动实现快照的过程 1:redis使用fork函数复制一份当前进程的副本(子进程) 2:父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件 3:当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。 注意:redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。 这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份, RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。

如何设计一个本地缓存?

时光怂恿深爱的人放手 提交于 2019-12-09 15:24:19
考虑点 考虑点主要在数据用何种方式存储,能存储多少数据,多余的数据如何处理等几个点,下面我们来详细的介绍每个考虑点,以及该如何去实现; 1.数据结构 首要考虑的就是数据该如何存储,用什么数据结构存储,最简单的就直接用Map来存储数据;或者复杂的如redis一样提供了多种数据类型哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,集合,跳跃表等数据结构; 2.对象上限 因为是本地缓存,内存有上限,所以一般都会指定缓存对象的数量比如1024,当达到某个上限后需要有某种策略去删除多余的数据; 3.清除策略 上面说到当达到对象上限之后需要有清除策略,常见的比如有LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用)等策略; 4.过期时间 除了使用清除策略,一般本地缓存也会有一个过期时间设置,比如redis可以给每个key设置一个过期时间,这样当达到过期时间之后直接删除,采用清除策略+过期时间双重保证; 5.线程安全 像redis是直接使用单线程处理,所以就不存在线程安全问题;而我们现在提供的本地缓存往往是可以多个线程同时访问的,所以线程安全是不容忽视的问题;并且线程安全问题是不应该抛给使用者去保证; 6.简明的接口 提供一个傻瓜式的对外接口是很有必要的,对使用者来说使用此缓存不是一种负担而是一种享受;提供常用的get,put

如何设计一个本地缓存

耗尽温柔 提交于 2019-12-06 20:23:31
前言 最近在看Mybatis的源码,刚好看到缓存这一块,Mybatis提供了一级缓存和二级缓存;一级缓存相对来说比较简单,功能比较齐全的是二级缓存, 沈阳SEO 基本上满足了一个缓存该有的功能;当然如果拿来和专门的缓存框架如ehcache来对比可能稍有差距;本文我们将来整理一下实现一个本地缓存都应该需要考虑哪些东西。 考虑点 考虑点主要在数据用何种方式存储,能存储多少数据,多余的数据如何处理等几个点,下面我们来详细的介绍每个考虑点,以及该如何去实现; 1.数据结构 首要考虑的就是数据该如何存储,用什么数据结构存储,最简单的就直接用Map来存储数据;或者复杂的如redis一样提供了多种数据类型哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,集合,跳跃表等数据结构; 2.对象上限 因为是本地缓存,内存有上限,所以一般都会指定缓存对象的数量比如1024,当达到某个上限后需要有某种策略去删除多余的数据; 3.清除策略 上面说到当达到对象上限之后需要有清除策略,常见的比如有LRU(最近最少使用)、FIFO(先进先出)、LFU(最近最不常用)、SOFT(软引用)、WEAK(弱引用)等策略; 4.过期时间 除了使用清除策略,一般本地缓存也会有一个过期时间设置,比如redis可以给每个key设置一个过期时间,这样当达到过期时间之后直接删除,采用清除策略+过期时间双重保证; 5.线程安全

Redis持久化方案

核能气质少年 提交于 2019-12-05 09:00:29
持久化方案分类: 1.RDB全量持久化,数据快照: RDB会把内存中的所有数据存放到硬盘的文件中,这个文件也称为RDB快照。 2.AOF增量持久化,命令日志: AOF会把对数据库的所有读写操作命令记录下来,放到AOF命令日志中。 两种持久化方案的区别: 1.RDB占用的存储空间比AOF要小。 2.AOF恢复数据的速度比RDB要快。 3.如果文件损坏,RDB的数据全部作废,AOF只损失一小部分数据。 4.RDB是fork一个新的线程进行数据加载,最大限度使用系统资源,如果数据量过大,就会造成服务器卡顿。 AOF是一部分一部分地进行加载,不会影响服务器的其他应用。 5.AOF可以回滚误操作。 RDB持久化策略(默认持久化方案) save 900 1 save 300 10 save 60 10000 # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed AOF持久化策略(需要手动开启) # appendfsync always 每一次操作都持久化(会极大影响redis性能) # appendfsync everyse 每秒进行一次持久化 #

如何保证消息队列的可靠性传输?

血红的双手。 提交于 2019-12-04 04:05:14
面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是 数据不能多一条,也不能少一条 ,不能多,就是前面说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考虑一下。 如果说你这个是用 MQ 来传递非常核心的消息,比如说计费、扣费的一些消息,那必须确保这个 MQ 传递过程中 绝对不会把计费消息给弄丢 。 面试题剖析 数据的丢失问题,可能出现在生产者、MQ、消费者中,咱们从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 此时可以选择用 RabbitMQ 提供的事务功能,就是生产者 发送数据之前 开启 RabbitMQ 事务 channel.txSelect ,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务 channel.txRollback ,然后重试发送消息;如果收到了消息,那么可以提交事务 channel.txCommit 。 // 开启事务 channel.txSelect try { // 这里发送消息 } catch (Exception e) { channel

hadoop学习之NameNade持久化和DataNode了解

匿名 (未验证) 提交于 2019-12-03 00:08:02
其中的fsimage 称为时点备份,又叫磁盘镜像快照,这个是NameNode的一个 持久化的方式之一 :缺点,在内存数据序列化的时候比较慢 具体的过程:因为我们所知道的NameNode一般是存储在内存中的,并没有和磁盘进行交互,这和redis这类的非关系型数据库差不多,但是内存中的数据总是没有持久化的,那么怎么去持久化呢?就比如我们的NameNode结点数据的持久化过程:先将内存中的数据序列化为二进制字节流,之后将其通过IO的形式存入到计算机的文件系统中,就完成了持久化的过程,具体的如果NameNode需要数据的过程的时候,需要将外存中的字节码文件,反序列化,之后加载到内存中,就可以供NameNode使用了 注意点:时点快照:只会按规定的间隔一段时间之后再去持久化到外存中,如13点,15点,17点。。。。而不是每一秒都在进行持久化,因为这样的话又会频繁的和外存也就是磁盘进行交互,这样数据的获取的时间就会很长了 持久化的方式之二 :缺点,在数据存入外存的过程不慢,但是当存外存恢复到内存的时候比较慢 edits记录对metadata的操作日志。。。>Redis 即日志编辑方式: 1)数据存入外村会将客户端对服务器中的任何的一条指令都写入到操作日志log这个文件当中 2)数据从外存加载到内存中:直接再执行一遍log中的指令即可。 此方式也是时隔一段规定的时间才回去持久化,而不是实时的

activemq特性之持久化

こ雲淡風輕ζ 提交于 2019-12-01 15:40:55
介绍 数据的持久化是很多系统都会涉及到的一个问题,尤其是redis,activemq这些数据主要是存储在内存中的。既然存在内存中,就会面临宕机时数据丢失的风险。这一问题的解决方案就是通过某种方式将数据落到磁盘上,也就是所谓的持久化。 activemq提供了三种持久化方式,分别基于jdbc, kahadb和leveldb. 目前官方最推荐的是基于kahadb的持久化。 jdbc是activemq最早提供的一种持久化方式,但是用数据库去做持久化确实不合适,毕竟性能有瓶颈,而且只是需要简单的读写数据,不需要数据库各种强大的功能。现在去看文档的话,连基本的配置都被埋的很深,所以这种方式我们也就不细说了。 正是由于基于jdbc的方式存在的种种问题,activemq后来就接连提供了基于kahabd和leveldb的持久化方式. leveldb 是google开源的一个KV磁盘存储系统,应用很广,kahadb没找着源头,应该就是activemq团队开发的,也是一种基于磁盘的存储系统。按理说,leveldb的性能是要好一些的,之前无论是activemq的默认配置,还是文档里的推荐使用方法,都是首选leveldb. 但是有一天这个基于leveldb的持久化方式就突然被activemq废弃了,主要原因是leveldb是一个第三方系统,维护起来不如kahadb那么方便。到当前最新版本

spring-session(一)揭秘

浪尽此生 提交于 2019-11-30 01:41:53
引自: spring-session(一)揭秘 前言 在开始spring-session揭秘之前,先做下热脑(活动活动脑子)运动。主要从以下三个方面进行热脑: 为什么要spring-session 比较traditional-session方案和spring-session方案 JSR340规范与spring-session的透明继承 一.为什么要spring-session 在传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器管理。浏览器使用cookie中记录sessionId,容器根据sessionId判断用户是否存在会话session。这里的限制是,session存储在web容器中,被单台服务器容器管理。 但是网站主键演变,分布式应用和集群是趋势(提高性能)。此时用户的请求可能被负载分发至不同的服务器,此时传统的web容器管理用户会话session的方式即行不通。除非集群或者分布式web应用能够共享session,尽管tomcat等支持这样做。但是这样存在以下两点问题: 需要侵入web容器,提高问题的复杂 web容器之间共享session,集群机器之间势必要交互耦合 基于这些,必须提供新的可靠的集群分布式/集群session的解决方案,突破traditional-session单机限制(即web容器session方式

redis --持久化rio

爷,独闯天下 提交于 2019-11-29 23:27:24
rio是对流式IO的抽象,提供读写接口,消费/生产具体不同的I/O设备。rdb.c就是使用抽象封装RDB的内存读写和文件读写。rio对象提供以下方法: read:从流读数据 write:向流写数据 tell :获取当前的偏移量 flush : 刷空缓冲区方法 checksum:检查读写的checksum 校验和操作。rio使用了RCR64算法计算校验和,具体实现可以参看crc64.h和crc64.c文件。 IO变量。_rio中的io成员是一个联合体,针对不同的I/O情况进行不同的处理:当执行内存buffer的I/O操作时,使用rio.buffer结构体;当执行文件I/O操作时,使用rio.file结构体;当执行socket的I/O操作时,使用rio.fdset结构体。 /* rio.c is a simple stream-oriented I/O abstraction that provides an interface * to write code that can consume/produce data using different concrete input * and output devices. For instance the same rdb.c code using the rio * abstraction can be used to read

02.scrapy框架持久化存储

无人久伴 提交于 2019-11-29 17:43:32
1.基于终端指令的持久化存储   保证爬虫文件parse方法中有可迭代对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作 执行输出指定格式进行存储:将爬取到的数据写入不同格式的文件中进行存储   scrapy crawl 爬虫名称 -o xxx.json   scrapy crawl 爬虫名称 -o xxx.xml   scrapy crawl 爬虫名称 -o xxx.csv 2.基于管道的持久化存储   scrapy框架中已经为我们专门集成好了高效,便捷的持久化操作功能,我们直接使用即可.要想使用scrapy的持久化操作功能,我们首先来认识如下两个文件:   items.py : 数据结构模板文件.定义数据属性   pipelines.py:管道文件.接收数据(items),进行持久化操作 持久化流程:   1.爬虫文件爬取到数据后,需要将数据封装到items对象中   2.使用yield关键字将items对象提交给pipelines管道进行持久化操作   3.在管道文件中的process_item方法中接受爬虫文件提交过来的item对象,然后编写持久化存储的代码将item对象中存储的数据进行持久化存储.   4.在settings.py配置文件中开启管道 小试牛刀:将糗事百科首页中的段子和作者数据爬取下来,然后进行持久化存储.