首页 > 编程语言 > 详细

整合jedis到springboot

时间:2021-03-16 10:59:17      阅读:21      评论:0      收藏:0      [点我收藏+]

 

目的

使用分片连接池管理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>

整合jedis到springboot

原文:https://www.cnblogs.com/minnersun/p/14541717.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!