Redis

Posted brightbright

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis相关的知识,希望对你有一定的参考价值。

第八部分 解析配置文件redis.conf

1,配置文件在哪


Redis

2,Units单位

Redis

1 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit

2 对大小写不敏感

Redis

3,INCLUDES包含

Redis

   和我们的spring配置文件类似,可以通过includes包含,redis.conf可以作为总闸,包含其他

Redis

4,NETWORK通用

Redis

默认情况下,如果没有指定“bind”配置指令,则Redis侦听用于连接服务器上所有可用的网络接口。

1,bind   

默认情况下,redis 在 server 上所有有效的网络接口上监听客户端连接。如果只想让它在一个或多个网络接口上监听,那你就绑定一个IP或者多个IP。多个ip空格分隔即可。

Redis

2,prot运行端口

Redis

3,Tcp-backlog

设置tcp的backlog,backlog其实是一个连接队列,backlog队列总和=未完成三次握手队列 + 已经完成三次握手队列。

在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconn和tcp_max_syn_backlog两个值

来达到想要的效果

4,timeout 

Redis

当客户端闲置多少秒后关闭连接,如果设置为0表示关闭该功能。

5,tcp-keepalive 300

单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300S

  建议设置成60

Redis

5,GRNERAL通用

Redis

daemonize no   是否以守护模式启动,默认为no,配置为yes时以守护模式启动,这时redis instance会将进程号pid写入默认文件/var/run/redis.pid。

supervised no 可以通过upstart和systemd管理Redis守护进程,这个参数是和具体的操作系统相关的。

pidfile /var/run/redis_6379.pid 配置pid文件路径。当redis以守护模式启动时,如果没有配置pidfile,pidfile默认值是/var/run/redis.pid 。

loglevel notice  日志级别。可选项有:debug(记录大量日志信息,适用于开发、测试阶段); verbose(较多日志信息); notice(适量日志信息,使用于生产环境);warning(仅有部分重要、关键信息才会被记录)。

logfile ""   日志文件的位置,当指定为空字符串时,为标准输出,如果redis已守护进程模式运行,那么日志将会输出到 /dev/null 。

syslog-enabled no    是否把日志记录到系统日志。

syslog-ident   设置系统日志的id     如  syslog-ident redis

databases 16   设置数据库的数目。默认的数据库是DB 0 ,可以在每个连接上使用select 命令选择一个不同的数据库,dbid是一个介于0到databases - 1 之间的数值。

always-show-logo yes  是否一直显示日志


Redis

6,SNAPSHOTTING快照

Redis

save  保存数据到磁盘。格式是:save ,含义是在 seconds 秒之后至少有 changes个keys 发生改变则保存一次。

如        save 900 1      900秒有一条数据改变就保存

            save 300 10      300秒有10条数据改变就保存

            save 60 10000   600秒有10000条数据改变就保存

stop-writes-on-bgsave-error yes  默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘, 否则就会没人注意到灾难的发生。 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了。

rdbcompression yes  是否在dump .rdb数据库的时候压缩字符串,默认设置为yes。如果你想节约一些cpu资源的话,可以把它设置为no,这样的话数据集就可能会比较大。

rdbchecksum yes  是否CRC64校验rdb文件,会有一定的性能损失(大概10%)

dbfilename dump.rdb   rdb文件的名字。

Redis

7,REPLICATION复制

讲主从复制再说

Redis

8,SECURITY安全

Redis

主要用于访问密码和查看,设置和取消

Redis

Redis

9,LIMITS限制

maxclients 10000   

设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。当你

无法设置进程文件句柄限制时,redis会设置为当前的文件句柄限制值减去32,因为redis会为自

身内部处理逻辑留一些句柄出来。如果达到了此限制,redis则会拒绝新的连接请求,并且向这

些连接请求方发出“max number of clients reached”以作回应。

maxmemory

设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。

 但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素

maxmemory-policy

(1)volatile-lru:使用LRU算法移除key,只对设置了过期时间的键

(2)allkeys-lru:使用LRU算法移除key

(3)volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键

(4)allkeys-random:移除随机的key

(5)volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key

(6)noeviction:不进行移除。针对写操作,只是返回错误信息

maxmemory-samples

设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,

redis默认会检查这么多个key并选择其中LRU的那个

