使用分片连接池管理redis的分布式集群,代码是不能在代码中new出来的
目的
连接池以单例的形式存在框架的容器里,在哪里用就在那里注入,用完后将连接资源返回
将连接池创建出来,交由框架维护
连接池根据提供的配置,初始化创建
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.7.RELEASE</version> </dependency>
利用读取的属性nodes,封装
`List<JedisShardInfo> info
info.add(new JedisShardInfo(hostIp,port));
准备构造的连接池对象需要配置对象
GenericObjectPoolConfig config
config.setMaxIdle(maxIdle);
构造连接池对象
ShardedJedisPool pool
new ShardedJedisPool(config,info)
package cn.wiscom.user.config; ? /** * 实现读取redis的连接池各种属性 * 利用属性创建连接池对象 * 交给框架维护 * @author wiscom * */ @Configuration @ConfigurationProperties(prefix="easymall.redis") //@ConditionalOnClass({Jedis.class,ShardedJedisPool.class}) public class ShardeJedisPoolConfig { private List<String> nodes;//{"10.9.39.13:6379","",""} private Integer maxTotal; private Integer maxIdle; private Integer minIdle; /*利用读取的属性nodes 封装List<JedisShardInfo> *利用其它属性 封装连接池的配置对象 *需要初始化方法 */ @Bean public ShardedJedisPool initShardedJedisPool(){ //收集节点信息 nodes{"10.9.39.13:6379","",""} List<JedisShardInfo> info= new ArrayList<JedisShardInfo>(); //for循环nodes 增强For循环 for (String node : nodes) { //node="10.9.39.13|6379" String hostIp=node.split(":")[0]; int port=Integer.parseInt(node.split(":")[1]); info.add(new JedisShardInfo(hostIp,port)); } //准备构造的连接池对象需要配置对象config GenericObjectPoolConfig config= new GenericObjectPoolConfig(); config.setMaxIdle(maxIdle); config.setMaxTotal(maxTotal); config.setMinIdle(minIdle); //构造连接池对象 ShardedJedisPool pool= new ShardedJedisPool(config,info); return pool; }
@Autowired
private ShardedJedisPool pool
ShardedJedis jedis=pool.getResource();
从连接池获取资源操作redis集群
package cn.wiscom.user.service; ? @Service public class UserService { /*private static final String userSaveSuffix="user_save"; private static final String productUpdate="product_update"; */ @Autowired private ShardedJedisPool pool; @Autowired /*private RedisUtils redisUtils; */ public String login(User user) { //Jedis jedis=new Jedis("10.9.39.13",6379); //从连接池获取资源操作redis集群 ShardedJedis jedis=pool.getResource(); try{ user.setUserPassword( MD5Util.md5(user.getUserPassword())); User existUser=userMapper.queryExist(user);//password userName if(existUser==null){ //登录校验失败 return ""; }else{//登录成功 //value数据 userJson的字符串 String userJson= MapperUtil.MP.writeValueAsString(existUser); //key String ticket="EM_TICKET"+ System.currentTimeMillis()+ existUser.getUserId(); jedis.setex(ticket, 60*3, userJson); //set ticket userJson EX 180 //成功后将ticket反悔 return ticket; } }catch(Exception e){ //出现任何异常,登录以失败处理 return ""; }finally{ //将jedis关闭 pool.returnResource(jedis); } } public String queryUserJson(String ticket) { Jedis jedis=new Jedis("10.9.39.13",6379); try{ return jedis.get(ticket); }catch(Exception e){ e.printStackTrace(); return null; }finally{ jedis.close(); } } }
不具备分片的高可用
redis中支持一主多从
[root@10-9-39-13 redis-3.2.11]# cp redis.conf 6382redis.conf
[root@10-9-39-13 redis-3.2.11]# cp redis.conf 6383redis.conf
[root@10-9-39-13 redis-3.2.11]# cp redis.conf 6384redis.conf
[root@10-9-104-184 redis-3.2.11]# redis-server 6382redis.conf
[root@10-9-104-184 redis-3.2.11]# redis-server 6383redis.conf
[root@10-9-104-184 redis-3.2.11]# redis-server 6384redis.conf
登录不同节点:
redis-cli -p 端口号
127.0.0.1:6382>info replication
展示主从的信息
默认创建的节点都是主节点
role:master
connected_slaves:0
127.0.0.1:6384> slaveof 10.9.104.184 6382
登陆到从节点,设置成为主节点的从节点
6384
设置成了6382
的从节点从节点配置文件
第251行
slaveof <masterip> <masterport>
原文:https://www.cnblogs.com/minnersun/p/14541717.html