国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【springboot系列】springboot整合獨立模塊 redis 做緩存

Jokcy / 1137人閱讀

摘要:至此,已完成整合獨立模塊做緩存詳情請看地址相關文章系列整合獨立模塊

項目github地址:https://github.com/5-Ason/aso...
具體可看 ./db/db-redis./db/db-cache 兩個模塊

// TODO 在整合redis之前需要先本地配置好redis環境,遲點有時間補一下linux下下載安裝配置redis

本文主要實現的是對數據操作進行獨立模塊得整合,詳情請看我的另一篇博文:
【技術雜談】springcloud微服務之數據操作獨立模塊化

1、本篇目標

獨立部署Redis非關系型數據庫作為內存緩存模塊,實現SpringBoot項目中依賴緩存模塊進行緩存操作,并進行簡單測試。

2、添加依賴


    org.springframework.boot
    spring-boot-starter-data-redis



    org.springframework.boot
    spring-boot-starter-cache
3、配置屬性

因為我的項目使用的是springcloud分布式配置
所以配置文件在 ./config-server/config-repo/data-dev.yml,具體配置如下:

# ====================redis====================
redis:
  # Redis服務器地址
  host: ason-hostname
  # Redis服務器連接端口
  port: 6379
  # Redis服務器連接密碼(默認為空)
  password:
  # 連接超時時間(毫秒)
  timeout: 0
  # Redis數據庫索引(默認為0)
  database: 0
  pool:
    # 連接池最大連接數(使用負值表示沒有限制)
    max-active: 8
    # 連接池最大阻塞等待時間(使用負值表示沒有限制)
    max-wait: -1
    # 連接池中的最大空閑連接
    max-idle: 8
    # 連接池中的最小空閑連接
    min-idle: 0
4、RedisConf配置
package com.ason;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Qualifier;
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.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;

/**
 * Created by Ason on 2017-09-23.
 */
@Configuration
public class RedisConf {
    private static final Log log = LogFactory.getLog(RedisConf.class);

    @Value("${redis.host}")
    private String host;  // Redis服務器地址
    @Value("${redis.port}")
    private int port;  // Redis服務器連接端口
    @Value("${redis.password}")
    private String password;  // Redis服務器連接密碼(默認為空)
    @Value("${redis.timeout}")
    private int timeout;  // 連接超時時間(毫秒)
    @Value("${redis.database}")
    private int database;  // 連接超時時間(毫秒)
    @Value("${redis.pool.max-active}")
    private int maxTotal;  // 連接池最大連接數(使用負值表示沒有限制)
    @Value("${redis.pool.max-wait}")
    private int maxWaitMillis;  // 連接池最大阻塞等待時間(使用負值表示沒有限制)
    @Value("${redis.pool.max-idle}")
    private int maxIdle;  // 連接池中的最大空閑連接
    @Value("${redis.pool.min-idle}")
    private int minIdle;  // 連接池中的最小空閑連接



    /**
     * 配置JedisPoolConfig
     * @return JedisPoolConfig實體
     */
    @Bean(name = "jedisPoolConfig")
    public JedisPoolConfig jedisPoolConfig() {
        log.info("初始化JedisPoolConfig");
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(this.maxTotal);  //  連接池最大連接數(使用負值表示沒有限制)
        jedisPoolConfig.setMaxWaitMillis(this.maxWaitMillis);  // 連接池最大阻塞等待時間(使用負值表示沒有限制)
        jedisPoolConfig.setMaxIdle(this.maxIdle);  // 連接池中的最大空閑連接
        jedisPoolConfig.setMinIdle(this.minIdle);  // 連接池中的最小空閑連接
//        jedisPoolConfig.setTestOnBorrow(true);
//        jedisPoolConfig.setTestOnCreate(true);
//        jedisPoolConfig.setTestWhileIdle(true);
        return jedisPoolConfig;
    }

    /**
     * 實例化 RedisConnectionFactory 對象
     * @param poolConfig
     * @return
     */
    @Bean(name = "jedisConnectionFactory")
    public RedisConnectionFactory jedisConnectionFactory(@Qualifier(value = "jedisPoolConfig") JedisPoolConfig poolConfig) {
        log.info("初始化RedisConnectionFactory");
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(poolConfig);
        jedisConnectionFactory.setHostName(this.host);
        jedisConnectionFactory.setPort(this.port);
        jedisConnectionFactory.setDatabase(this.database);
        return jedisConnectionFactory;
    }

    /**
     *  實例化 RedisTemplate 對象
     * @return
     */
    @Bean(name = "redisTemplate")
    public RedisTemplate functionDomainRedisTemplate(@Qualifier(value = "jedisConnectionFactory") RedisConnectionFactory factory) {
        log.info("初始化RedisTemplate");
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new EntityRedisSerializer());
        redisTemplate.setValueSerializer(new EntityRedisSerializer());
        redisTemplate.afterPropertiesSet();
        redisTemplate.setEnableTransactionSupport(true);
        return redisTemplate;
    }
}
RedisConf中涉及到的序列化相關的類 EntityRedisSerializer
package com.ason;

import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;

/**
 * 自定義Redis序列化
 * Created by Ason on 2017-09-23.
 */
public class EntityRedisSerializer implements RedisSerializer {
    @Override
    public byte[] serialize(Object t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        }
        return SerializeUtil.serialize(t);
    }

    @Override
    public Object deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        return SerializeUtil.unserialize(bytes);
    }
}