10,APPEND ONLY MODE 追加[持久化再说]



第九部分 常见配置redis.conf介绍

参数说明

redis.conf 配置项说明如下:

1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

  daemonize no

2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定

  pidfile /var/run/redis.pid

3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字

  port 6379

  bind 127.0.0.1

5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能

  timeout 300

6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

  loglevel verbose

7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null

  logfile stdout

8. 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id

  databases 16

9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

  save

  Redis默认配置文件中提供了三个条件:

  save 900 1

  save 300 10

  save 60 10000

  分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

 

10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

  rdbcompression yes

11. 指定本地数据库文件名,默认值为dump.rdb

  dbfilename dump.rdb

12. 指定本地数据库存放目录

  dir ./

  slaveof

14. 当master服务设置了密码保护时,slav服务连接master的密码

  masterauth

15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭

  requirepass foobared

16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

  maxclients 128

17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

  maxmemory

18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no

  appendonly no

19. 指定更新日志文件名,默认为appendonly.aof

   appendfilename appendonly.aof

20. 指定更新日志条件,共有3个可选值: 

  no:表示等操作系统进行数据缓存同步到磁盘(快) 

  always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 

  everysec:表示每秒同步一次(折衷,默认值)

  appendfsync everysec

 

21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)

   vm-enabled no

22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

   vm-swap-file /tmp/redis.swap

23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

   vm-max-memory 0

24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值

   vm-page-size 32

25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。

   vm-pages 134217728

26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4

   vm-max-threads 4

27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启

  glueoutputbuf yes

28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法

  hash-max-zipmap-entries 64

  hash-max-zipmap-value 512

29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)

  activerehashing yes

30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

  include /path/to/local.conf



第十部分 Redis的持久化

1,概述

https://redis.io/topics/persistence

Redis

Redis

2,RDB【Redis DataBase】

2.1,什么是RDB

Redis

save 900 1

save 300 10

save 60   10000

在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方 式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

2.2,什么是FORK

Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程

2.3,保存位置及配置位置

Rdb 保存的是dump.rdb文件

Redis

2.4,如何触发RDB快照

Redis

Redis

执行flushall命令,也会产生dump.rdb文件,但里面是空的,无意义

Redis

2.5,如何恢复数据

将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可

CONFIG GET dir获取目录

Redis

Redis

2.6,优点

适合大规模的数据恢复

对数据完整性和一致性要求不高

2.7,缺点

在一定间隔时间做一次备份,所以如果redis意外down掉的话,就 会丢失最后一次快照后的所有修改

Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

Redis

3,AOF

3.1,概述

Redis

3.2,原理

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),

只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis

重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

3.3,保存位置及位置配置

Aof保存的是appendonly.aof文件

Redis

3.4,AOF启动/修复/恢复

正常恢复

  启动:设置Yes  修改默认的appendonly no,改为yes

  将有数据的aof文件复制一份保存到对应目录(config get dir)

  恢复:重启redis然后重新加载

异常恢复

  启动:设置Yes   修改默认的appendonly no,改为yes

  备份被写坏的AOF文件

  修复:  Redis-check-aof --fix进行修复

  恢复:重启redis然后重新加载

3.5,优势

  每修改同步:appendfsync always 同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好

  每秒同步:appendfsync everysec 异步操作,每秒记录 如果一秒内宕机,有数据丢失

  不同步:appendfsync no 从不同步

3.5,劣势

  相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdb

  Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

Redis

4,说了那么多,我们选择哪一个呢

4.1,官方建议

Redis

4.2,整理我们的理解及处理方式

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储

AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些 命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾. Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大

只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.

同时开启两种持久化方式

  在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据, 因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.

  RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢? 作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份), 快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

性能建议

因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。

如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。

如果不Enable AOF ,仅靠Master-Slave Replication 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。新浪微博就选用了这种架构



第十一部分 Redis的事务

1,什么是Redis事务

  可以一次执行多个命令,本质是一组命令的集合。一个事务中的 所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞

  官网说明

https://redis.io/topics/transactions

Redis

Redis

2,能为我们做什么

  一个队列中,一次性、顺序性、排它性的执行一系列命令

Redis

3,怎么使用呢?

3.1,常用命令

Redis

3.2, 情况1:正常执行

Redis

