整合jedis到springboot
目的
使用分片连接池管理redis的分布式集群,代码是不能在代码中new出来的
目的
连接池以单例的形式存在框架的容器里,在哪里用就在那里注入,用完后将连接资源返回
步骤
将连接池创建出来,交由框架维护
连接池根据提供的配置,初始化创建
easymall-user-service
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.7.RELEASE</version> </dependency>
src/main/java
cn.wiscom.user.config
ShardeJedisPoolConfig.java
利用读取的属性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; }
cn.wiscom.user.service
UserService.java
@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集群的高可用
单节点分布式集群结构的问题
不具备分片的高可用
redis的主从搭建
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>

浙公网安备 33010602011771号