文档章节

崛起于Springboot2.0.X之切换redis数据库(45)

木九天
 木九天
发布于 07/30 15:16
字数 1087
阅读 133
收藏 1

    (本篇博客已于2019-08-28 优化更新)

    题记:找一个像太阳一样的人,为你晒掉所有悲伤!

    正题:两种方式:jedis切换数据源和redis自带切换数据源(redis数据库:0-15,默认是0库)

1、application.properties

#redis
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.timeout=10000ms

spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=-1ms
spring.redis.jedis.pool.min-idle=0
spring.redis.jedis.pool.max-idle=8

2、pom文件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>com.google.collections</groupId>
    <artifactId>google-collections</artifactId>
    <version>1.0</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

3、配置类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @Author:MuJiuTian
 * @Description:redis的配置,这里默认设置使用redis:0 数据库
 * @Date: Created in 下午11:27 2019/7/4
 */
@Configuration
@EnableCaching
public class RedisCacheConfiguration extends CachingConfigurerSupport {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.timeout}")
    private String timeout;

    @Value("${spring.redis.jedis.pool.max-idle}")
    private int maxIdle;

    @Value("${spring.redis.jedis.pool.max-wait}")
    private String maxWaitMillis;

    @Value("${spring.redis.password}")
    private String password;

    @Bean
    public JedisPool redisPoolFactory() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMaxWaitMillis(Long.valueOf(maxWaitMillis.substring(0,maxWaitMillis.length()-2)));
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port,Integer.valueOf(timeout.substring(0,timeout.length()-2)));
        return jedisPool;
    }
}

4、redis工具类

import java.util.List;
import java.util.Map;

public interface RedisService {
    
    String setex(String key, int seconds,String value,int index);

    String set(String key, String value,int index);

    String get(String key,int index);
}

5、redis具体实现类

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

@Component
public class CacheSingleService implements RedisService{

    @Autowired
    private JedisPool jedisPool;

    public void returnResource(Jedis jedis) {
        jedis.close();
    }

    public Jedis getResource(int index) {
        Jedis jedis = jedisPool.getResource();
        jedis.select(index);
        return jedis;
    }

    public String setex(String key, int seconds, String value,int index) {
        Jedis jedis = null;
        try {
            jedis = getResource(index);
            return jedis.setex(key, seconds, value);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            returnResource(jedis);
        }
        return null;
    }

    public String set(String key, String value,int index){
        Jedis jedis = null;
        try {
            jedis = getResource(index);
            return jedis.set(key, value);
        } finally {
            returnResource(jedis);
        }
    }
    public String get(String key,int index) {
        String value = null;
        Jedis jedis = null;
        try {
            jedis = getResource(index);
            value = jedis.get(key);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            returnResource(jedis);
        }
        return value;
    }
}

6、枚举类

/**
 * @Author:MuJiuTian
 * @Description:通过枚举类选择redis使用的数据库,一般公司的redis会分不同的数据到不同的库,比如用户信息到0库
 * 商品数据放在第二个库,运动数据放在第三库等等跟随项目分配而分配
 * @Date: Created in 下午10:13 2019/7/29
 */
public enum RedisPartition {
    //以下分别代表redis 0-15库
    INFO(0),
    One(1),
    Two(2),
    THREE(3),
    FOUR(4),
    FIVE(5),
    SIX(6),
    SEVEN(7),
    EIGHT(8),
    NINE(9),
    TEN(10),
    ELEVEN(11),
    TWELVE(12),
    THIRTEEN(13),
    FOURTEEN(14),
    FIFTEEN(15);

    private int ordinal;
    //构造方法
    RedisPartition(int ordinal) {
        this.ordinal = ordinal;
    }

    public void setOrdinal(int dbNum) {
        this.ordinal = dbNum;
    }

    public int getOrdinal() {
        return ordinal;
    }

    @Override
    public String toString() {
        return ""+ordinal;
    }
}

7、Controller层

import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
@Slf4j
public class TestController {
    @Autowired
    CacheSingleService singleService;

    @GetMapping("/test3")
    public String test3() {
        String key = "osc";
        String str = "i love osc";
        //存放在5数据库,默认是0
        singleService.set(key,"iloveyou",RedisPartition.SIX.getOrdinal());
        //存放在4数据库,默认是0
        singleService.set(str+"ii","iloveyou",RedisPartition.FIVE.getOrdinal());
        return "SUCCESS";
    }