3.3,情况2:放弃事务

Redis

3.4, 情况3:全体连坐

Redis

3.5,情况4:冤头债主

Redis

3.6,情况5:watch监控

3.6.1,悲观锁/乐观锁

 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,

乐观锁策略:提交版本必须大于记录当前版本才能执行更新

3.6.2,初始化信用卡可用余额和欠额

Redis


3.6.2,无加塞篡改

先监控再开启multi, 保证两笔金额变动在同一个事务内

Redis

3.6.2,有加塞篡改

监控了key,如果key被修改了,后面一个事务的执行失效

Redis

3.6.3,unwatch

Redis

    一旦执行了exec之前加的监控锁都会被取消掉了

3.6.4,小结

      Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变, 比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行

      通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化, EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败

Redis

4,3阶段

  开启:以MULTI开始一个事务

  入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面

  执行:由EXEC命令触发事务

5,3特性

单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行, 也就不存在”事务内的查要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题

不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚



第十二部分 Redis的复制(Master/Slave)

1,什么是复制

RedisRedis 的读并发量太大怎么办?

Redis单机版的Redis 挂掉怎么办?

Redis需要写并发又要安全  在redis 3.0 后,官方发布了集群方案

1.1,官网说明

Redis

1.2,行话

行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,

自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主

Redis

2,有什么作用

读写分离

容灾恢复

Redis

3,怎么使用

3.1,配从不配主

3.2,配置命令  【SLAVEOF 主库IP 主库端口】  

每次与master断开之后,都需要重新连接,除非你配置进redis.conf文件

Info replication可以查看

3.3,详细操作  

拷贝多个redis.conf文件

开启daemonize yes

Pid文件名字

指定端口

Log文件名字

Dump.rdb名字

3.4,一主二仆

演示问题

1 切入点问题?slave1、slave2是从头开始复制还是从切入点开始复制?比如从k4进来,那之前的123是否也可以复制

2 从机是否可以写?set可否?

3 主机shutdown后情况如何?从机是上位还是原地待命

4 主机又回来了后,主机新增记录,从机还能否顺利复制?

5 其中一台从机down后情况如何?依照原有它能跟上大部队吗?

3.5,薪火相传

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力

中途变更转向:会清除之前的数据,重新建立拷贝最新的

Slaveof 新主库IP 新主库端口

3.6,反客为主

SLAVEOF no one

  使当前数据库停止与其他数据库的同步,转成主数据库


Redis

4,复制的原理

Slave启动成功连接到master后会发送一个sync命令

Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步

全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行



5,哨兵模式

5.1,什么是哨兵模式

    反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

5.2,怎么玩(使用步骤)

    调整结构,6379带着80、81

    自定义的/myredis目录下新建sentinel.conf文件,名字绝不能错

    配置哨兵,填写内容

       sentinel monitor 被监控主机名字(自己起名字) 127.0.0.1 6379 1   如     sentinel monitor hos6379  127.0.0.1 6379 1

      上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机

    启动哨兵   ./redis-sentinel /root/master-slaver/sentinel.conf 

    正常主从演示

    原有的master挂了

    投票新选

    重新主从继续开工,info replication查查看

    问题:如果之前的master重启回来,会不会双master冲突?

  5.3,一组sentinel能同时监控多个Master


Redis

6,复制的缺点

由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。



第十三部分 高可用高并发集群配置

1,中心化和去中心化

1.1,中心化

意思是所有的节点都要有一个主节点

缺点:中心挂了,服务就挂了

            中心处理数据的能力有限,不能把节点性能发挥到最大

特点:就是一个路由作用

Redis

1.2,去中心化

特点:去掉路由,我自己来路由

Redis

以上通俗的就是

中心化:几个经过认证的嘉宾在‘讲话’,所有其他人在听。

去中心化:每个人都可以‘讲话’,每个人都可以选择听或者讲。

Redis

2,Redis集群的执行流程分析

2.1,哈希槽说明

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。

2.2,执行流程分析

假如redis集群里面能存放90个key,那么redis集群把90key平分到3个主机

redis对每个主机里面30个存储位置都编号,当应用连接到主机1上面时,应该发送一个写的命令

主机使用crc16算出槽号

如果槽号在1-30 可以直接操作主机1

如果槽号在31-60那么redis会转发到主机2

