数据持久化

《吐血整理》Redis 性能优化的 13 条军规!史上最全

烂漫一生 提交于 2020-03-27 23:04:20
Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1)),但由于 Redis 是单线程执行的特点,因此它对性能的要求更加苛刻,本文我们将通过一些优化手段,让 Redis 更加高效的运行。 本文我们将使用以下手段,来提升 Redis 的运行速度: 缩短键值对的存储长度; 使用 lazy free(延迟删除)特性; 设置键值的过期时间; 禁用长耗时的查询命令; 使用 slowlog 优化耗时命令; 使用 Pipeline 批量操作数据; 避免大量数据同时失效; 客户端使用优化; 限制 Redis 内存大小; 使用物理机而非虚拟机安装 Redis 服务; 检查数据持久化策略; 禁用 THP 特性; 使用分布式架构来增加读写速度。 1.缩短键值对的存储长度 键值对的长度是和性能成反比的,比如我们来做一组写入数据的性能测试,执行结果如下: 从以上数据可以看出,在 key 不变的情况下,value 值越大操作效率越慢,因为 Redis 对于同一种数据类型会使用不同的内部编码进行存储,比如字符串的内部编码就有三种:int(整数编码)、raw(优化内存分配的字符串编码)、embstr(动态字符串编码),这是因为 Redis

redis持久化(rdb和aof)

孤街醉人 提交于 2020-03-26 18:37:08
r 原创itcats_cn 最后发布于2018-09-06 00:20:21 阅读数 1117 收藏 展开 Redis持久化,就是将内存数据保存到硬盘,Redis 持久化存储分为 AOF 与 RDB 两种模式,默认开启rdb。 RDB持久化 RDB 是在某个时间点将数据写入一个临时文件dump.rdb,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复,采用二进制文件形式进行存储。 优点:使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能 缺点:RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候 这里说的这个执行数据写入到临时文件的时间点是可以通过配置来自己确定的,通过配置redis 在 n 秒内如果超过 m 个 key 被修改这执行一次 RDB 操作。这个操作就类似于在这个时间点来保存一次 Redis 的所有数据,一次快照数据。所有这个持久化方法也通常叫做 snapshots。 RDB 默认开启,redis.conf 中的具体配置参数如下: #dbfilename:持久化数据存储在本地的文件 dbfilename dump.rdb #dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli

Redis3.0 配置文件说明

*爱你&永不变心* 提交于 2020-03-25 08:42:48
3 月,跳不动了?>>> 背景: 以前 有篇文章 已经结果过了,现在复习一下,对Redis3.0进行说明: 参数说明: #redis.conf # Redis configuration file example. # ./redis-server /path/to/redis.conf ################################## INCLUDES ################################### #这在你有标准配置模板但是每个redis服务器又需要个性设置的时候很有用。 # include /path/to/local.conf # include /path/to/other.conf ################################ GENERAL ##################################### #是否在后台执行,yes:后台运行;no:不是后台运行(老版本默认) daemonize yes #3.2里的参数,是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码 和bind,可以开启。否 则最好关闭,设置为no。 protected-mode yes #redis的进程文件 pidfile /var/run

python - 操作RabbitMQ

大城市里の小女人 提交于 2020-03-24 18:20:02
介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。 应用场景: RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具。消息队列的使用场景大概有3种: 1、系统集成,分布式系统的设计。各种子系统通过消息来对接,这种解决方案也逐步发展成一种架构风格,即“通过消息传递的架构”。 2、当系统中的同步处理方式严重影响了吞吐量,比如日志记录。假如需要记录系统中所有的用户行为日志,如果通过同步的方式记录日志势必会影响系统的响应速度,当我们将日志消息发送到消息队列,记录日志的子系统就会通过异步的方式去消费日志消息。 3、系统的高可用性,比如电商的秒杀场景。当某一时刻应用服务器或数据库服务器收到大量请求,将会出现系统宕机

docker数据共享与持久化

雨燕双飞 提交于 2020-03-23 23:41:54
在容器中管理数据主要有两种方式: 1、数据卷(Data Volumes) 2、挂载主机目录 (Bind mounts) 数据卷 数据卷是一个 可供一个或多个容器使用的特殊目录 ,它绕过UFS,可以提供很多有用的特性: 数据卷 可以在容器之间共享和重用 对 数据卷 的修改会立马生效 对 数据卷 的更新,不会影响镜像 数据卷 默认会一直存在,即使容器被删除 注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷。 选择 -v 还是 -–mount 参数: Docker 新用户应该选择--mount参数,经验丰富的 Docker 使用者对-v或者 --volume已经很熟悉了,但是推荐使用--mount参数。 演示思路: 1、创建一个mysql2 pod,创建一个数据库 2、删除mysql2 pod 3、创建mysql3 pod,指定mysql2的数据卷,查看之前mysql2的数据库是否还存在 通过docker run创建一个mysql2的容器 docker run -d --name mysql2 -p 3303:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7 通过上图可以看到进入pod以后创建一个数据库uu。

Redis之持久化

