Redis/RedisCluster安装和

Redis服务搭建与配置
本文详细介绍Redis服务的安装与配置过程,包括下载、编译、启动及持久化方案的设置。此外,还深入探讨了主从复制和集群的搭建方法。

搭建Redis服务

下载Redis

Redis的官网http://redis.io/
下载地址http://download.redis.io/releases/


我这里以redis-3.0.0版本来进行搭建
第一步在Linux环境中执行命令下载该版本:

wget http://download.redis.io/releases/redis-3.0.0.tar.gz

下载截图:
这里写图片描述


第二步解压下载下来的压缩文件
解压命令:

tar -zxvf redis-3.0.0.tar.gz

解压后的截图:
这里写图片描述


安装Redis

由于Redis是C语言开发的,因此需要让操作系统具有C环境(注意:CentOS自带gcc环境)
第一步在Linux环境中安装gcc环境(用于编译C语言开发的应用)

yum install -y gcc-c++

由于刚才解压的文件在用户的家目录下,此时需要把解压后的redis文件移动到/usr/local/redis目录下:

mv redis-3.0.0 /usr/local/redis/

第二步编译redis源码

cd /usr/local/redis/redis-3.0.0
make

第三步安装redis(我这里安装目录安装到/usr/local/redis)

make install PREFIX=/usr/local/redis/redis-master

安装完后在/usr/local/redis/目录中就多出来了一个目录:redis01


启动Redis

前台启动Redis

启动方式先进入安装生产的目录中的bin目录

cd /usr/local/redis/redis01/bin

查看该目录有哪些文件:

ls 

这里写图片描述
执行一项命令进行启动服务:

./redis-server

启动的结果图:
这里写图片描述

前台关闭Redis服务

直接使用快捷键Ctril+C


后台启动Redis服务

第一步将Redis源码包中的redis.conf配置文件复制到安装目录的bin目录中(/usr/local/redis/redis01/bin/)

cp /usr/local/redis/redis-3.0.0/redis.conf /usr/local/redis/redis01/bin/

第二步修改redis.conf配置文件,把daemonize由no改为yes

vim /usr/local/redis/redis01/bin/redis.conf

这里写图片描述

第三步执行命令后台启动Redis服务

/usr/local/redis/redis01/bin/redis-server redis.conf

第四步查看是否启动成功

ps -aux|grep redis

这里写图片描述

关闭后台启动的Redis服务

方式一强制关闭也叫非正式关闭(不推荐使用

kill -9  6695

方式二正式关闭

usr/local/redis/redis01/bin/redis-cli shutdown

Redis自带客户端

打开Redis自带的客户端

/usr/local/redis/redis01/bin/redis-cli -h 127.0.0.1 -p 6379

-h:redis服务器IP地址。默认地址是:127.0.0.1
-p:redis实例端口号。默认端口为:6379

Redis服务本类就对外服务的,因此我们需要设置Redis服务端口防火墙开放

echo '-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT' >>/etc/sysconfig/iptables

再重启防火墙:

service iptables restart

到这里就已经在Linux系统中搭建起了Redis的服务了



Linux修改Redis持久化方案

rdb持久化

rdb方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。rdb是Redis默认采用的持久化方式。
这里写图片描述
“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照。
“save 300 10”表示5分钟(300秒)内至少10个键被更改则进行快照。

配置快照文件目录
在redis.conf文件中配置dir
这里写图片描述

配置快照文件名称
这里写图片描述
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。

rdb的不足点

通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。
如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。

aof持久化

默认情况下Redis没有开启aof(append only file)方式的持久化。
开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬
盘中的AOF文件。
开启aof
这里写图片描述
aof持久化文件名称修改
这里写图片描述
aof持久化文件的路径和rdb路径一样



Linux环境中配置Redis的主从复制

什么是主从复制

持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障。
说明
- 1主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器崩溃了,其它两台redis服务也可以继续提供服务。
- 2主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
- 3一个主redis,可以有多个从redis。
- 4主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求。
- 5一个redis可以即是主又是从。
- 6从机不能执行写的操作。

主Redis配置

主Redis其实不需要进行任何配置

从Redis配置

修改从redis服务器上的redis.conf文件
这里写图片描述
关于怎么配置主机崩溃了,从机顶上,主机好了,从机再次退下的配置,可以在网上了解下



Linux环境中搭建Redis集群

架构细节
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot(槽)上,cluster 负责维护node<->slot<->value
(5)Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
Redis集群容错
(1)集群中所有master参与投票,如果半数以上master节点与其中一个master节点通信超过(cluster-node-timeout),认为该master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail)?
如果集群任意master挂掉,且当前master(主机)没有slave(从机),则集群进入fail状态。也可以理解成集群的[0-16383]slot映射不完全时进入fail状态。
如果集群超过半数以上master(主机)挂掉,无论是否有slave(从机),集群进入fail状态。