    @GetMapping(value = "/test4")
    public String test4(){

        String key = "osc";
        String str = "i love osc";

        //查询5数据库内容
        String str1 = singleService.get(key,RedisPartition.SIX.getOrdinal());

        //查询4数据库内容
        String str2 = singleService.get(str,RedisPartition.FIVE.getOrdinal());

        return str1+str2;
    }

    public static void main(String[] args) {
        System.out.println(RedisPartition.FIFTEEN.getOrdinal());
    }
}

8、测试结果

    使用Redis自带方法同时使用16个数据库,继续使用上面的pom文件依赖

9、Redis工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class RedisUtil {

    @Autowired
    private StringRedisTemplate redisTemplate;

    public void setRedisTemplate(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void setDataBase(int num) {
        LettuceConnectionFactory connectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
        if (connectionFactory != null && num != connectionFactory.getDatabase()) {
            connectionFactory.setDatabase(num);
            this.redisTemplate.setConnectionFactory(connectionFactory);
            connectionFactory.resetConnection();
        }
    }

    public StringRedisTemplate getRedisTemplate() {
        return this.redisTemplate;
    }

    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    //获取指定key的值
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

10、Controller测试

@Autowired
RedisUtil redisUtil;

@GetMapping("/test")
public String test(String key) {
    for (int i = 1; i < 3; i++) {
        redisUtil.setDataBase(i);
        redisUtil.set(key, "" + i + key);
    }
    //开发环境用下面的代码,上面纯简单测试去不同的redis数据库而已
    //redisUtil.setDataBase(RedisPartition.EIGHT.getOrdinal());
    
    return redisUtil.get(key);
}

 

11、总结

      两种方式jedis和StringRedisTemplate切换数据库,我更喜欢用jedis,使用SringRedisTemplate我就没有过多的把所有redis方法复制出来。

12、附加

    下面的是ssm框架切换同时使用redis数据库的配置,至于redis.xml和redis.properties从网上copy一下吧

@Resource(name="stringRedisTemplate")
   private StringRedisTemplate stringRedisTemplate;

private StringRedisTemplate choseConnection(RedisConnectionEnum redisEnum){
   JedisConnectionFactory factory = (JedisConnectionFactory) stringRedisTemplate.getConnectionFactory();
   factory.setDatabase(redisEnum.getDbNum());
   stringRedisTemplate.setConnectionFactory(factory);
   return stringRedisTemplate;
   }

    希望能够对各位有所帮助,如有bug,请评论或者私信,谢啦。

© 著作权归作者所有

木九天

木九天

粉丝 171
博文 223
码字总数 168675
作品 0
海淀
程序员
私信 提问
崛起于Springboot2.0.X之配置文件详解(10)

序言:针对公司开发配置文件的一些基础常识 1、核心配置文件 springboot框架也被我认为一个工具,它的主要核心文件为application.properties,又可以命名为application.yml亦或者application...

木九天
2018/07/14
473
0
崛起于Springboot2.0.X之集成单机Redis(14)

简介:单机redis+springboot,并不是jedis单机操作redis,jedis是需要另外的集成,下一篇博客会讲到。 1、添加pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId......

木九天
2018/07/15
373
0
崛起于Springboot2.0.X之整合redis排行榜实战(39)

(本篇博客已于2019-08-28 优化更新) 简介:投票活动,用户只能一天投票一次,然后对参与投票的项目进行实时的排行功能。 架构:redis+mysql+springboot2.0.3+mybatis 1、数据库建表 CREATE...

木九天
2018/11/21
289
0
崛起于Springboot2.0.X之手动配置Quartz定时任务(47)

(记得来开源中国关注我哟!如果博客被我发现有不好的地方,都会优化更新的,所以关注我呦,嘻嘻) 技术栈:Springboot2.0.X(2.1.X也可以)+ Quartz +FastMybatis (自认为比mybatis-plus更方...

木九天
08/27
231
2
崛起于Springboot2.0.X之Jedis+Redis单机(15)

1、pom添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> <dependency><groupId>redis.clients</gr......

木九天
2018/07/15
3.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
6
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
7
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
5
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
6
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部