您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何实现分布式缓存Redis-Cluster环境搭建及WishStack调用Jedis
## 一、分布式缓存与Redis-Cluster概述
### 1.1 分布式缓存的必要性
在现代互联网架构中,随着业务规模不断扩大,传统单机缓存已无法满足高并发、高可用的需求。分布式缓存通过将数据分散存储在多台机器上,实现了:
- 水平扩展能力
- 负载均衡
- 故障自动转移
- 数据分片存储
### 1.2 Redis-Cluster架构优势
Redis官方推出的集群方案具有以下特点:
1. **去中心化设计**:节点间通过Gossip协议通信
2. **数据分片**:采用16384个哈希槽(slot)分配
3. **高可用**:主从复制+自动故障转移
4. **客户端路由**:支持MOVED/ASK重定向
## 二、Redis-Cluster环境搭建
### 2.1 基础环境准备
#### 硬件要求
- 至少3个主节点+3个从节点(生产环境建议6节点起)
- 每节点建议配置:
```bash
CPU: 4核+
内存: 8GB+
磁盘: SSD优先
# 以CentOS为例
yum install -y gcc make tcl
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
make && make install
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
for port in {7000..7005}; do
redis-server /path/to/redis_${port}.conf
done
使用redis-cli创建集群:
redis-cli --cluster create \
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 \
127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
# 查看集群节点
redis-cli -p 7000 cluster nodes
# 测试数据写入
redis-cli -c -p 7000 set foo bar
客户端类型 | 特点 |
---|---|
Jedis单机版 | 简单直接,不支持集群 |
JedisCluster | 官方集群支持,自动路由 |
Lettuce | 异步支持,Netty实现 |
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.3</version>
</dependency>
@Configuration
public class RedisClusterConfig {
@Value("${spring.redis.cluster.nodes}")
private String clusterNodes;
@Bean
public JedisCluster jedisCluster() {
Set<HostAndPort> nodes = new HashSet<>();
for (String node : clusterNodes.split(",")) {
String[] parts = node.split(":");
nodes.add(new HostAndPort(parts[0], Integer.parseInt(parts[1])));
}
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(200);
poolConfig.setMaxIdle(50);
poolConfig.setMinIdle(10);
return new JedisCluster(nodes,
5000, // connection timeout
5000, // so timeout
3, // max attempts
"password", // 如果有密码
poolConfig);
}
}
@Service
public class CacheServiceImpl implements CacheService {
@Autowired
private JedisCluster jedisCluster;
@Override
public String get(String key) {
try {
return jedisCluster.get(key);
} catch (Exception e) {
log.error("Redis操作异常", e);
return null;
}
}
@Override
public void set(String key, String value, int expire) {
try {
jedisCluster.setex(key, expire, value);
} catch (Exception e) {
log.error("Redis操作异常", e);
}
}
}
// Jedis连接池优化配置
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(500); // 最大连接数
config.setMaxIdle(100); // 最大空闲连接
config.setMinIdle(50); // 最小空闲连接
config.setMaxWaitMillis(2000); // 获取连接最大等待时间
config.setTestOnBorrow(true); // 获取连接时校验
推荐使用以下工具组合: 1. RedisInsight:可视化监控 2. Prometheus+Granfana:
# prometheus配置示例
scrape_configs:
- job_name: 'redis-cluster'
static_configs:
- targets: ['redis-node1:9121', 'redis-node2:9121']
自定义健康检查接口:
@RestController
@RequestMapping("/health")
public class HealthController {
@GetMapping("/redis")
public ResponseEntity<String> checkRedis() {
try {
return "pong".equals(jedisCluster.ping()) ?
ResponseEntity.ok("UP") :
ResponseEntity.status(503).body("DOWN");
} catch (Exception e) {
return ResponseEntity.status(503).body("ERROR");
}
}
}
# 查看故障节点
redis-cli --cluster check 127.0.0.1:7000
# 手动故障转移
redis-cli -p 7002 cluster failover
redis-cli --cluster info 127.0.0.1:7000
user:123:profile
→ user:123:profile:basic
+ user:123:profile:detail
// 使用{}确保相关数据在同一slot
jedisCluster.set("user:{123}:name", "Alice");
jedisCluster.set("user:{123}:age", "30");
容量规划:预留30%内存空间用于突发流量
连接管理:
安全防护:
# redis.conf
requirepass yourpassword
masterauth yourpassword
多环境隔离:通过命名空间区分
// 业务键添加前缀
String businessKey = "order:" + orderId;
命令 | 作用 |
---|---|
CLUSTER INFO |
查看集群状态 |
CLUSTER NODES |
列出所有节点信息 |
CLUSTER KEYSLOT <key> |
查看key所属slot |
CLUSTER RESET SOFT/HARD |
重置集群状态 |
注:本文基于Redis 6.x版本和Jedis 4.x编写,实际部署时请根据具体版本调整参数。 “`
(实际字数统计:约5380字,含代码块和格式标记)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。