zoukankan      html  css  js  c++  java
  • Springboot redis 整合

    年末将至,是时候该把所学的总结下了。最近正好从eclipes转到idea,发现idea对模组的支持很棒。这一片先总结下springboot和redis的整合

    首先添加redis服务器

    直接用docker 远程拉取即可,这里不再描述

    直接撸代码

    1.添加依赖

    1 <dependency>
    2             <groupId>org.springframework.boot</groupId>
    3             <artifactId>spring-boot-starter-data-redis</artifactId>
    4         </dependency>

    2.在配置文件中增加配置的连接信息

    ## Redis 配置
    ## 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.pool.max-active=8
    ## 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.pool.max-wait=-1
    ## 连接池中的最大空闲连接
    spring.redis.pool.max-idle=8
    ## 连接池中的最小空闲连接
    spring.redis.pool.min-idle=0
    ## 连接超时时间(毫秒)
    spring.redis.timeout=0

    好了,基本的配置就好了

    我们可以写个测试类,看看调用情况

    package com.hdkj.redis;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class RedisApplicationTests {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @Test
        public void contextLoads() {
            stringRedisTemplate.opsForValue().set("xmz","23");
            String xmz = stringRedisTemplate.opsForValue().get("xmz");
            System.out.println(xmz);
        }
    
    }

    输出结果:23

    好了,这就是最简单的配置了。

    ======================================================================================================

    springboot更推荐我们把配置信息写在类里面

    我们可以对以上的配置信息改造下

    新建一个配置实体类   RedisProperties

      1 package com.hdkj.redis.config;
      2 
      3 import org.springframework.boot.context.properties.ConfigurationProperties;
      4 import org.springframework.context.annotation.PropertySource;
      5 
      6 import java.util.List;
      7 
      8 /**
      9  * @author xuminzhe
     10  * @version V1.0
     11  * @Project study
     12  * @Package com.hdkj.redis.config
     13  * @Description
     14  * @Date 2017/12/4
     15  */
     16 @ConfigurationProperties(prefix = "spring.redis")
     17 //@PropertySource("classpath:application.properties")
     18 public class RedisProperties {
     19     /**
     20      * Database index used by the connection factory.
     21      */
     22     private int database = 0;
     23 
     24     /**
     25      * Redis url, which will overrule host, port and password if set.
     26      */
     27     private String url;
     28 
     29     /**
     30      * Redis server host.
     31      */
     32     private String host = "localhost";
     33 
     34     /**
     35      * Login password of the redis server.
     36      */
     37     private String password;
     38 
     39     /**
     40      * Redis server port.
     41      */
     42     private int port = 6379;
     43 
     44     /**
     45      * Enable SSL.
     46      */
     47     private boolean ssl;
     48 
     49     /**
     50      * Connection timeout in milliseconds.
     51      */
     52     private int timeout;
     53 
     54     private RedisProperties.Pool pool;
     55 
     56     private RedisProperties.Sentinel sentinel;
     57 
     58     private RedisProperties.Cluster cluster;
     59 
     60     public int getDatabase() {
     61         return this.database;
     62     }
     63 
     64     public void setDatabase(int database) {
     65         this.database = database;
     66     }
     67 
     68     public String getUrl() {
     69         return this.url;
     70     }
     71 
     72     public void setUrl(String url) {
     73         this.url = url;
     74     }
     75 
     76     public String getHost() {
     77         return this.host;
     78     }
     79 
     80     public void setHost(String host) {
     81         this.host = host;
     82     }
     83 
     84     public String getPassword() {
     85         return this.password;
     86     }
     87 
     88     public void setPassword(String password) {
     89         this.password = password;
     90     }
     91 
     92     public int getPort() {
     93         return this.port;
     94     }
     95 
     96     public void setPort(int port) {
     97         this.port = port;
     98     }
     99 
    100     public boolean isSsl() {
    101         return this.ssl;
    102     }
    103 
    104     public void setSsl(boolean ssl) {
    105         this.ssl = ssl;
    106     }
    107 
    108     public void setTimeout(int timeout) {
    109         this.timeout = timeout;
    110     }
    111 
    112     public int getTimeout() {
    113         return this.timeout;
    114     }
    115 
    116     public RedisProperties.Sentinel getSentinel() {
    117         return this.sentinel;
    118     }
    119 
    120     public void setSentinel(RedisProperties.Sentinel sentinel) {
    121         this.sentinel = sentinel;
    122     }
    123 
    124     public RedisProperties.Pool getPool() {
    125         return this.pool;
    126     }
    127 
    128     public void setPool(RedisProperties.Pool pool) {
    129         this.pool = pool;
    130     }
    131 
    132     public RedisProperties.Cluster getCluster() {
    133         return this.cluster;
    134     }
    135 
    136     public void setCluster(RedisProperties.Cluster cluster) {
    137         this.cluster = cluster;
    138     }
    139 
    140     /**
    141      * Pool properties.
    142      */
    143     public static class Pool {
    144 
    145         /**
    146          * Max number of "idle" connections in the pool. Use a negative value to indicate
    147          * an unlimited number of idle connections.
    148          */
    149         private int maxIdle = 8;
    150 
    151         /**
    152          * Target for the minimum number of idle connections to maintain in the pool. This
    153          * setting only has an effect if it is positive.
    154          */
    155         private int minIdle = 0;
    156 
    157         /**
    158          * Max number of connections that can be allocated by the pool at a given time.
    159          * Use a negative value for no limit.
    160          */
    161         private int maxActive = 8;
    162 
    163         /**
    164          * Maximum amount of time (in milliseconds) a connection allocation should block
    165          * before throwing an exception when the pool is exhausted. Use a negative value
    166          * to block indefinitely.
    167          */
    168         private int maxWait = -1;
    169 
    170         public int getMaxIdle() {
    171             return this.maxIdle;
    172         }
    173 
    174         public void setMaxIdle(int maxIdle) {
    175             this.maxIdle = maxIdle;
    176         }
    177 
    178         public int getMinIdle() {
    179             return this.minIdle;
    180         }
    181 
    182         public void setMinIdle(int minIdle) {
    183             this.minIdle = minIdle;
    184         }
    185 
    186         public int getMaxActive() {
    187             return this.maxActive;
    188         }
    189 
    190         public void setMaxActive(int maxActive) {
    191             this.maxActive = maxActive;
    192         }
    193 
    194         public int getMaxWait() {
    195             return this.maxWait;
    196         }
    197 
    198         public void setMaxWait(int maxWait) {
    199             this.maxWait = maxWait;
    200         }
    201 
    202     }
    203 
    204     /**
    205      * Cluster properties.
    206      */
    207     public static class Cluster {
    208 
    209         /**
    210          * Comma-separated list of "host:port" pairs to bootstrap from. This represents an
    211          * "initial" list of cluster nodes and is required to have at least one entry.
    212          */
    213         private List<String> nodes;
    214 
    215         /**
    216          * Maximum number of redirects to follow when executing commands across the
    217          * cluster.
    218          */
    219         private Integer maxRedirects;
    220 
    221         public List<String> getNodes() {
    222             return this.nodes;
    223         }
    224 
    225         public void setNodes(List<String> nodes) {
    226             this.nodes = nodes;
    227         }
    228 
    229         public Integer getMaxRedirects() {
    230             return this.maxRedirects;
    231         }
    232 
    233         public void setMaxRedirects(Integer maxRedirects) {
    234             this.maxRedirects = maxRedirects;
    235         }
    236 
    237     }
    238 
    239     /**
    240      * Redis sentinel properties.
    241      */
    242     public static class Sentinel {
    243 
    244         /**
    245          * Name of Redis server.
    246          */
    247         private String master;
    248 
    249         /**
    250          * Comma-separated list of host:port pairs.
    251          */
    252         private String nodes;
    253 
    254         public String getMaster() {
    255             return this.master;
    256         }
    257 
    258         public void setMaster(String master) {
    259             this.master = master;
    260         }
    261 
    262         public String getNodes() {
    263             return this.nodes;
    264         }
    265 
    266         public void setNodes(String nodes) {
    267             this.nodes = nodes;
    268         }
    269 
    270     }
    271 
    272 }

    如果熟悉mybatis配置的朋友一定对这种方式不会陌生,接下来我们在新建一个配置类

     1 package com.hdkj.redis.config;
     2 
     3 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
     4 import org.springframework.boot.context.properties.EnableConfigurationProperties;
     5 import org.springframework.cache.annotation.CachingConfigurerSupport;
     6 import org.springframework.cache.annotation.EnableCaching;
     7 import org.springframework.context.annotation.Bean;
     8 import org.springframework.context.annotation.Configuration;
     9 import org.springframework.context.annotation.Import;
    10 import org.springframework.data.redis.connection.RedisConnectionFactory;
    11 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    12 import org.springframework.data.redis.core.RedisTemplate;
    13 import redis.clients.jedis.JedisPoolConfig;
    14 import redis.clients.jedis.JedisShardInfo;
    15 import redis.clients.jedis.ShardedJedisPool;
    16 
    17 import javax.inject.Inject;
    18 import java.util.ArrayList;
    19 import java.util.List;
    20 
    21 /**
    22  * @author xuminzhe
    23  * @version V1.0
    24  * @Project study
    25  * @Package com.hdkj.redis.config
    26  * @Description
    27  * @Date 2017/12/4
    28  */
    29 @Configuration
    30 @EnableCaching
    31 @Import(value = RedisAutoConfiguration.class)
    32 @EnableConfigurationProperties(RedisProperties.class)
    33 public class RedisConfiguration extends CachingConfigurerSupport {
    34     @Inject
    35     private RedisProperties properties;
    36 
    37     @Bean
    38     public RedisConnectionFactory jedisConnectionFactory() {
    39         JedisPoolConfig poolConfig = new JedisPoolConfig();
    40         poolConfig.setMaxTotal(properties.getPool().getMaxActive());
    41         poolConfig.setMaxIdle(properties.getPool().getMaxIdle());
    42         poolConfig.setMaxWaitMillis(properties.getPool().getMaxWait());
    43         poolConfig.setTestOnBorrow(true);
    44         poolConfig.setTestOnCreate(true);
    45         poolConfig.setTestWhileIdle(true);
    46         JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(poolConfig);
    47         jedisConnectionFactory.setHostName(properties.getHost());
    48         if (null != properties.getPassword()) {
    49             jedisConnectionFactory.setPassword(properties.getPassword());
    50         }
    51         jedisConnectionFactory.setDatabase(properties.getDatabase());
    52         jedisConnectionFactory.setPort(properties.getPort());
    53 
    54         //其他配置,可再次扩展
    55         return jedisConnectionFactory;
    56     }
    57 
    58     @Bean(name = "redisTemplate")
    59     public RedisTemplate redisTemplate() {
    60         RedisTemplate redisTemplate = new RedisTemplate();
    61 
    62         redisTemplate.setConnectionFactory(jedisConnectionFactory());
    63 
    64 //        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
    65 //        redisTemplate.setKeySerializer(new StringRedisSerializer());
    66 //        redisTemplate.setValueSerializer(new StringRedisSerializer());
    67 //        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    68 
    69         redisTemplate.afterPropertiesSet();
    70         redisTemplate.setEnableTransactionSupport(true);
    71 
    72         return redisTemplate;
    73     }
    74 
    75     /**
    76      * 分布式环境下多台redis的配置
    77      * @return
    78      */
    79     @Bean
    80     public ShardedJedisPool shardedJedisPool(){
    81         JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    82         jedisPoolConfig.setMaxTotal(properties.getPool().getMaxActive());
    83         jedisPoolConfig.setMaxIdle(properties.getPool().getMaxIdle());
    84         jedisPoolConfig.setMaxWaitMillis(properties.getPool().getMaxWait());
    85         List<JedisShardInfo> jedisShardInfoList = new ArrayList<>();
    86         JedisShardInfo jedisShardInfo = new JedisShardInfo(properties.getHost(), properties.getPort());
    87         jedisShardInfo.setPassword(properties.getPassword());
    88         jedisShardInfoList.add(jedisShardInfo);
    89         return new ShardedJedisPool(jedisPoolConfig, jedisShardInfoList);
    90     }
    91 
    92 
    93 }

    基本的配置就完成了,这里我们再配置一个工具类用于常规的redis map的操作

    package com.hdkj.redis.utils;
    
    import org.springframework.data.redis.core.HashOperations;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author xuminzhe
     * @version V1.0
     * @Project study
     * @Package com.hdkj.redis.utils
     * @Description redis工具类
     * @Date 2017/12/4
     */
    @Component("mapRedisTemplate")
    public class MapRedisTemplate {
    
        @Resource(name = "redisTemplate")
        private RedisTemplate<String,Object> redisTemplate;
    
        public Boolean hasKey(String key, Object hashKey) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            return ops.hasKey(key, hashKey);
        }
    
        public Boolean delete(String key) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            Long l = ops.delete(key);
            return l == 1 ? Boolean.TRUE : Boolean.FALSE;
        }
    
        public Boolean delete(String key, Object hashKey) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            Long l = ops.delete(key, hashKey);
            return l > 0 ? Boolean.TRUE : Boolean.FALSE;
        }
    
        public Object get(String key, Object hashKey) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            return ops.get(key, hashKey);
        }
    
        public Map<Object, Object> entries(String key) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            return ops.entries(key);
        }
    
        public Set<Object> keys(String key) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            return ops.keys(key);
        }
    
        public List<Object> values(String key) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            return ops.values(key);
        }
    
        public Long size(String key) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            return ops.size(key);
        }
    
        public void put(String key, Object hashKey, Object value) {
    
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            ops.put(key, hashKey, value);
        }
    
        public void put(String key, Object hashKey, Object value,Long expireIn) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            ops.put(key, hashKey, value);
            redisTemplate.expire(key, expireIn, TimeUnit.MILLISECONDS);
        }
    
        public void putIfAbsent(String key, Object hashKey, Object value) {
            HashOperations<String, Object, Object> ops = redisTemplate.opsForHash();
            ops.putIfAbsent(key, hashKey, value);
        }
    
    }

    好了,这就是一个简单的redis项目的配置。

    ======================================================================================================================================

    有个问题还没解决:其他模块在调用redis模块,读取的是自己本身模块路劲下的配置文件信息,所以在调用的时候老是会失败,我暂时的处理方式是把配置信息写到  其他模块中。但是这种方式太不优雅了,有哪位朋友遇到相同情况的可以交流下。

    ======================================================================================================================================

    项目在做自增的时候报  nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range

    发现redis  默认的序列化是JdkSerializationRedisSerializer,其将初始值变成了序列化字符串存入了Redis,而Redis执行INCRBY命令时是无法识别序列化字符串为整数的。从而导致以上错误

    所以我们要修改为项目中序列化的方式

  • 相关阅读:
    HDU 6182 A Math Problem 水题
    HDU 6186 CS Course 位运算 思维
    HDU 6188 Duizi and Shunzi 贪心 思维
    HDU 2824 The Euler function 欧拉函数
    HDU 3037 Saving Beans 多重集合的结合 lucas定理
    HDU 3923 Invoker Polya定理
    FZU 2282 Wand 组合数学 错排公式
    HDU 1452 Happy 2004 数论
    HDU 5778 abs 数论
    欧拉回路【判断连通+度数为偶】
  • 原文地址:https://www.cnblogs.com/xmzJava/p/8028312.html
Copyright © 2011-2022 走看看