Java客户端分片

发表时间:2018-03-15 15:23:48 浏览量( 26 ) 留言数( 0 )

学习目标:

1、了解Spring Boot整合Redis的连接

2、使用JRedis的客户端分片


学习过程:

    如果需要缓存的内容很多,单台服务器的内存不够,那么我们可以使用两台Redis服务器,使用客户端的分片技术,可以自动根据Key分布到Redis服务器中。

1、先准备两台Redis服务,分别安装Redis,安装方式和前面的课程一样就可以了,然后分别启动就可以了。这里我也准备了两台

192.168.8.234

192.168.8.235


2、本节课我们使用Spring Boot整合Redis,导入相关的包

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-redis</artifactId>
		</dependency>

		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.4</version>
		</dependency>


3、配置连接

(1)在application.properties中配置连接信息

myredis.shard.name=redisshard

myredis.shard.servers=192.168.8.234:6379,192.168.8.235:6379

myredis.shard.timeout=5000

myredis.shard.maxTotal=32

(2)实现分片连接配置

@Configuration
@ConfigurationProperties(prefix = "myredis.shard")    
public class RedisShardConfig {
	
	
	private String servers;
	
	private int timeout;
	private int maxTotal;
	private String name;
	
	@Bean
	
	public ShardedJedisPool shardedJedisPool() {
		
		List<JedisShardInfo> jedisShardInfos=new ArrayList<JedisShardInfo>();
		JedisPoolConfig config=new JedisPoolConfig();
		
		config.setMaxTotal(maxTotal);
		
		String[] serversLo=servers.split(",");
		for(String server:serversLo) {
			String[] hostport=server.split(":");
			JedisShardInfo info=new JedisShardInfo(hostport[0],Integer.parseInt(hostport[1]),timeout);
			jedisShardInfos.add(info);
		}
		
		
		return new ShardedJedisPool(config,jedisShardInfos);
	}

	public String getServers() {
		return servers;
	}

	public void setServers(String servers) {
		this.servers = servers;
	}

	public int getTimeout() {
		return timeout;
	}

	public void setTimeout(int timeout) {
		this.timeout = timeout;
	}

	public int getMaxTotal() {
		return maxTotal;
	}

	public void setMaxTotal(int maxTotal) {
		this.maxTotal = maxTotal;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

(3)实现工具类

@Component
public class RedisUtil {

	@Autowired
	private ShardedJedisPool pool;

	public void set(String key, String value) {
		ShardedJedis shardedJedis = null;

		try {
			shardedJedis = pool.getResource();
			if (shardedJedis != null) {
				shardedJedis.set(key, value);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (shardedJedis != null) {
				shardedJedis.close();
			}
		}

	}

	public String get(String key) {
		ShardedJedis shardedJedis = null;

		try {
			shardedJedis = pool.getResource();
			if (shardedJedis != null) {
				return shardedJedis.get(key);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (shardedJedis != null) {
				shardedJedis.close();
			}
		}
		return null;
	}

}

4、测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringfirstApplicationTests {
	
	@Autowired
	private RedisUtil redisUtil;

	@Test
	public void testRedis() {
		
		System.out.println(redisUtil);
		
		redisUtil.set("java", "haha");
		
		redisUtil.set("abc", "akey");
		
	}

}

查看结果

attcontent/5acac0f7-e5aa-4dfe-b488-b4aaa9cd0f62.png

分别在不同Redis服务器。


   这种客户端的分片非常简单,可以充分利用服务器的资源。但是高可用性时没有保证的。如果某一台服务器挂了,那么这台服务器上面的所有缓存都会没有了。如果你的缓存信息非常重要,在redis 3.0后可以使用sentinel或者cluster等方式。