Redis基操

Redis 介绍

一、Redis和同类产品的比较,本职工作还是高速缓存

  • Ehcache

    • 是一个Java开源项目,使用的方式就是引入一个jar包,非常方便

  • Memcached

    • 如果开启多线程模式,读取速度将有极大的提高

    • 数据只会存储在内存中,挂掉后数据不可恢复

  • Redis

    • 数据结构非常丰富,字符串、hash列表、list、Set等等

    • 支持主从,Sentinal,分片等多种高级特性,用于负载均衡和容灾,具有高可用性

    • 几乎支持所有语言的客户端

二、做为消息队列比较及选择 <如果能用Kafka就用Kafka,对于数据不敏感的一般场景也是可以应用Redis的。>

  • Redis

    • 只能说具备发布订阅功能,一个或多个消费者订阅一个频道

  • Kafka

    • 高级特性一应俱全,集群、负载均衡、动态扩容、数据备份等

Redis与Memcached的详细区别

Type
Memcached
Redis

线程模型

多线程

单线程

数据结构

仅支持string、value最大1M、过期时间不能超过30天

string、list、hash、set、zset、geo、hyperLogLog

淘汰策略

LRU

LRU、LFU、随机等多种策略

管道与事务

不支持

支持

持久化

不支持

支持

高可用

不支持

主从复制+哨兵

集群化

客户端一致性哈希算法

主从复制+哨兵+固定哈希槽位

  • 整体来说,Redis提供了非常丰富的功能,而且性能基本上与Memcached相差无几,这也是它最近这几年占领内存数据库鳌头的原因。

  • 如果你的业务需要各种数据结构给予支撑,同时要求数据的高可用保障,那么选择Redis是比较合适的。

  • 如果你的业务非常简单,只是简单的set/get,并且对于内存使用并不高,那么使用简单的Memcached足够。

Redis 运维优化最佳实践

  • 不同业务线部署不同的实例,各自独立,避免混用,推荐不同业务线使用不同的机器,根据业务重要程度划分不同的分组来部署,避免某一个业务线出现问题影响其他业务线

  • 保证机器有足够的CPU、内存、带宽、磁盘资源,防止负载过高影响Redis性能

  • 以master-slave集群方式部署实例,并分布在不同机器上,避免单点,slave必须设置为readonly

  • master和slave节点所在机器,各自独立,不要交叉部署实例,通常备份工作会在slave上做,做备份时会消耗机器资源,交叉部署会影响到master的性能

  • 推荐部署哨兵节点增加可用性,节点数量至少3个,并分布在不同机器上,实现故障自动故障转移

  • 提前做好容量规划,一台机器部署实例的内存上限,最好是机器内存的一半,主从全量同步时会占用最多额外一倍的内存空间,防止网络大面积故障引发所有master-slave的全量同步导致机器内存被吃光

  • 做好机器的CPU、内存、带宽、磁盘监控,在资源不足时及时报警处理,Redis使用Swap后性能急剧下降,网络带宽负载过高访问延迟明显增大,磁盘IO过高时开启AOF会拖慢Redis的性能

  • 设置最大连接数上限,防止过多的客户端连接导致服务负载过高

  • 单个实例的使用内存建议控制在20G以下,过大的实例会导致备份时间久、资源消耗多,主从全量同步数据时间阻塞时间更长

  • 设置合理的slowlog阈值,推荐10毫秒,并对其进行监控,产生过多的慢日志需要及时报警 设置合理的复制缓冲区repl-backlog大小,适当调大repl-backlog可以降低主从全量复制的概率

  • 设置合理的slave节点client-output-buffer-limit大小,对于写入量很大的实例,适当调大可以避免主从复制中断问题

  • 备份时推荐在slave节点上做,不影响master性能

  • 不开启AOF或开启AOF配置为每秒刷盘,避免磁盘IO消耗降低Redis性能

  • 当实例设置了内存上限,需要调大内存上限时,先调整slave再调整master,否则会导致主从节点数据不一致

  • 对Redis增加监控,监控采集info信息时,使用长连接,频繁的短连接也会影响Redis性能,redis性能监控指标,参考这个文章

  • 线上扫描整个实例数时,记得设置休眠时间,避免扫描时QPS突增对Redis产生性能抖

  • 做好Redis的运行时监控,尤其是expired_keys、evicted_keys、latest_fork_usec指标,短时间内这些指标值突增可能会阻塞整个实例,引发性能问题

Redis集群搭建的三种方式

  1. 主从模式(master/slaver) 或 一主多从

注意: 生产坏境是不会单单只有主从模式的

  1. sentinel模式, < 哨兵模式 >

功能:

由于:sentinel也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群, 最好不要和Redis部署在同一台机器

优缺点:sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了

  1. cluster模式

cluster的出现是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器 cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。 因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容

注意: 这种模式适合数据量巨大的缓存要求,当数据量不是很大使用sentinel即可。

单机版

Redis源码安装

Redis客户端测试

Systemctl 守护

redis.conf 基本配置解释

常见错误

Redis Cluster 集群安装(部署一)

环境:

Centos7 系统 < 单机集群 | 多台服务器集群>

安装 ruby 环境,管理 redis 接口

< 仅启动集群 redis 服务器安装即可,不需要所有都安装 >

所有的 redis 服务器都执行

来到启动集群的服务器

< 已安装 ruby 环境的服务器 >

选择一:单机版,不适合生产环境

一个服务器启动 6 个 redis 节点

选择二:生产环境

多服务器,考虑到成本和资源最大化,这里使用三台服务器启动6个redis节点


Nginx 负责转发

Redis Cluster 集群安装(部署二)

端口号:7000-7005

本次分布式分片集群在一台LInux系统即可,只需要安装多个实例作为集群配置。

安装ruby环境支持:

yum安装2.0.0版本,但是gem需要2.2.2版本以上,所以选择编译

下载并安装ruby环境:

修改gem工具国内源:

集群节点准备:

配置7000端口实例:

拷贝其他端口实例:

启动所有实例:

创建命令软链接:

(这个命令过期了,现在使用redis-cli命令)(可选执行命令)

查看进程:

加入所有实例节点到集群管理:

分布式主从规则为,前三个实例节点是主,对应的后面三个实例节点为从节点,如果replicas 2,那就多加3个实例节点

查看主节点状态:

查看从节点状态:

Redis-分布式集群(管理)

集群节点增加准备:

启动新节点实例:

查看进程:

添加主节点:(7000实例是管理节点)

查看主节点状态:

转移slot(重新分片):

重新查看主节点状态:(可以看到集群数据的重新分片)

添加从节点:

查看从节点状态:

集群节点删除准备:

移动要删除节点的数据分片:

重新查看主节点状态:(可以看到集群数据的重新分片)

继续移动数据片:

重新查看主节点状态:(可以看到集群数据的重新分片)

最后一次移动数据片:

重新查看主节点状态:(可以看到集群数据的重新分片)

删除清空数据片的主节点:

其他配置管理:

Last updated