SerializeUtil
package com.ason;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 定義序列化
 * Created by Ason on 2017-09-23.
 */
public class SerializeUtil {

    public static byte[] serialize(Object object) {
        ObjectOutputStream oos = null;
        ByteArrayOutputStream baos = null;
        try {
            // 序列化
            baos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(baos);
            oos.writeObject(object);
            byte[] bytes = baos.toByteArray();
            return bytes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Object unserialize(byte[] bytes) {
        ByteArrayInputStream bais = null;
        try {
            // 反序列化
            bais = new ByteArrayInputStream(bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            return ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
5、RedisCacheConf配置
package com.ason;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.core.RedisTemplate;

import java.lang.reflect.Method;

/**
 * Created by Ason on 2017/9/25.
 * 這里實現CachingConfigurerSupport主要是方便使用自定義keyGenerator
 */
@Configuration
@EnableCaching // 啟用緩存
public class RedisCacheConf  extends CachingConfigurerSupport {

    @Autowired
    private RedisTemplate redisTemplate;

    private static final Log log = LogFactory.getLog(RedisConf.class);
    /**
     * 配置redis緩存管理對象
     * @return
     */
    @Bean(name = "cacheManager")
    public CacheManager cacheManager() {
        log.info("初始化CacheManager");
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//        Map expires = new HashMap<>();
//        expires.put("cache:user", 36000L);
//        cacheManager.setExpires(expires);
        //設置緩存過期時間
        //cacheManager.setDefaultExpiration(10000);
        return cacheManager;
    }

    /**
     * 生成key的策略
     * 此方法將會根據類名+方法名+所有參數的值生成唯一的一個key,即使@Cacheable中的value屬性一樣,key也會不一樣。
     * @return
     */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}
6、具體使用

因為是將redis的配置多帶帶作為一個模塊db-redis,CacheManager的配置模塊db-cache依賴db-redis:


    com.ason
    db-redis
    0.0.1-SNAPSHOT

所以我的rms-service微服務想進行緩存的操作,需依賴db-cache模塊:


    com.ason
    db-cache
    0.0.1-SNAPSHOT

同時,還需要讀取redis配置的屬性,上面我的配置是放在 ./config-server/config-repo/data-dev.yml 下,所以在rms-service微服務下的 bootstrap.yml 配置文件中,需要指定配置中心服務的地址以及配置文件的name和profile:

spring:
  # 配置中心服務的地址
  cloud:
    config:
      name: data
      profile: ${spring.profiles.active} # 要讀取的配置文件profile屬性
#      uri: http://127.0.0.1:7001
      #label: ${spring.profiles.active}
      discovery:
        enabled: true                                 # 默認false,設為true表示使用注冊中心中的configserver配置而不自己配置configserver的uri
        serviceId: config-server
  profiles:
    active: dev

接下來,即可使用緩存相關的注解在 rms-service 微服務下使用緩存,在 RmsUserController(僅為測試,實際開發中根據需求做調整) 添加:

/**
 * 查詢單個用戶
 */
@Cacheable(value = "usercache", key = "#account")
@PostMapping(value = "/account", produces = "application/json;charset=UTF-8")
public String findUserByAccout(@RequestParam("account") String account) throws Exception {
    return ResultBody.success(rmsUserService.selectUserByAccout(account));
}

啟動項目,post請求訪問 http://localhost:8888/rms/use...

接下來,再去redis看一下,發現11@qq.com已作為key保存起來了:

7、注意事項

有些情形下注解式緩存會不起作用的(本人第一次整合測試遇到的坑):
同一個bean內部方法調用、子類調用父類中有緩存注解的方法等。


至此,已完成 springboot 整合獨立模塊 redis 做緩存
詳情請看github地址:https://github.com/5-Ason/aso...

相關文章:
【springboot系列】springboot整合獨立模塊Druid + mybatis-plus

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61898.html

相關文章

  • springboot系列springboot整合獨立模塊 redis 緩存

    摘要:至此,已完成整合獨立模塊做緩存詳情請看地址相關文章系列整合獨立模塊 項目github地址:https://github.com/5-Ason/aso...具體可看 ./db/db-redis 和 ./db/db-cache 兩個模塊 // TODO 在整合redis之前需要先本地配置好redis環境,遲點有時間補一下linux下下載安裝配置redis 本文主要實現的是對數據操作進行獨立...

    qianfeng 評論0 收藏0
  • 【技術雜談】springcloud微服務之數據操作獨立模塊

    摘要:而在這個微服務下,同樣需要進行數據操作,我不可能還要在下再一次進行集成,這樣大大的增加了代碼量。其次,是將有關數據操作的都單獨部署成一個模塊,比如我集成的模塊,集成的模塊,使用作為內存緩存模塊。 前言 相對于 spring 對 mybatis 以及 redis 等的整合所需要的各種配置文件,在 springboot 下,已經大大的簡化了,你可能只是需要增加個依賴,加個注解,然后在配置文...

    tianyu 評論0 收藏0
  • springboot系列springboot整合獨立模塊Druid + mybatis-plus

    摘要:申請連接時執行檢測連接是否有效,做了這個配置會降低性能。作者在版本中使用,通過監控界面發現有緩存命中率記錄,該應該是支持。允許和不允許單條語句返回多個數據集取決于驅動需求使用列標簽代替列名稱。需要驅動器支持。將自動映射所有復雜的結果。 項目github地址:https://github.com/5-Ason/aso... 具體可看 ./db/db-mysql 模塊 本文主要實現的是對...

    RobinTang 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<