• Springboot+Jedis+Ehcache整合


    项目结构概览:

    1. 导包

        <parent> 
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.8.RELEASE</version>
            <relativePath/> 
        </parent>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <!-- 跳过test打包 -->
            <skipTests>true</skipTests>
        </properties>
        
        <dependencies>
            <!--web场景启动器,包含 Tomcat 和 spring-mvc restful  aop jackjson支持。 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 热加载 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <optional>true</optional>
            </dependency>
            <!-- ehcache缓存 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
            <!-- redis -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <!-- commons-lang3工具类 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.7</version>
            </dependency>
        </dependencies>
      
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <!--指定主函数路径
                    <configuration>
                        <archive>
                            <manifest>
                                <addClasspath>true</addClasspath>
                                <classpathPrefix>lib/</classpathPrefix>
                                <mainClass>com.codingapi.txlcn.tm.TMApplication</mainClass>
                            </manifest>
                        </archive>
                    </configuration>-->
                </plugin>
            </plugins>
        </build>  
      <!--
        没有Main函数打包
      <build>
          <plugins>
              <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-assembly-plugin</artifactId>
              </plugin>
          </plugins>
      </build>
      -->

    2.1 application.properties配置文件

    # 运行端口
    server.port=8084
    # 项目访问路径前缀
    server.context-path=/cache
    
    # 服务名称
    spring.application.name=springbootTest
    # ehcache配置文件
    spring.cache.ehcache.config=classpath:ehcacheproduct.xml

    2.2 redis.properties配置参数

    # Redis数据库索引(默认为0)
    spring.redis.database=0
    # Redis服务器地址
    spring.redis.host=127.0.0.1
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    #spring.redis.password=
    # 连接池最大连接数(使用负值表示没有限制)
    spring.redis.jedis.pool.max-active=1024
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.jedis.pool.max-wait=10000
    # 连接池中的最大空闲连接
    spring.redis.jedis.pool.max-idle=200
    # 连接池中的最小空闲连接
    spring.redis.jedis.pool.min-idle=0
    # 连接超时时间(毫秒)
    spring.redis.timeout=10000
    #flase:超时就报错,   true:阻塞到超时
    spring.redis.block-when-exhausted=true

    2.3 ehcacheproduct.xml配置问价

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="ehcache.xsd">
        
        <!-- 磁盘缓存位置 -->
        <diskStore path="java.io.tmpdir" />
        
        <!-- 
            name: 缓存名称
            maxElementsInMemory: 缓存最大个数
            maxEntriesLocalHeap: 在内存创建对象的最大数量,0=无限制。
            maxEntriesLocalDisk: 硬盘上存储的对象的最大数量。默认0,即无限制
            eternal: 对象是否永久有效,一但设置了, timeout将不起作用
            timeToIdleSeconds: 当缓存闲置n秒后销毁 ,默认是0,也就是对象存活时间无穷大。当eternal=false时有效!
            timeToLiveSeconds: 当缓存存活n秒后销毁 ,默认是0,也就是对象存活时间无穷大。当eternal=false时有效!
            overflowToDisk: 达到缓存maxElementsInMemory个数后,将数据存入磁盘,默认大小为30mb
            diskPersistent: 是否缓存虚拟机重启期数据 
            diskExpiryThreadIntervalSeconds: 磁盘失效线程运行时间间隔,默认是120秒。达到缓存最大个数,会按照磁盘清理策略去清理磁盘。
            memoryStoreEvictionPolicy: 磁盘清理策略, 默认策略LRU(最近最少使用)你可以设置为FIFO(先进先出)或是LFU(较少使用)。
            clearOnFlush: 内存数量最大时是否清除
         -->
        <!-- 默认缓存 -->
        <defaultCache
                maxElementsInMemory="10000"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="120"
                maxElementsOnDisk="10000000"
                diskExpiryThreadIntervalSeconds="120"
                memoryStoreEvictionPolicy="LRU">
    
            <persistence strategy="localTempSwap" />
        </defaultCache>
    
        <!-- 自定义缓存 -->
        <cache name="userchache"
               eternal="false"
               timeToIdleSeconds="2400"
               timeToLiveSeconds="2400"
               maxEntriesLocalHeap="10000"
               maxEntriesLocalDisk="10000000"
               diskExpiryThreadIntervalSeconds="120"
               overflowToDisk="false"
               memoryStoreEvictionPolicy="LRU">
        </cache>
    </ehcache>

    3. RedisConfig配置文件

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
     
    @Configuration
    @PropertySource("classpath:redis.properties")
    public class RedisConfig {
        private final Logger log = LoggerFactory.getLogger(this.getClass());
        
        @Value("${spring.redis.host}")
        private String host;
     
        @Value("${spring.redis.port}")
        private int port;
     
        @Value("${spring.redis.timeout}")
        private int timeout;
     
        @Value("${spring.redis.jedis.pool.max-idle}")
        private int maxIdle;
     
        @Value("${spring.redis.jedis.pool.max-wait}")
        private long maxWaitMillis;
     
        //@Value("${spring.redis.password}")
        //private String password;
        private String password;
        
        @Value("${spring.redis.block-when-exhausted}")
        private boolean  blockWhenExhausted;
     
        @Bean
        public JedisPool redisPoolFactory()  throws Exception{
            log.info("-------------JedisPool注入成功!!----------------");
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(maxIdle);
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
            // 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
            jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
            // 是否启用pool的jmx管理功能, 默认true
            jedisPoolConfig.setJmxEnabled(true);
            JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
            
            return jedisPool;
        }
    }

    4. Redis工具类

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    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 RedisUtil{
        private final Logger log = LoggerFactory.getLogger(this.getClass());
        @Autowired
        private JedisPool jedisPool;
     
        
        public String get(String key) {
            Jedis jedis = null;
            String value = null;
            try {
                jedis = jedisPool.getResource();
                value = jedis.get(key);
                log.info(value);
            } catch (Exception e) {
     
                log.error(e.getMessage());
            } finally {
                returnResource(jedis);
            }
            return value;
        }    
        
        public String set(String key, String value) {
            Jedis jedis = null;
            try {
                jedis = jedisPool.getResource();
                return jedis.set(key, value);
            } catch (Exception e) {
     
                log.error(e.getMessage());
                return "0";
            } finally {
                returnResource(jedis);
            }
        }
        
        /**
         * 关闭连接
         */
        public static void returnResource(Jedis jedis) {
            try {
                jedis.close();
            } catch (Exception e) {
            }
        }
    }    

    5. 测试业务逻辑

    import java.util.ArrayList;
    import java.util.List;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.CacheConfig;
    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
    import com.wulei.model.User;
    import com.wulei.utils.RedisUtil;
    @Service
    // 指定ehcache缓存规则
    @CacheConfig(cacheNames = "userchache")
    public class UserService {
        @Autowired
        RedisUtil redisUtil;
        
        public List<User> testRedis() {
            redisUtil.set("name", "吴磊");
            System.out.println(redisUtil.get("name"));
            return this.getDataSource();
        }
        
        @Cacheable(key="'testEhcaheCacheable'")
        public List<User> testEhcaheCacheable(){
            // 只会查询一次
            System.out.println("Cacheable查询缓存数据");
            return this.getDataSource();
        }
        
        //键为"userId:"字符串加上userId值,如 'userId:1'
        @CacheEvict(key="'userId:' + #userId")
        public List<User> testEhcaheCacheEvict(int userId){
            // 每次请求都会删除指定key
            System.out.println("清除userchache中指定key的缓存");
            List<User> list = this.getDataSource();
            list.remove(userId-1);
            return list;
        }
        
        @CacheEvict(allEntries=true)  
        public List<User> testEhcaheCacheEvictAll(){
            // 每次请求都会删除所有key
            System.out.println("清除userchache中所有key的缓存");
            return new ArrayList<User>();
        }
        
        public List<User> getDataSource(){
            List<User> list = new ArrayList<User>();
            list.add(new User(1, "jay", 21));
            list.add(new User(2, "join", 22));
            list.add(new User(3, "eason", 23));
            list.add(new User(4, "jj", 24));
            return list;
        }
    }

    6. controller入口

    @RestController
    public class UserController {
    
        @Autowired
        private UserService userService;
        
        @RequestMapping("/testRedis")
        public List<User> testRedis() {
            return userService.testRedis();
        }
        @RequestMapping("/testEhcahe")
        public List<User> testEhcahe(int type){
            if(type==1) {
                return userService.testEhcaheCacheable();
            }else if(type==2) {
                return userService.testEhcaheCacheEvict(type);
            }else if(type==3) {
                return userService.testEhcaheCacheEvictAll();
            }
            return null;
        }
    }

    7. 主函数

    @SpringBootApplication
    @EnableCaching // 启用ehcache缓存注解
    public class Application {
    
         private static Logger log = Logger.getLogger(Application.class);
         
         public static void main(String[] args) {
                SpringApplication.run(Application.class, args);
                log.info("SpringBoot Start Success");
            }
    }

    <parent>         <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.8.RELEASE</version>        <relativePath/>     </parent>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <java.version>1.8</java.version><!-- 跳过test打包 -->        <skipTests>true</skipTests>    </properties>        <dependencies>        <!--web场景启动器,包含 Tomcat 和 spring-mvc restful  aop jackjson支持。 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- 热加载 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <optional>true</optional>        </dependency>        <!-- ehcache缓存 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-cache</artifactId>        </dependency>        <!-- redis -->        <dependency>            <groupId>redis.clients</groupId>            <artifactId>jedis</artifactId>            <type>jar</type>            <scope>compile</scope>        </dependency>        <!-- commons-lang3工具类 -->        <dependency>            <groupId>org.apache.commons</groupId>            <artifactId>commons-lang3</artifactId>            <version>3.7</version>        </dependency>    </dependencies>      <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <!--指定主函数路径                <configuration>                    <archive>                        <manifest>                            <addClasspath>true</addClasspath>                            <classpathPrefix>lib/</classpathPrefix>                            <mainClass>com.codingapi.txlcn.tm.TMApplication</mainClass>                        </manifest>                    </archive>                </configuration>-->            </plugin>        </plugins>    </build>    <!--    没有Main函数打包  <build>      <plugins>          <plugin>             <groupId>org.apache.maven.plugins</groupId>              <artifactId>maven-assembly-plugin</artifactId>          </plugin>      </plugins>  </build>  -->

  • 相关阅读:
    @RequestParam,@PathParam,@PathVariable,@QueryParam注解的使用区别
    关于android studio 出现Error:Execution failed for task ':app:preDebugAndroidTestBuild'. 的解决办法
    opencv:轮廓匹配
    opencv:图像轮廓计算
    opencv:图像轮廓发现
    opencv:联通组件扫描
    opencv:自适应阈值
    opencv:全局阈值
    opencv:二值图像的概念
    opencv:边缘提取
  • 原文地址:https://www.cnblogs.com/wlwl/p/10085725.html
Copyright © 2020-2023  润新知