亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot結(jié)合Redis配置工具類實現(xiàn)動態(tài)切換庫

 更新時間:2022年08月10日 10:03:15   作者:Coder-CT  
本文主要介紹了SpringBoot結(jié)合Redis配置工具類實現(xiàn)動態(tài)切換庫,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

我使用的版本是SpringBoot 2.6.4

可以實現(xiàn)注入不同的庫連接或是動態(tài)切換庫

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        
    </parent>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
spring:    
  redis:
    # open自定義的,使用aop切面控制
    open: false  # 是否開啟redis緩存  true開啟   false關(guān)閉
    database: 0
    host: 127.0.0.1
    password: 123456
    # history 自定義,切換庫索引
    history: 1 #歷史數(shù)據(jù)使用的庫
    port: 6379
    timeout: 6000ms  # 連接超時時長(毫秒)
    jedis:
      pool:
        max-active: 1000  # 連接池最大連接數(shù)(使用負值表示沒有限制)
        max-wait: -1ms      # 連接池最大阻塞等待時間(使用負值表示沒有限制)
        max-idle: 10      # 連接池中的最大空閑連接
        min-idle: 5       # 連接池中的最小空閑連接

配置類 , 默認0號庫使用@Autowired注入,自定義庫使用@Resource(name = “history”)注入
動態(tài)切庫有個問題就是一旦切庫 后面的數(shù)據(jù)就會一直保存在切換的庫里面,比如實時數(shù)據(jù)需要保存在1號庫,歷史數(shù)據(jù)需要保存在2號庫,切庫后 實時的就會存歷史里面、下面這種配置,想用哪個庫就注入哪個庫,不存在切庫問題

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
?* Redis配置
?*/
@Configuration
public class RedisConfig {
? ? @Autowired
? ? private RedisConnectionFactory factory;
? ? @Value("${spring.redis.host}")
? ? private String host;
? ? @Value("${spring.redis.port}")
? ? private Integer port;
? ? @Value("${spring.redis.password}")
? ? private String password;
? ? @Value("${spring.redis.history}")
? ? private Integer history;

? ? /**
? ? ?* 實時數(shù)據(jù)庫 配置 默認0號庫
? ? ?*/
? ? @Bean
? ? public RedisTemplate<String, Object> redisTemplate() {
? ? ? ? RedisTemplate<String, Object> template = new RedisTemplate<>();
? ? ? ? // 解決value不能轉(zhuǎn)成string chens 2022-06-08
? ? ? ? Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
? ? ? ? template.setKeySerializer(new StringRedisSerializer());
? ? ? ? template.setHashKeySerializer(new StringRedisSerializer());
? ? ? ? template.setHashValueSerializer(new StringRedisSerializer());
? ? ? ? template.setValueSerializer(serializer);
? ? ? ? template.setConnectionFactory(factory);
? ? ? ? return template;
? ? }

? ? /**
? ? ?* redis歷史數(shù)據(jù)庫 配置 ?根據(jù)yml配置庫
? ? ?*/
? ? @Bean("history")
? ? public RedisTemplate<String, Object> redisTemplatetwo() {
? ? ? ? RedisTemplate<String, Object> template = new RedisTemplate<>();
? ? ? ? // 解決value不能轉(zhuǎn)成string?
? ? ? ? Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
? ? ? ? template.setKeySerializer(new StringRedisSerializer());
? ? ? ? template.setHashKeySerializer(new StringRedisSerializer());
? ? ? ? template.setHashValueSerializer(new StringRedisSerializer());
? ? ? ? template.setValueSerializer(serializer);
? ? ? ? RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
? ? ? ? // 建立連接,設(shè)置庫索引
? ? ? ? redisStandaloneConfiguration.setDatabase(history);
? ? ? ? redisStandaloneConfiguration.setHostName(host);
? ? ? ? redisStandaloneConfiguration.setPort(port);
? ? ? ? redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
? ? ? ? LettuceConnectionFactory factory = new LettuceConnectionFactory(redisStandaloneConfiguration, LettuceClientConfiguration.builder()
? ? ? ? ? ? ? ? // 超時時間
? ? ? ? ? ? ? ? .commandTimeout(Duration.ofMinutes(30)).build());
? ? ? ? factory.afterPropertiesSet();
? ? ? ? template.setConnectionFactory(factory);
? ? ? ? return template;
? ? }

? ? @Bean
? ? public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
? ? ? ? return redisTemplate.opsForHash();
? ? }

