欢迎关注公众号:【 爱编码】
若是有须要后台回复 2019赠送 1T的学习资料哦!!
继续接着上一篇【数据库】Redis基础篇html
为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚原本解决这个问题。简单介绍Redis中事务的使用方法以及它的局限性。redis
127.0.0.1:6379> multi OK 127.0.0.1:6379> sadd user:a:follow user:b QUEUED 127.0.0.1:6379> zadd user:b:fans 1 user:a QUEUED 127.0.0.1:6379> exec 1) (integer) 1 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 127.0.0.1:6379> sismember user:a:follow user:b (integer) 1
Redis提供了简单的事务功能,**将一组须要一块儿执行的命令放到multi和
exec两个命令之间**。数据库
multi命令表明事务开始。
exec命令表明事务结束。
它们之间的命令是原子顺序执行的。
它不支持事务中的回滚特性。安全
基本语法教程可参考下面这个网址:
https://www.runoob.com/lua/lu...服务器
在Redis中执行Lua脚本有两种方法:eval和evalsha。app
Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布
者和订阅者不进行直接通讯,发布者客户端向指定的频道(channel)发布消息,订阅该频道的每一个客户端均可以收到该消息。运维
publish channel:sports "Tim won the championship"
subscribe channel:sports
有关订阅命令有两点须要注意:性能
- 客户端在执行订阅命令以后进入了订阅状态,只能接收subscribe、
psubscribe、unsubscribe、punsubscribe的四个命令。学习
- 新开启的订阅客户端,没法收到该频道以前的消息,由于Redis不会对
发布的消息进行持久化。大数据
Redis发布订阅与成熟MQ的比较
(1)MQ支持多种消息协议,包括AMQP,MQTT,Stomp等,而且支持JMS规范,但Redis没有提供对这些协议的支持;
(2)MQ提供持久化功能,但Redis没法对消息持久化存储,一旦消息被发送,若是没有订阅者接收,那么消息就会丢失;
(3)MQ提供了消息传输保障,当客户端链接超时或事务回滚等状况发生时,消息会被从新发送给客户端,Redis没有提供消息传输保障。
总之,MQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门作发布订阅的,可是若是系统中已经有了Redis,而且须要基本的发布订阅功能,就没有必要再安装MQ了,由于可能MQ提供的功能大部分都用不到,并且你能够容忍redis发布订阅的缺点的话,能够考虑用它。
Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出形成的数据丢失问题,当下次重启时利用以前持久化的文件便可实现数据恢复。
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持
久化过程分为手动触发和自动触发。
手动触发和自动触发操做方法参考这位大神的文章:
https://www.cnblogs.com/ysoce...
RDB的优缺点
优势:
缺点:
行都要执行fork操做建立子进程,属于重量级操做,频繁执行成本太高。
针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决。
AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再从新执行AOF文件中的命令达到恢复数据的目的。
AOF的主要做用是解决了数据持久化的实时性,目前已是Redis持久化的主流方式。
开启AOF,经过修改redis.conf配置文件
appendonly yes ##默认不开启。
AOF文件名经过appendfilename配置设置,默认文件名appendonly.aof。保存路径同RDB持久化方式一致,经过dir配置指定。
AOF的工做流程以下图:
1)全部的写入命令会追加到aof_buf(缓冲区)中。
2)AOF缓冲区根据对应的策略向硬盘作同步操做。
3)随着AOF文件愈来愈大,须要按期对AOF文件进行重写,达到压缩的目的。
4)当Redis服务器重启时,能够加载AOF文件进行数据恢复。
更详细的工做原理能够参考书籍【Redis开发与运维(付磊)】
或者参考这篇文章:
https://redisbook.readthedocs...
舒适提示
场景:AOF文件可能存在结尾不完整的状况,好比机器忽然掉电致使AOF尾部文件命令写入不全。
解决方法:
# !!! Warning: short read while loading the AOF file !!! # !!! Truncating the AOF at offset 397856725 !!! # AOF loaded anyway because aof-load-truncated is enabled
Redis持久化功能一直是影响Redis性能的高发地。主要有如下方面
1. fork操做
原由:对于高流量的Redis实例OPS可达5万以上,若是fork操做耗时在秒级别将拖慢Redis几万条命令执行,对线上应用延迟影响很是明显。正常状况下fork耗时应该是每GB消耗20毫秒左右。能够在info stats统计中查latest_fork_usec指标获取最近一次fork操做耗时,单位微秒。
优化:
1)优先使用物理机或者高效支持fork操做的虚拟化技术,避免使用Xen。
2)控制Redis实例最大可用内存,fork耗时跟内存量成正比,线上建议每一个Redis实例内存控制在10GB之内。
3)合理配置Linux内存分配策略,避免物理内存不足致使fork失败。
4)下降fork操做的频率,如适度放宽AOF自动触发时机,避免没必要要的全量复制等。
2. CPU
CPU开销分析。子进程负责把进程内的数据分批写入文件,这个过程属于CPU密集操做,一般子进程对单核CPU利用率接近90%。
CPU消耗优化。Redis是CPU密集型服务,不要作绑定单核CPU操做。因为子进程很是消耗CPU,会和父进程产生单核资源竞争。
不要和其余CPU密集型服务部署在一块儿,形成CPU过分竞争。若是部署多个Redis实例,尽可能保证同一时刻只有一个子进程执行重写工做。
3. 内存
内存消耗优化:
1)同CPU优化同样,若是部署多个Redis实例,尽可能保证同一时刻只有一个子进程在工做。
2)避免在大量写入时作子进程重写操做,这样将致使父进程维护大量页副本,形成内存消耗。
4. 硬盘
优化方法以下:
a)不要和其余高硬盘负载的服务部署在一块儿。如:存储服务、消息队列服务等。
b)AOF重写时会消耗大量硬盘IO,能够开启配置no-appendfsync-on-rewrite,默认关闭。表示在AOF重写期间不作fsync操做。
c)当开启AOF功能的Redis用于高流量写入场景时,若是使用普通机械磁盘,写入吞吐通常在100MB/s左右,这时Redis实例的瓶颈主要在AOF同步硬盘上。
d)对于单机配置多个Redis实例的状况,能够配置不一样实例分盘存储AOF文件,分摊硬盘写入压力。
注:配置no-appendfsync-on-rewrite=yes时,在极端状况下可能丢失整个AOF重写期间的数据,须要根据数据安全性决定是否配置。
5.AOF追加阻塞
当开启AOF持久化时,经常使用的同步硬盘的策略是everysec,用于平衡性能和数据安全性。对于这种方式,Redis使用另外一条线程每秒执行fsync同步硬盘。当系统硬盘资源繁忙时,会形成Redis主线程阻塞,
阻塞流程分析:
1)主线程负责写入AOF缓冲区。
2)AOF线程负责每秒执行一次同步磁盘操做,并记录最近一次同步时间。
3)主线程负责对比上次AOF同步时间:若是距上次同步成功时间在2秒内,主线程直接返回。若是距上次同步成功时间超过2秒,主线程将会阻塞,直到同步操做完成。
优化AOF追加阻塞问题主要是优化系统硬盘负载,优化方法参考第4点。
本文主要学习Redis的事务、发布订阅、以及持久化。
后续会继续学习Redis集群等方面的知识。
若是对 Java、大数据感兴趣请长按二维码关注一波,我会努力带给大家价值。以为对你哪怕有一丁点帮助的请帮忙点个赞或者转发哦。
关注公众号【爱编码】,回复2019有相关资料哦。