• springboot 使用Redis


    一、 配置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>
    

    二、在resources下创建redis.properties

    		redis.hostName=127.0.0.1
    		#端口号  
    		redis.port=6379
    		#如果有密码  
    		#redis.password=
    		#客户端超时时间单位是毫秒 默认是2000 
    		redis.timeout=10000  
    		
    		#最大空闲数  
    		redis.maxIdle=300  
    		#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal  
    		#redis.maxActive=600  
    		#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性  
    		redis.maxTotal=1000  
    		#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。  
    		redis.maxWaitMillis=1000  
    		#连接的最小空闲时间 默认1800000毫秒(30分钟)  
    		redis.minEvictableIdleTimeMillis=300000  
    		#每次释放连接的最大数目,默认3  
    		redis.numTestsPerEvictionRun=1024  
    		#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1  
    		redis.timeBetweenEvictionRunsMillis=30000  
    		#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个  
    		redis.testOnBorrow=true  
    		#在空闲时检查有效性, 默认false  
    		redis.testWhileIdle=true  
    

    三、编写RedisConfig.java

        package com.example.demo.config;
    
    	import com.example.demo.util.RedisUtil;
    	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 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.GenericJackson2JsonRedisSerializer;
    	import org.springframework.data.redis.serializer.StringRedisSerializer;
    	import redis.clients.jedis.JedisPoolConfig;
    
    	/**
    	 * @author 12084
    	 * @create 2018-08-13 9:58
    	 */
    	@Configuration
    	@PropertySource("classpath:redis.properties")
    	public class RedisConfig {
    
        public static final Logger logger = LoggerFactory.getLogger(RedisConfig.class);
    
    
        @Value("${redis.hostName}")
        private String hostName;
        @Value("${redis.port}")
        private Integer port;
        @Value("${redis.maxIdle}")
        private Integer maxIdle;
    
        @Value("${redis.maxTotal}")
        private Integer maxTotal;
        @Value("${redis.timeout}")
        private Integer timeout;
    
        @Value("${redis.maxWaitMillis}")
        private Integer maxWaitMillis;
    
        @Value("${redis.minEvictableIdleTimeMillis}")
        private Integer minEvictableIdleTimeMillis;
    
        @Value("${redis.numTestsPerEvictionRun}")
        private Integer numTestsPerEvictionRun;
    
        @Value("${redis.timeBetweenEvictionRunsMillis}")
        private long timeBetweenEvictionRunsMillis;
    
        @Value("${redis.testOnBorrow}")
        private boolean testOnBorrow;
    
        @Value("${redis.testWhileIdle}")
        private boolean testWhileIdle;
    
    
        /**
         * JedisPoolConfig 连接池
         *
         * @return
         */
        @Bean
        public JedisPoolConfig jedisPoolConfig() {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    
            // 最大空闲数
            jedisPoolConfig.setMaxIdle(maxIdle);
            // 连接池的最大数据库连接数
            jedisPoolConfig.setMaxTotal(maxTotal);
            // 最大建立连接等待时间
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
            // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
            jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
            jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun);
            // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
            jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
            jedisPoolConfig.setTestOnBorrow(testOnBorrow);
            // 在空闲时检查有效性, 默认false
            jedisPoolConfig.setTestWhileIdle(testWhileIdle);
            return jedisPoolConfig;
        }
    
    
        @Bean
        public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
            JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
            //连接池
            jedisConnectionFactory.setPoolConfig(jedisPoolConfig);
            //IP地址
            jedisConnectionFactory.setHostName(hostName);
            //端口号
            jedisConnectionFactory.setPort(port);
            //如果Redis设置有密码
            //jedisConnectionFactory.setPassword(password);
            //客户端超时时间单位是毫秒
            jedisConnectionFactory.setTimeout(timeout);
            return jedisConnectionFactory;
        }
    
        /**
         * 实例化 RedisTemplate 对象
         *
         * @return
         */
        @Bean
        public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            initDomainRedisTemplate(redisTemplate, redisConnectionFactory);
            return redisTemplate;
        }
    
        /**
         * 设置数据存入 redis 的序列化方式,并开启事务
         *
         * @param redisTemplate
         * @param factory
         */
        private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {
            //如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            // 开启事务
            redisTemplate.setEnableTransactionSupport(true);
            redisTemplate.setConnectionFactory(factory);
        }
    
        /**
         * 注入封装RedisTemplate
         *
         * @return RedisUtil
         * @throws
         * @Title: redisUtil
         */
        @Bean(name = "redisUtil")
        public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) {
            RedisUtil redisUtil = new RedisUtil();
            redisUtil.setRedisTemplate(redisTemplate);
            return redisUtil;
        }
    	}
    

    四、 编写RedisUtil工具类

    	package com.example.demo.util;
    
    	import org.slf4j.Logger;
    	import org.slf4j.LoggerFactory;
    	import org.springframework.data.redis.core.RedisTemplate;
    	import org.springframework.util.CollectionUtils;
    	
    	import java.util.List;
    	import java.util.Map;
    	import java.util.Set;
    	import java.util.concurrent.TimeUnit;
    	
    	/**
    	 * @author 12084
    	 * @create 2018-08-13 10:31
    	 */
    
    	public class RedisUtil {
    	public static final Logger logger = LoggerFactory.getLogger(RedisUtil.class);
    
        private RedisTemplate<String, Object> redisTemplate;
    
        public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
            this.redisTemplate = redisTemplate;
        }
    
       
        /**
         * 指定缓存失效时间
         * @param key 键
         * @param time 时间(秒)
         * @return
         */
        public boolean expire(String key, long time) {
            try{
                if (time > 0) {
                    redisTemplate.expire(key, time, TimeUnit.SECONDS);
                }
                return true;
            }catch(Exception e){
                logger.error("RedisUtil.expire error:",e);
                return false;
            }
        }
    
        /**
         * 根据key 获取过期时间
         *
         * @param key 键 不能为null
         * @return 时间(秒) 返回0代表为永久有效
         */
        public long getExpire(String key) {
            return redisTemplate.getExpire(key, TimeUnit.SECONDS);
        }
    
        /**
         * 判断key是否存在
         * @param key 键
         * @return true 存在 false不存在
         */
        public boolean hasKey(String key){
            try{
                return redisTemplate.hasKey(key);
            }catch(Exception e){
                logger.error("RedisUtil.hasKey error:",e);
                return false;
            }
        }
        /**
         * 删除缓存
         * @param key 可以传一个值 或多个
         */
        public void del(String... key){
            if (key != null && key.length > 0) {
                if (key.length == 1) {
                    redisTemplate.delete(key[0]);
                }else {
                    redisTemplate.delete(CollectionUtils.arrayToList(key));
                }
            }
        }
    
    
    
        /**
         * 普通缓存获取
         *
         * @param key 键
         * @return 值
         */
        public Object get(String key) {
            return key == null ? null : redisTemplate.opsForValue().get(key);
        }
    
        /**
         * 普通缓存放入
         * @param key 键
         * @param value 值
         * @return true成功 false失败
         */
        public boolean set(String key,Object value) {
            try {
                redisTemplate.opsForValue().set(key, value);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
    
        }
        /**
         * 普通缓存放入并设置时间
         * @param key 键
         * @param value 值
         * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
         * @return true成功 false 失败
         */
        public boolean set(String key,Object value,long time){
            try {
                if(time>0){
                    redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
                }else{
                    set(key, value);
                }
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
    
    	}
    

    五、编写测试类

    	package com.example.demo.service;
    
    	import com.example.demo.util.RedisUtil;
    	import org.junit.Test;
    	import org.junit.runner.RunWith;
    	import org.slf4j.Logger;
    	import org.slf4j.LoggerFactory;
    	import org.springframework.beans.factory.annotation.Autowired;
    	import org.springframework.boot.test.context.SpringBootTest;
    	import org.springframework.test.context.junit4.SpringRunner;
    
    	/**
    	 * @author 12084
    	 * @create 2018-08-10 10:31
    	 */
    	
    	@RunWith(SpringRunner.class)
    	@SpringBootTest
    	public class RedisServiceTest {
    	
    	    public static final Logger logger = LoggerFactory.getLogger(RedisServiceTest.class);
    	
    	    @Autowired
    	    private RedisUtil redisUtil;
    	
    	
    	    @Test
    	    public void t1() {
    	//        boolean lmj = redisUtil.set("lmj", "520");
    	//
    	//        logger.warn("lmj:{}", lmj);
    	
    	        String lmj = (String)redisUtil.get("lmj");
    	        logger.warn("lmj:{}", lmj);
    	    }
    	
    	}
    有志者,事竟成,破釜沈舟,百二秦关终属楚。苦心人,天不负,卧薪尝胆,三千越甲可吞吴。
  • 相关阅读:
    BZOJ_2588_Spoj 10628. Count on a tree_树剖+主席树
    BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
    单例模式
    JDBC连接数据库查询信息的步骤(提取成配置文件方式)
    JDBC访问数据库查询信息的步骤(硬编码格式)
    大数据
    accp
    递归
    struts2中Action到底是什么,怎么理解
    转发和重定向的区别(简单解释)
  • 原文地址:https://www.cnblogs.com/menxn/p/9467090.html
Copyright © 2020-2023  润新知