准备搭建Redis集群环境

在这里我们就通过一台电脑,在上面搭建6个Redis服务来作为集群的演示(3台主机,3台从机)
搭建Ruby环境
redis集群管理工具redis-trib.rb(该管理工具是用ruby脚本写的)依赖ruby环境,首先需要安装ruby环境。

yum install -y ruby
yum install -y rubygems

通过gem安装ruby和redis接口:(如果没有接口,可以自己去下载redis对应版本的接口)

gem install redis-3.0.0.gem

搭建集群
创建集群存放Linux所在的目录:

mkdir -p /usr/local/redis/redis-cluster/

把之前安装的redis文件的bin目录拷贝到上面创建的目录中,并改名为redis-cluster-7001:

cp -r bin /usr/local/redis-cluster/reids-cluster-7001

将拷贝的redis目录中的持久化文件删除和修改redis.conf配置文件中的端口和打开redis集群:

rm -r appendonly.aof dump.rdb

修改redis.conf中的端口为7001,和打开集群:cluster-enabled yes

复制redis-cluster-7001五份,并重命名为redis-cluster-7002到redis-cluster-7006,并修改里面的redis.conf文件中端口也从7002到7006:

cp -r redis-cluster-7001 redis-cluster-7002
cp -r redis-cluster-7001 redis-cluster-7003
cp -r redis-cluster-7001 redis-cluster-7004
cp -r redis-cluster-7001 redis-cluster-7005
cp -r redis-cluster-7001 redis-cluster-7006

修改端口就不展示了;

启动这六台redis服务(下面是启动的shell脚本)

cd redis-cluster-7001
./redis-server redis.conf
cd ..
cd redis-cluster-7002
./redis-server redis.conf
cd ..
cd redis-cluster-7003
./redis-server redis.conf
cd ..
cd redis-cluster-7004
./redis-server redis.conf
cd ..
cd redis-cluster-7005
./redis-server redis.conf
cd ..
cd redis-cluster-7006
./redis-server redis.conf
cd ..

把redis-trib.rb(redis解压包中src目录下)拷贝到集群所在的目录:

cp redis-trib.rb /usr/local/redis/redis-cluster/

创建集群:在集群所在的目录执行以下命令;

./redis-trib.rb create --replicas 1 192.168.211.128:7001 192.168.211.128:7002 192.168.211.128:7003 192.168.211.128:7004 192.168.211.128:7005 192.168.211.128:7006

连接集群

cd /usr/local/redis/redis-cluster/redis-cluster-7001/
./redis-cli -h 192.168.211.128 -p 7001 -c

连接上后通过命令查看集群信息:

cluster info

查看结果:
这里写图片描述


测试
向集群中添加三个数据,看是不是平均分布到各个节点上进行存储:
这里写图片描述


节点的维护
添加主节点
在集群中添加一个节点(并删除节点中的所有缓存信息):

cp -r redis-cluster-7001 redis-cluster-7007
cd redis-cluster-7007
rm dump.rdb appendonly.aof -

修改新增的节点端口为7007端口;

添加7007节点作为新节点(只需要新增的节点和集群中任意一个节点连接就可以进行添加了):

