<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Redis on My Blog</title><link>/tags/redis/</link><description>Recent content in Redis on My Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 15 Aug 2017 00:00:00 +0000</lastBuildDate><atom:link href="/tags/redis/index.xml" rel="self" type="application/rss+xml"/><item><title>Celery简介以及与Redis的集成使用</title><link>/2017/08/15/celery%E7%AE%80%E4%BB%8B%E4%BB%A5%E5%8F%8A%E4%B8%8Eredis%E7%9A%84%E9%9B%86%E6%88%90%E4%BD%BF%E7%94%A8/</link><pubDate>Tue, 15 Aug 2017 00:00:00 +0000</pubDate><guid>/2017/08/15/celery%E7%AE%80%E4%BB%8B%E4%BB%A5%E5%8F%8A%E4%B8%8Eredis%E7%9A%84%E9%9B%86%E6%88%90%E4%BD%BF%E7%94%A8/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h1 id="celery"&gt;Celery&lt;/h1&gt;
&lt;h2 id="1什么是clelery"&gt;1.什么是Clelery&lt;/h2&gt;
&lt;p&gt;Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具.&lt;/p&gt;
&lt;h3 id="celery架构"&gt;Celery架构&lt;/h3&gt;
&lt;p&gt;&lt;img alt="2522678-d369b6a4c4265225" loading="lazy" src="/2017/08/15/celery%E7%AE%80%E4%BB%8B%E4%BB%A5%E5%8F%8A%E4%B8%8Eredis%E7%9A%84%E9%9B%86%E6%88%90%E4%BD%BF%E7%94%A8/2522678-d369b6a4c4265225.png"&gt;&lt;/p&gt;
&lt;p&gt;Celery的架构由三部分组成，消息中间件（message broker），任务执行单元（worker）和任务执行结果存储（task result store）组成。&lt;/p&gt;
&lt;h4 id="消息中间件"&gt;消息中间件&lt;/h4&gt;
&lt;p&gt;Celery本身不提供消息服务，但是可以方便的和第三方提供的消息中间件集成。包括，RabbitMQ, Redis等等&lt;/p&gt;
&lt;h4 id="任务执行单元"&gt;任务执行单元&lt;/h4&gt;
&lt;p&gt;Worker是Celery提供的任务执行的单元，worker并发的运行在分布式的系统节点中。&lt;/p&gt;
&lt;h4 id="任务结果存储"&gt;任务结果存储&lt;/h4&gt;
&lt;p&gt;Task result store用来存储Worker执行的任务的结果，Celery支持以不同方式存储任务的结果，包括AMQP, redis等&lt;/p&gt;
&lt;h3 id="版本支持情况"&gt;版本支持情况&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Celery version 4.0 runs on
Python ❨2.7, 3.4, 3.5❩
PyPy ❨5.4, 5.5❩
This is the last version to support Python 2.7, and from the next version (Celery 5.x) Python 3.5 or newer is required.
If you’re running an older version of Python, you need to be running an older version of Celery:
Python 2.6: Celery series 3.1 or earlier.
Python 2.5: Celery series 3.0 or earlier.
Python 2.4 was Celery series 2.2 or earlier.
Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2使用场景"&gt;2.使用场景&lt;/h2&gt;
&lt;p&gt;异步任务：将耗时操作任务提交给Celery去异步执行，比如发送短信/邮件、消息推送、音视频处理等等&lt;/p&gt;</description></item><item><title>Redis持久化</title><link>/2017/08/12/redis%E6%8C%81%E4%B9%85%E5%8C%96/</link><pubDate>Sat, 12 Aug 2017 00:00:00 +0000</pubDate><guid>/2017/08/12/redis%E6%8C%81%E4%B9%85%E5%8C%96/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;Redis支持RDB和AOF两种持久化机制，持久化功能有效地避免因进程退出造成的数据丢失问题，当下次重启时利用之前持久化的文件即可实现数 据恢复。理解掌握持久化机制对于Redis运维非常重要&lt;/p&gt;
&lt;h1 id="1rdb持久化"&gt;1.RDB持久化&lt;/h1&gt;
&lt;p&gt;RDB持久化是把当前进程数据生成快照保存到硬盘的过程，触发RDB持久化过程分为手动触发和自动触发&lt;/p&gt;
&lt;h4 id="1触发机制"&gt;1）触发机制&lt;/h4&gt;
&lt;p&gt;手动触发分别对应save和bgsave命令&lt;/p&gt;
&lt;p&gt;·save命令：阻塞当前Redis服务器，直到RDB过程完成为止，对于内存 比较大的实例会造成长时间阻塞，线上环境不建议使用&lt;/p&gt;
&lt;p&gt;·bgsave命令：Redis进程执行fork操作创建子进程，RDB持久化过程由子 进程负责，完成后自动结束。阻塞只发生在fork阶段，一般时间很短&lt;/p&gt;
&lt;h4 id="2自动触发rdb的持久"&gt;2）自动触发RDB的持久&lt;/h4&gt;
&lt;p&gt;1）使用save相关配置，如“save m n”。表示m秒内数据集存在n次修改 时，自动触发bgsave。&lt;/p&gt;
&lt;p&gt;2）如果从节点执行全量复制操作，主节点自动执行bgsave生成RDB文件并发送给从节点，更多细节见6.3节介绍的复制原理。&lt;/p&gt;
&lt;p&gt;3）执行debug reload命令重新加载Redis时，也会自动触发save操作。&lt;/p&gt;
&lt;p&gt;4）默认情况下执行shutdown命令时，如果没有开启AOF持久化功能则 自动执行bgsave。&lt;/p&gt;
&lt;p&gt;bgsave是主流的触发RDB持久化方式&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" loading="lazy" src="webp"&gt;&lt;/p&gt;
&lt;p&gt;1）执行bgsave命令，Redis父进程判断当前是否存在正在执行的子进 程，如RDB/AOF子进程，如果存在bgsave命令直接返回。&lt;/p&gt;
&lt;p&gt;2）父进程执行fork操作创建子进程，fork操作过程中父进程会阻塞，通 过info stats命令查看latest_fork_usec选项，可以获取最近一个fork操作的耗时，单位为微秒&lt;/p&gt;
&lt;p&gt;3）父进程fork完成后，bgsave命令返回“Background saving started”信息并不再阻塞父进程，可以继续响应其他命令。&lt;/p&gt;
&lt;p&gt;4）子进程创建RDB文件，根据父进程内存生成临时快照文件，完成后 对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的 时间，对应info统计的rdb_last_save_time选项。&lt;/p&gt;
&lt;p&gt;5）进程发送信号给父进程表示完成，父进程更新统计信息，具体见 info Persistence下的rdb_*相关选项。&lt;/p&gt;
&lt;p&gt;RDB文件的处理&lt;/p&gt;
&lt;p&gt;保存：RDB文件保存在dir配置指定的目录下，文件名通过dbfilename配 置指定。可以通过执行config set dir{newDir}和config set dbfilename{newFileName}运行期动态执行，当下次运行时RDB文件会保存到新目录。&lt;/p&gt;
&lt;h1 id="rdb的优缺点"&gt;RDB的优缺点&lt;/h1&gt;
&lt;h4 id="rdb的优点"&gt;RDB的优点：&lt;/h4&gt;
&lt;p&gt;·RDB是一个紧凑压缩的二进制文件，代表Redis在某个时间点上的数据 快照。非常适用于备份，全量复制等场景。比如每6小时执行bgsave备份， 并把RDB文件拷贝到远程机器或者文件系统中（如hdfs），用于灾难恢复。&lt;/p&gt;
&lt;p&gt;·Redis加载RDB恢复数据远远快于AOF的方式。&lt;/p&gt;
&lt;h4 id="rdb的缺点"&gt;RDB的缺点：&lt;/h4&gt;
&lt;p&gt;·RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运 行都要执行fork操作创建子进程，属于重量级操作，频繁执行成本过高。&lt;/p&gt;
&lt;p&gt;·RDB文件使用特定二进制格式保存，Redis版本演进过程中有多个格式 的RDB版本，存在老版本Redis服务无法兼容新版RDB格式的问题。&lt;/p&gt;
&lt;p&gt;针对RDB不适合实时持久化的问题，Redis提供了AOF持久化方式来解决。&lt;/p&gt;
&lt;h1 id="2aof持久化"&gt;2.AOF持久化&lt;/h1&gt;
&lt;p&gt;AOF（append only file）持久化：以独立日志的方式记录每次写命令， 重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用 是解决了数据持久化的实时性，目前已经是Redis持久化的主流方式&lt;/p&gt;
&lt;h4 id="1使用aof"&gt;1）使用AOF&lt;/h4&gt;
&lt;p&gt;开启AOF功能需要设置配置：appendonly yes，默认不开启。AOF文件名 通过appendfilename配置设置，默认文件名是appendonly.aof。保存路径同 RDB持久化方式一致，通过dir配置指定。AOF的工作流程操作：命令写入 （append）、文件同步（sync）、文件重写（rewrite）、重启加载 （load）&lt;/p&gt;</description></item></channel></rss>