如果应该再发一个命令set age 22

那么主机2使用crc16再算槽号再转发

Redis

3,Redis集群的搭建

3.1,文档

http://redis.cn/topics/cluster-tutorial.html

3.2,原理:去中心化

3.3,集群规则

机器编号

ip

port

1

192.168.120.129

7000

2

192.168.120.129

7001

3

192.168.120.129

7002

4

192.168.120.129

7003

5

192.168.120.129

7004

6

192.168.120.129

7005

3.4,搭建过程

3.4.1 新建文件夹

 Redis

3.4.2 准备一个服务端程序

 Redis

3.4.3准备6个redis的配置文件

Redis

Redis

 

Redis-1
bind 0.0.0.0                    69
port 7000                       92
daemonize yes                   136
# 打开aof 持久化
appendonly yes                  672 
# 开启集群
cluster-enabled yes             814
# 集群的配置文件,该文件自动生成   
cluster-config-file nodes-7000.conf  822
# 集群的超时时间
cluster-node-timeout 5000         828
------------------------------------
Redis-2
daemonize yes
bind 0.0.0.0
port 7001
# 打开aof 持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-7001.conf
# 集群的超时时间
cluster-node-timeout 5000
-------------------------------------
Redis-3
daemonize yes
bind 0.0.0.0
port 7002
# 打开aof 持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-7002.conf
# 集群的超时时间
cluster-node-timeout 5000
------------------------------------
Redis-4
daemonize yes
bind 0.0.0.0
port 7003
# 打开aof 持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-7004.conf
# 集群的超时时间
cluster-node-timeout 5000
-------------------------------------
Redis-5
daemonize yes
bind 0.0.0.0
port 7004
# 打开aof 持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-7005.conf
# 集群的超时时间
cluster-node-timeout 5000
--------------------------------------
Redis-6
daemonize yes
bind 0.0.0.0
port 7005
# 打开aof 持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-7006.conf
# 集群的超时时间
cluster-node-timeout 5000

3.4.3同时启动所有的redis

Redis

3.4.4 使用脚本创建集群(分配槽)

 找到集群脚本,在src/src/redis-trib.rb  要安装Ruby的环境【不推荐

3.4.5 使用docker 下载redis-trib的镜像运行【推荐】

安装Docker

yum install docker

启动docker

systemctl start docker

A: 下载镜像

docker pull inem0o/redis-trib

 

docker run -it --net host inem0o/redis-trib create --replicas 1 
    192.168.120.129:7000 192.168.120.129:7001 
    192.168.120.129:7002 192.168.120.129:7003 
    192.168.120.129:7004 192.168.120.129:7005

-it是为了可以输入

--net host 是为了上docker容器能连接上本地的宿主机

Redis

Redis


3.4.6测试集群环境

Redis

-c 表示连接集群

Redis

Redis

Redis

到此集群搭建完成



第十四部分 Redis客户端使用

1, 工具说明

    1,使用Redis【可以看到层级关系】

Redis

    2,使用Redis

Redis

这个没有层级关系

2, 下载客户端redis plus

链接:https://pan.baidu.com/s/1hPBErS--3zOZv6EXL2PEsA 

提取码:048c 

Redis

3,安装

Redis

Redis


Redis

3,连接

1,关闭linux防火墙

 

Centos6
查看防火墙状态: 
[root@centos6 ~]# service iptables status
iptables:未运行防火墙。
开启防火墙:
[root@centos6 ~]# service iptables start
关闭防火墙:
[root@centos6 ~]# service iptables stop
centos7
查看防火墙状态: 
firewall-cmd --state
关闭防火墙
systemctl stop firewalld.service
开启防火墙
systemctl start firewalld.service
禁用防火墙
systemctl disable firewalld.service 

2,注释redis.conf里面的bind 127.0.0.1

Redis

3,修改redis.conf里面的密码

Redis

4,验证密码是否成功

Redis

5,连接


6,连接成功













以上是关于Redis的主要内容,如果未能解决你的问题,请参考以下文章

redis存储session配制方法

Redis实现分布式锁(设计模式应用实战)

Redis实现分布式锁(设计模式应用实战)

Redis缓存:java语言注释符号,附超全教程文档

spring boot 整合 redis

Redis 学习 —— 数据类型及操作