redis分片

单台redis的缺点:

单台redis可能出现宕机现象

单台redis的内存受限

redis分片:

优点:

可以实现动态扩容 ; 

如果单台redis出现问题则数据影响较小--其他redis中数据不丢失

缺点:

如果一台redis宕机则其他redis节点不能使用

分片的搭建:

1、将原有redis关闭

redis-cli -p 6379 shutdown

2、复制多个redis配置文件

说明:在redis根目录下创建 shard文件夹

将redis.conf文件复制到shard文件夹下

3、修改redis端口

分别修改6380-6381的端口号

4、启动多台redis

程序中分片的使用:

哈希一致性算法:

redis采用哈希一致性算法

特点:

1、分散性

为什么数据会落入不同的节点??   

哈希一直算法中会根据key值算出唯一的一个物理地址,将数据保存在该地址中.

       将redis的节点信息根据IP+算法算出唯一的一个物理地址.

       Key值以顺时针方向寻找最近的redis节点进行挂载.

当获取数据时.首先根据key值计算出属于哪台redis节点,之后从该节点中get(key).

 

 

 

 

2、均衡性

当根据哈希运算的结果出现负载不均的现象时,会为当前负载较少的节点创建虚拟节点.作用是为了分担数据的压力.保证节点所管理的信息数量尽可能维持在1/N的水平.

3、单调性

单调性可以实现动态的数据扩容/动态数据挂载---redis节点增加或减少时

当redis中的节点出现宕机时,那么该节点中的数据全部从内存清空--重新挂载,那么剩余的节点会动态的进行哈希运算,剩余节点中的key值动态的实现数据挂载.

4、负载

spring整合分片:

spring/Redis_applicationContext-shard.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xsi:schemaLocation="
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">
   
   <!--每次都创建jedis对象性能较低 创建jedis连接池  -->
   <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
      <!--定义连接总数  -->
      <property name="maxTotal" value="${redis.maxTotal}"/>
      <!--定义最大闲置资源  -->
      <property name="maxIdle" value="${redis.maxIdle}"/>
      <!--定义是否自动连接  -->
      <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
   </bean>
   
   <!--定义6379主机   public JedisShardInfo(String host, int port) -->
   <bean id="jedisShard1" class="redis.clients.jedis.JedisShardInfo">
      <constructor-arg index="0" value="${redis.host1}" type="java.lang.String"/>
      <constructor-arg index="1" value="${redis.port1}" type="int"/>
   </bean>
   
   <!--定义6380主机  -->
   <bean id="jedisShard2" class="redis.clients.jedis.JedisShardInfo">
      <constructor-arg index="0" value="${redis.host2}" type="java.lang.String"/>
      <constructor-arg index="1" value="${redis.port2}" type="int"/>
   </bean>
   
   <!--定义6381主机  -->
   <bean id="jedisShard3" class="redis.clients.jedis.JedisShardInfo">
      <constructor-arg index="0" value="${redis.host3}" type="java.lang.String"/>
      <constructor-arg index="1" value="${redis.port3}" type="int"/>
   </bean>
   
   <!--定义分片连接池   final GenericObjectPoolConfig poolConfig, List<JedisShardInfo> shards-->
   <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
      <constructor-arg index="0" ref="poolConfig"/>
      <constructor-arg index="1">
         <list>
            <ref bean="jedisShard1"/>
            <ref bean="jedisShard2"/>
            <ref bean="jedisShard3"/>
         </list>
      </constructor-arg>
   </bean>
   
</beans>

property/redis.properties

#最小空闲数
redis.minIdle=100
#最大空闲数
redis.maxIdle=300
#最大连接数
redis.maxTotal=1000
#客户端超时时间单位是毫秒 
redis.timeout=5000
#最大建立连接等待时间  
redis.maxWait=1000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true

redis.host1=192.168.126.151
redis.port1=6379
redis.host2=192.168.126.151
redis.port2=6380
redis.host3=192.168.126.151
redis.port3=6381

工具类

//实现分片的redis操作
@Autowired
private ShardedJedisPool shardedJedisPool;

public void set(String key,String value){
   ShardedJedis jedis = shardedJedisPool.getResource();

   jedis.set(key, value);
   shardedJedisPool.returnResource(jedis);
}

public String get(String key){
   ShardedJedis jedis = shardedJedisPool.getResource();
   String json = jedis.get(key);
   shardedJedisPool.returnResource(jedis);
   System.out.println("分片的操作完成!!!!");
   return json;
}
### Redis 分片概述 Redis 分片(Sharding)是一种将数据分布在Redis 实例上的技术,旨在通过水平扩展提高性能和容量。由于单个 Redis 实例受内存大小和服务能力的限制,分片可以有效解决这些问题。 #### 为什么需要 Redis 分片? 随着业务增长,单一 Redis 实例可能无法满足高并发访问需求或大量数据存储的需求。为了提升系统的可伸缩性和可用性,采用分片策略能够有效地分散读写压力并增加总的存储空间[^1]。 #### Redis 分片的工作原理 在 Redis 中并没有内置完整的自动化分片功能,而是依赖外部组件或者特定的应用逻辑来进行: - **客户端分片**:应用程序负责计算键应该被放置在哪一个实例中; - **代理分片**:利用中间件如 Twemproxy 或 Codis 来管理连接池并将请求转发给相应的后端服务器; - **集群模式 (Cluster Mode)** :这是由官方支持的一种方案,在这种架构下每个节点不仅保存部分数据还维护着整个拓扑结构的信息表以便于路由查询操作; 对于一致性哈希算法,则是用来决定哪些 key 应该分配至哪个 shard 上面的方法之一,它能较好地处理新增/删除节点时的数据迁移问题[^4]。 #### 配置方法 要设置一个节点组成的 Redis 分布式环境,一般步骤如下所示: 1. 准备份不同端口号及持久化文件名称的配置文件 `*.conf` ,例如分别为三个服务定义了监听地址为 localhost 的情况下分别设定了6379, 6380 和 6381 端口。 ```bash redis-server 6379.conf & redis-sentinel --sentinel sentinel.conf & ``` 2. 修改这些 `.conf` 文件内的参数以适应实际应用场景的要求,比如开启 cluster-enabled 参数允许参与集群构建,并调整其他必要的选项像 maxmemory、appendonly 等等[^5]。 3. 利用命令行工具 `redis-cli --cluster create ...` 创建一个新的集群,按照提示输入各个成员 IP 地址及其对应的端口号完成初始化过程。 ```shell 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 \ --replicas 1 ``` 上述脚本会建立六个节点构成的小型测试用途 Redis Cluster 并指派一半作为副本用于冗余备份目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值