./redis-trib.rb add-node 192.168.211.128:7007 192.168.211.128:7001

hash槽重新分配
添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据(连接集群中任意一个可用的节点都可以)。

./redis-trib.rb reshard 192.168.101.3:7001

输入要分配的槽数量:
这里写图片描述
输入:1000,表示分配1000个槽点;

输入接收槽的结点id:
这里写图片描述
也就是新增节点的id;

输入源结点id:
这里写图片描述
输入yes开始移动槽到目标结点id:
这里写图片描述
添加从节点
在上面添加了一个主节点7007,现在给主节点7007添加一个从节点:

./redis-trib.rb add-node --slave --master-id cad9f7413ec6842c971dbcc2c48b4ca959eb5db4  192.168.211.128:7008 192.168.211.128:7001

cad9f7413ec6842c971dbcc2c48b4ca959eb5db4这个是需要添加从节点的id(也就是7007节点的id);
注意:如果原来该结点在集群中的配置信息已经生成到cluster-config-file指定的配置文件中(如果cluster-config-file没有指定则默认为nodes.conf),这时可能会报错:

[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

解决方法:解决方法是删除生成的配置文件nodes.conf,删除后再执行上面添加从节点的方法;

删除节点

./redis-trib.rb del-node 192.168.211.128:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017

4b45eb75c8b428fbd77ab979b85080146a9bc017这个是要删除节点的id
注意:如果删除的节点占有槽,删除会报错的。
解决方法:在删除节点前给该节点从新分配槽(分配0个槽),然后再删除该节点;


关于Redis的命令和语法请看Redis介绍
关于Java如何连接Redis,并对Redis进行操作在后续跟进

<think>好的,我现在需要回答用户关于两个Go语言Redis客户端库的区别的问题。用户提到的两个库是"github.com/gomodule/redigo/redis""github.com/redis/go-redis/v9"。首先,我需要回忆这两个库的基本信息,然后比较它们的特性、设计哲学、使用方式以及维护情况等。 首先,Redigo,也就是gomodule/redigo,是一个比较老的库,我记得它采用了比较简洁的API设计,可能更接近原生的Redis命令。而go-redis/v9属于新版本,可能支持更多新特性,比如Context或者更现代的Go语言特性。不过需要确认具体的差异。 接下来,我需要分几个方面来比较这两个库: 1. **维护状态与社区活跃度**:查看两个库的GitHub仓库,看看最近的提交时间issue处理情况。Redigo可能维护较少,而go-redis可能更活跃。 2. **API设计风格**:Redigo可能使用更过程化的风格,比如通过Do方法发送命令,而go-redis可能采用更结构化的方式,比如链式调用或者方法对应具体的Redis命令。 3. **功能支持**:比如连接池管理、Cluster、Sentinel支持、Context支持、Pipeline、事务等。新版本的go-redis可能在这些方面更全面。 4. **依赖管理**:是否支持Go Modules,版本兼容性如何。Redigo可能较早就支持gomodule,而go-redis的v9版本可能要求更高版本的Go。 5. **性能**:可能两者性能差异不大,但实现方式不同,比如连接池的实现或者资源管理。 6. **文档示例**:哪个库的文档更完善,示例更多,方便使用。 然后,我需要回忆或者查找相关资料来验证这些点。比如,Redigo的Do方法需要用户自己转换类型,而go-redis可能有更类型安全的方法,直接对应命令。比如在go-redis中,可能有Get、Set这样的方法,而Redigo中则是通过Do("SET", key, value)这样的方式。 另外,关于Context的支持,go-redis/v9可能更早地整合了context.Context参数,以支持超时取消,而Redigo可能在某些接口中支持,但需要额外处理。 在连接池方面,Redigo内置了连接池,而go-redis同样提供了连接池管理,但配置方式可能不同。 关于集群哨兵模式的支持,go-redis可能更全面,直接提供客户端类型,比如ClusterClient,而Redigo可能需要用户自己处理节点间的命令路由。 错误处理方面,Redigo返回的是interface{},需要类型断言,而go-redis可能返回更具体的错误类型,或者有更好的错误封装。 最后,需要总结两者的适用场景。如果用户需要轻量级、简单的库,可能选择Redigo;如果需要更多现代特性、更好的类型安全性更活跃的维护,可能选择go-redis/v9。 现在,需要将这些点整理成结构化的回答,分点说明区别,并给出建议。同时,需要确保用词准确,避免错误。例如,确认go-redis是否确实支持Context,以及两者的API设计差异的具体例子。</think>以下是两个Go语言Redis客户端库的主要区别及对比分析: --- ### 1. **维护状态与社区活跃度** - **github.com/gomodule/redigo/redis** - **维护状态**:长期存在,但近年更新较少(最后一次主要更新在2022年)。 - **社区**:成熟稳定,适合遗留项目或简单场景。 - **github.com/redis/go-redis/v9** - **维护状态**:官方Redis实验室维护,活跃更新,适配新Redis特性(如Redis 6/7的ACL、Streams)。 - **社区**:推荐新项目使用,持续集成现代Go特性。 --- ### 2. **API设计风格** - **Redigo** - **过程式风格**:通过`conn.Do(command, args...)`发送命令,需手动解析结果。 - 示例: ```go conn.Do("SET", "key", "value") result, _ := redis.String(conn.Do("GET", "key")) ``` - **go-redis/v9** - **结构化方法**:每个Redis命令对应一个类型安全的方法。 - 示例: ```go client.Set(ctx, "key", "value", 0).Err() result := client.Get(ctx, "key").Val() ``` --- ### 3. **关键功能对比** | **特性** | **Redigo** | **go-redis/v9** | |-------------------|--------------------------------------|--------------------------------------| | **Context支持** | 需手动实现 | 原生支持(所有方法含`context.Context`参数) | | **连接池** | 内置简单连接池 | 可配置化连接池,支持更细粒度控制 | | **集群/哨兵** | 需第三方库或自定义逻辑 | 内置`ClusterClient``SentinelClient` | | **Pipeline** | 支持,但需手动组装命令 | 链式调用,支持`TxPipeline``Pipeline` | | **类型转换** | 需`redis.Values`等工具函数解析结果 | 直接通过`.Val()`或`.Result()`获取类型结果 | | **Hooks/监控** | 有限支持 | 支持中间件(如Metrics、Tracing) | --- ### 4. **依赖与兼容性** - **Redigo** - 兼容较早Go版本(最低Go 1.13),无强制依赖。 - **go-redis/v9** - 需要Go 1.17+,充分利用泛型等新特性,依赖更现代的生态。 --- ### 5. **性能** - 两者性能接近,但**go-redis/v9**在连接复用批量操作(如Pipeline)上优化更佳。 --- ### **选型建议** - **选择Redigo**: - 项目需兼容旧Go版本。 - 仅需基础Redis操作,偏好轻量级实现。 - **选择go-redis/v9**: - 新项目或需Redis集群、ACL等高级功能。 - 需要Context支持或与现代Go生态(如OpenTelemetry)集成。 --- ### 示例代码对比 #### Redigo(连接与命令) ```go import "github.com/gomodule/redigo/redis" conn, _ := redis.Dial("tcp", "localhost:6379") defer conn.Close() // 设置键值 conn.Do("SET", "name", "Alice") // 获取值(需类型断言) value, _ := redis.String(conn.Do("GET", "name")) ``` #### go-redis/v9(结构化API) ```go import "github.com/redis/go-redis/v9" client := redis.NewClient(&redis.Options{Addr: "localhost:6379"}) ctx := context.Background() // 设置键值(直接调用Set方法) client.Set(ctx, "name", "Alice", 0) // 获取值(自动解析) value := client.Get(ctx, "name").Val() ``` --- ### 总结 若追求稳定且场景简单,**Redigo**足够使用;若需长期维护、现代特性及扩展性,**go-redis/v9**是更优选择。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值