? ? @Bean
? ? public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
? ? ? ? return redisTemplate.opsForValue();
? ? }

? ? @Bean
? ? public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
? ? ? ? return redisTemplate.opsForList();
? ? }

? ? @Bean
? ? public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
? ? ? ? return redisTemplate.opsForSet();
? ? }

? ? @Bean
? ? public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
? ? ? ? return redisTemplate.opsForZSet();
? ? }
}

工具類,setDbIndex()動態(tài)切換庫,方法調(diào)用完成應(yīng)切回默認庫

import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
?* Redis工具類
?*
?* @author chens
?*/
@Component
public class RedisUtils {
? ? @Autowired
? ? private RedisTemplate<String, Object> redisTemplate;
? ? @Resource(name = "history")
? ? private RedisTemplate<String, Object> historyTemplate;
? ? @Autowired
? ? private ValueOperations<String, String> valueOperations;
? ? @Autowired
? ? private HashOperations<String, String, Object> hashOperations;
? ? @Autowired
? ? private ListOperations<String, Object> listOperations;
? ? @Autowired
? ? private SetOperations<String, Object> setOperations;
? ? @Autowired
? ? private ZSetOperations<String, Object> zSetOperations;
? ? // 默認數(shù)據(jù)庫
? ? private static Integer database = 0;
? ? /**
? ? ?* 默認過期時長,單位:秒
? ? ?*/
? ? public final static long DEFAULT_EXPIRE = 60 * 60 * 24;
? ? /**
? ? ?* 不設(shè)置過期時長
? ? ?*/
? ? public final static long NOT_EXPIRE = -1;
? ? private final static Gson gson = new Gson();

? ? public void set(String key, Object value, long expire) {
? ? ? ? valueOperations.set(key, toJson(value));
? ? ? ? if (expire != NOT_EXPIRE) {
? ? ? ? ? ? redisTemplate.expire(key, expire, TimeUnit.SECONDS);
? ? ? ? }
? ? }

? ? public void set(Integer index, String key, Object value, long expire) {
? ? ? ? setDbIndex(index);
? ? ? ? valueOperations.set(key, toJson(value));
? ? ? ? if (expire != NOT_EXPIRE) {
? ? ? ? ? ? redisTemplate.expire(key, expire, TimeUnit.SECONDS);
? ? ? ? }
? ? }

? ? public void set(String key, Object value) {
? ? ? ? set(key, value, DEFAULT_EXPIRE);
? ? }

? ? public void set(Integer index, String key, Object value) {
? ? ? ? setDbIndex(index);
? ? ? ? set(key, value, DEFAULT_EXPIRE);
? ? }

? ? public <T> T get(String key, Class<T> clazz, long expire) {
? ? ? ? String value = valueOperations.get(key);
? ? ? ? if (expire != NOT_EXPIRE) {
? ? ? ? ? ? redisTemplate.expire(key, expire, TimeUnit.SECONDS);
? ? ? ? }
? ? ? ? return value == null ? null : fromJson(value, clazz);
? ? }

? ? public <T> T get(Integer index, String key, Class<T> clazz, long expire) {
? ? ? ? setDbIndex(index);
? ? ? ? String value = valueOperations.get(key);
? ? ? ? if (expire != NOT_EXPIRE) {
? ? ? ? ? ? redisTemplate.expire(key, expire, TimeUnit.SECONDS);
? ? ? ? }
? ? ? ? return value == null ? null : fromJson(value, clazz);
? ? }

? ? // 獲取實時數(shù)據(jù)集合 chens
? ? public <T> List<T> getList(List<String> keys, Class<T> clazz) {
? ? ? ? List<T> list = new LinkedList<>();
? ? ? ? if (keys.size() < 1) return list;
? ? ? ? for (String key : keys) {
? ? ? ? ? ? T t = get(key, clazz, NOT_EXPIRE);
? ? ? ? ? ? if (t != null) {
? ? ? ? ? ? ? ? list.add(t);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? //keys.forEach(i -> list.add(get(i, clazz, NOT_EXPIRE)));
? ? ? ? return list;
? ? }

? ? public <T> T get(String key, Class<T> clazz) {
? ? ? ? return get(key, clazz, NOT_EXPIRE);
? ? }

? ? public <T> T get(Integer index, String key, Class<T> clazz) {
? ? ? ? setDbIndex(index);
? ? ? ? return get(key, clazz, NOT_EXPIRE);
? ? }

? ? public String get(String key, long expire) {
? ? ? ? String value = valueOperations.get(key);
? ? ? ? if (expire != NOT_EXPIRE) {
? ? ? ? ? ? redisTemplate.expire(key, expire, TimeUnit.SECONDS);
? ? ? ? }
? ? ? ? return value;
? ? }

? ? public String get(Integer index, String key, long expire) {
? ? ? ? setDbIndex(index);
? ? ? ? String value = valueOperations.get(key);
? ? ? ? if (expire != NOT_EXPIRE) {
? ? ? ? ? ? redisTemplate.expire(key, expire, TimeUnit.SECONDS);
? ? ? ? }
? ? ? ? return value;
? ? }

? ? public String get(String key) {
? ? ? ? return get(key, NOT_EXPIRE);
? ? }

? ? public String get(Integer index, String key) {
? ? ? ? setDbIndex(index);
? ? ? ? return get(key, NOT_EXPIRE);
? ? }

? ? public void delete(String key) {
? ? ? ? redisTemplate.delete(key);
? ? }

? ? public void delete(Integer index, String key) {
? ? ? ? setDbIndex(index);
? ? ? ? redisTemplate.delete(key);
? ? }

? ? /**
? ? ?* Object轉(zhuǎn)成JSON數(shù)據(jù)
? ? ?*/
? ? private String toJson(Object object) {
? ? ? ? if (object instanceof Integer || object instanceof Long || object instanceof Float ||
? ? ? ? ? ? ? ? object instanceof Double || object instanceof Boolean || object instanceof String) {
? ? ? ? ? ? return String.valueOf(object);
? ? ? ? }
? ? ? ? return gson.toJson(object);
? ? }

? ? /**
? ? ?* JSON數(shù)據(jù),轉(zhuǎn)成Object
? ? ?*/
? ? private <T> T fromJson(String json, Class<T> clazz) {
? ? ? ? //T t = JSONObject.parseObject(json, clazz);

? ? ? ? return gson.fromJson(json, clazz);
? ? }

? ? /**
? ? ?* 設(shè)置數(shù)據(jù)庫索引
? ? ?* chens
? ? ?*
? ? ?* @param dbIndex 數(shù)據(jù)庫索引
? ? ?*/
? ? private void setDbIndex(Integer dbIndex) {
? ? ? ? // 邊界判斷
? ? ? ? if (dbIndex == null || dbIndex > 15 || dbIndex < 0) {
? ? ? ? ? ? dbIndex = database;
? ? ? ? }
? ? ? ? LettuceConnectionFactory redisConnectionFactory = (LettuceConnectionFactory) redisTemplate
? ? ? ? ? ? ? ? .getConnectionFactory();
? ? ? ? if (redisConnectionFactory == null) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? redisConnectionFactory.setDatabase(dbIndex);
? ? ? ? redisTemplate.setConnectionFactory(redisConnectionFactory);
? ? ? ? // 屬性設(shè)置后
? ? ? ? redisConnectionFactory.afterPropertiesSet();
? ? ? ? // 重置連接
? ? ? ? redisConnectionFactory.resetConnection();
? ? }

}

到此這篇關(guān)于SpringBoot結(jié)合Redis配置工具類實現(xiàn)動態(tài)切換庫的文章就介紹到這了,更多相關(guān)SpringBoot Redis動態(tài)切換庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論