亡梦爱人 提交于 2020-03-23 18:21:02
3 月,跳不动了?>>> 前言: Redis是一种高级的以key-value形式存储数据的nosql数据库。支持多种数据类型:字符串、哈希,链表、集合、有序集合。并且支持服务器端数据的交集,并集,补集计算,排序,及数据持久。 由于Redis所有的数据都保存在内存里面,如果没有配置持久化,redis重启后数据就会丢失,于是需要开启持久化功能,将数据保存到磁盘上。Redis提供两种持久化方式,一种是RDB持久化,将Redis在内存中的数据定时dump到磁盘上,另一种是AOF持久化,将Redis的操作日志以追加的方式写入文件。 区别: RDB持久化 持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作就是fork一个子进程,先将数据集写入临时文件,写入成功后,在替换之前的文件,用二进制压缩存储。RDB是redis默认的持久化方式。 AOF持久化以日志的形式记录服务器所记录的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。 持久化: RDB: redis调用fork,现在有了子进程和父进程。 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面

Redis持久化的两种模式--RDB和AOF

泪湿孤枕 提交于 2020-03-20 14:20:14
3 月,跳不动了?>>> 最近呢,我使用到redis的缓存这方面的知识,所以去加深了一下学习,故有一些积累的东西,在这里给大家分享一下;顺便也当作笔记一般的存在,以免以后用到的时候,又去再次查找,难道自己记录的知识,它不香吗? 1. Redis持久化策略 1.1什么是持久化 1.1.1持久化介绍 运行环境: redis运行环境在计算机的内存中.如果redis服务器意外宕机,或者机房意外断电等.那么内存中的数据将会全部清空.势必造成业务数据的丢失. 稳定性太差。 而且由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件)。 1.1.2 持久化策略介绍 持久化:可以将内存数据按照指定的规则保存到磁盘中.当redis重启时,根据配置文件中指定的持久化文件.实现数据的恢复. 保存方式: 1.多久保存一次? 1.指定周期保存 2.实时保存 2.保存的是什么? 1.保存key-value结构 2.保存用户的操作记录 3

Hibernate - Session

旧城冷巷雨未停 提交于 2020-03-19 18:17:34
Session 是应用程序与数据库之间交互操作的一个 单线程对象 ,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作, 此对象的生命周期很短。 Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处, 相当于 JDBC 中的 Connection。 Session 接口是 Hibernate 向应用程序提供的操纵数据库的最主要的接口, 它提供了基本的保存, 更新, 删除和加载 Java 对象的方法. Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录对应. Session 能够在某些时间点, 按照缓存中对象的变化来执行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush)   站在持久化的角度, Hibernate 把对象分为 4 种状态: 临时状态, 持久化状态,, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到另一个状态 -------------------------------------------------------------------------------------------------------------------------------

Hibernate Session总结

China☆狼群 提交于 2020-03-19 18:17:13
现在我们可以在 IDEA 下 新建一个 Hibernate 项目 ,接着上次内容这次主要总结一下 Hibernate 的 Session,及其核心方法。 Session 概述 Session 接口是 Hibernate 向应用程序提供的操纵数据库的主要接口,提供了基本的 保存、更新、删除和加载 java 对象的方法 Session 具有一个缓存,位于 缓存中的对象称为持久化对象 ,和数据库中的相关记录对应 Hibernate 将对象分为 4 种状态,持久化状态,临时状态,游离状态,删除状态, Session 特定的方法可以使对象从一个状态到另一个状态。 Session 缓存 Session 接口实现中包含一系列 java 集合,这些 java 集合构成了 Session 缓存,只要 Session 实例没有结束生命周期,且没有清理缓存,则存放在他缓存中的对象也不会结束生命周期 Session 缓存可以减少 Hibernate 访问数据库的频率 操作 Session 缓存 reflush(): 会强制发送 sql查询(select)语句 ,使缓存中的数据和数据库中的数据保持一致, 数据由数据库到缓存 flush(): 会强制发送 sql更新(update)语句 ,使数据库中的数据和缓存中的数据保持一致, 数据由缓存到数据库 当程序执行 Transaction 的 commit()

Hibernate的Session介绍[转 adoocoke]

微笑、不失礼 提交于 2020-03-19 18:16:53
Session Session是Hibernate向应用程序提供操作数据的主要接口, 他提供了保存、更新、删除、加载Java对象的方法。 Session的缓存 Session有一个缓存,用来缓存Java对象。 一般的数据库操作,都要从先从Session的缓存中获取,如果缓存中获取不到,hibernate才会去数据库中获取。 缓存的作用 缓存的作用不言而喻。 1、减少数据访问的频率。2、保持保证数据相关记录与缓存中的同步。 清理缓存 Session的save、update、delete方法, 只有在清理缓存的时候才向数据库中执行一条Sql语句。 所以, Session清理缓存的时间点,是个关键概念。 Session会在一下几个时间点清理缓存,并执行相关语句: a、当应用程序调用 org.hibernate.Transaction 的 commit() 方法的时候, commit() 方法先 清理缓存,然后再向数据库提交事务。 b、当应用程序通过 Hibernate 的 Query查询接口等执行查询操作 时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。 c、当应用程序显式调用 Session 的 flush() 方法的时候。 Java对象在Hibernate中的状态 介绍缓存的方法之前,先介绍一下java对象在缓存中的几种状态