解决spring集成redisson踩过的坑

目录
  • spring集成redisson踩过的坑
    • 第一坑就是版本兼容问题
    • 第二个坑是设置密码问题
  • spring整合redisson配置
    • 配置方式
    • 单节点配置standalone
    • 哨兵配置sentinel
    • 集群配置cluster
    • 主从部署方式(master/slave)

spring集成redisson踩过的坑

我用spring的xml集成一直报错,所以只能选择注解方式:

@Configuration
public class RedissionConfig {
    Logger log = LoggerFactory.getLogger(RedissionConfig.class);

    @Value("${redis_ip}")
    String redis_ip;

    @Value("${redis_port}")
    String redis_port;

    @Value("${redis_password}")
    String redis_password;

    @Bean(name="redissonClient")
   public RedissonClient init(){
        log.info("redis_ip:"+redis_ip);
        log.info("redis_port:" +redis_port);
        log.info("redis_password:"+redis_password);
        Config config = new Config();
        String url = "redis://"+redis_ip+":"+redis_port;
        log.info(url);
        config.useSingleServer().setAddress(url).setPassword(redis_password);
        RedissonClient redissonClient = Redisson.create(config);
        log.info("初始化RedissonClient");
        return redissonClient;
    }
}

第一坑就是版本兼容问题

我用的Spring是4.2.7,第一次集成的是3.12.0,会报以下错误:

严重: Unable to process Jar entry [module-info.class] from Jar [jar:file:/C:/Users/Administrator/.m2/repository/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.10.1/jackson-dataformat-yaml-2.10.1.jar!/] for annotations org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 19 at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:133) at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:60) at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:209) at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:119) at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2134) at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:2010) at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1976) at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1961) at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1319) at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878) at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:376) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5322) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) at java.util.concurrent.FutureTask.run(FutureTask.java) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748)

所以把版本降低到3.10.0,就不会报错了。

第二个坑是设置密码问题

因为要区分多环境,所以把redis的信息写到配置文件中,如果按照上面的配置,会报以下错误:

Caused by: org.redisson.client.RedisException: ERR Client sent AUTH, but no password is set. channel: [id: 0xe37c85e0, L:/192.168.0.128:54867 - R:192.168.0.128/192.168.0.128:5802] command: (AUTH), params: [] at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:314) at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:130) at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:110) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502) at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:656) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:591) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:508) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:470) ... 3 more

所以要判断密码是否为空,如果是空不做参数即可,下面是改正过的代码:

public RedissonClient init(){
        log.info("redis_ip:"+redis_ip);
        log.info("redis_port:" +redis_port);
        log.info("redis_password:"+redis_password);
        Config config = new Config();
        String url = "redis://"+redis_ip+":"+redis_port;
        log.info(url);
        SingleServerConfig singleServerConfig = config.useSingleServer().setAddress(url);
        if(!StringUtils.isEmpty(redis_password)){
            singleServerConfig.setPassword(redis_password);
        }
        RedissonClient redissonClient = Redisson.create(config);
        log.info("初始化RedissonClient");
        return redissonClient;
    }

另外,网上的帖子好多直接放的ip+端口号,但是我本地会报错,一定在加redis://192.168.2.128:6379这种格式的,可能是因为版本问题,也有可能就是误导人的。

看到上面的报错,感觉知道xml的错误了:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:redisson="http://redisson.org/schema/redisson"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
  http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.2.xsd
  http://redisson.org/schema/redisson
       http://redisson.org/schema/redisson/redisson.xsd">
<beans profile="development">
       <!--redisson -->
  <!--<redisson:client id="redissonClient">
   <redisson:single-server address="redis://182.92.97.141:5802"/>
  </redisson:client>-->
    </beans>

没有设置密码,一定不要把password属性放上去,要不会报错的~

spring整合redisson配置

配置方式

redis的部署方式有单节点部署、哨兵方式部署、集群方式部署3种方式

各种配置方式可以去看xsd文件:redisson-1.1.xsd

<xsd:element name="single-server"> // 单节点
<xsd:element name="sentinel-servers"> // 哨兵
<xsd:element name="cluster-servers"> // 集群
<xsd:element name="master-slave-servers"> // 主从

等其他方式

单节点配置standalone

单纯的java代码,基于单节点部署为了保证数据的备份,一般会添加一个节点作为slave来备份master节点上的数据

//创建配置
Config config = new Config();
//指定使用单节点部署方式
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
//创建客户端(发现这一非常耗时,基本在2秒-4秒左右)
RedissonClient redisson = Redisson.create(config);  

//首先获取redis中的key-value对象,key不存在没关系
RBucket<String> keyObject = redisson.getBucket("key");
//如果key存在,就设置key的值为新值value
//如果key不存在,就设置key的值为value
keyObject.set("value");  

//最后关闭RedissonClient
redisson.shutdown(); 

spring整合pom

<!--redisson-->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>2.10.4</version>
</dependency>
<!--redis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>1.7.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.7.1.RELEASE</version>
</dependency>

spring整合redisson.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:redisson="http://redisson.org/schema/redisson"
        xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://redisson.org/schema/redisson
           http://redisson.org/schema/redisson/redisson.xsd">
        <redisson:client id="standalone" name="aliasName1,aliasName2">
            <redisson:single-server address="redis://127.0.0.1:6379" />
        </redisson:client>
    </beans>  

哨兵配置sentinel

纯java代码

//创建配置
Config config = new Config();
//指定使用哨兵部署方式
config.useSentinelServers()
    //设置sentinel.conf配置里的sentinel别名
    //比如sentinel.conf里配置为sentinel monitor my-sentinel-name 127.0.0.1 6379 2,那么这里就配置my-sentinel-name
    .setMasterName("my-sentinel-name")
    //这里设置sentinel节点的服务IP和端口,sentinel是采用Paxos拜占庭协议,一般sentinel至少3个节点
    //记住这里不是配置redis节点的服务端口和IP,sentinel会自己把请求转发给后面monitor的redis节点
    .addSentinelAddress("redis://127.0.0.1:26379")
    .addSentinelAddress("redis://127.0.0.1:26389")
    .addSentinelAddress("redis://127.0.0.1:26399");  

//创建客户端(发现这一非常耗时,基本在2秒-4秒左右)
RedissonClient redisson = Redisson.create(config);
//首先获取redis中的key-value对象,key不存在没关系
RBucket<String> keyObject = redisson.getBucket("key");
//如果key存在,就设置key的值为新值value
//如果key不存在,就设置key的值为value
keyObject.set("value");  

//最后关闭RedissonClient
redisson.shutdown(); 

spring整合redis和redisson的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans" xmlns:redisson="http://redisson.org/schema/redisson"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://redisson.org/schema/redisson http://redisson.org/schema/redisson/redisson.xsd">

    <!-- 构造JedisConnectionFactory实例,注入池配置poolConfig和哨兵配置sentinelConfig-->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <!--<constructor-arg index="0" ref="redisSentinelConfiguration"/>-->
        <!--<constructor-arg index="1" ref="jedisPoolConfig"/>-->
        <constructor-arg ref="redisSentinelConfiguration"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
        <property name="database" value="${redis.database}"/>
    </bean>

    <!-- 配置JedisPoolConfig-->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="minIdle" value="${redis.minIdle}"/>
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
        <property name="testWhileIdle" value="${redis.testWhileIdle}"/>
        <property name="testOnReturn" value="${redis.testOnReturn}"/>
        <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"/>
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
    </bean>

    <!-- 配置RedisSentinelConfiguration-->
    <bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
        <property name="master">
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <property name="name" value="${redis.masterName}"/>
            </bean>
        </property>
        <property name="sentinels">
            <set>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg index="0" value="${redis.host}"/>
                    <constructor-arg index="1" value="${redis.port}"/>
                </bean>
            </set>
        </property>
    </bean>

    <!-- 用于缓存对象-->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <!-- key -->
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="hashKeySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <!-- value -->
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>
        <property name="hashValueSerializer">
            <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
        </property>
    </bean>

    <!-- 用于缓存字符串-->
    <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
    </bean>

    <redisson:client id="redissonClient">
        <!--master-name为redis的主节点名称-->
        <redisson:sentinel-servers master-name="mymaster">
            <!-- 可以配置多个 -->
            <redisson:sentinel-address value="redis://172.17.46.11:26379" />
        </redisson:sentinel-servers>
    </redisson:client>
</beans>

使用

    @Autowired
    @Lazy
    private RedissonClient redissonClient;
   /**
     * @param key 具体键值
     * @return 锁对象
     */
    public RReadWriteLock getLock(String key) {
        return redissonClient.getReadWriteLock(key);
    }

集群配置cluster

纯java代码

//创建配置
Config config = new Config();
//指定使用集群部署方式
config.useClusterServers()
    // 集群状态扫描间隔时间,单位是毫秒
    .setScanInterval(2000)
    //cluster方式至少6个节点(3主3从,3主做sharding,3从用来保证主宕机后可以高可用)
    .addNodeAddress("redis://127.0.0.1:6379" )
    .addNodeAddress("redis://127.0.0.1:6380")
    .addNodeAddress("redis://127.0.0.1:6381")
    .addNodeAddress("redis://127.0.0.1:6382")
    .addNodeAddress("redis://127.0.0.1:6383")
    .addNodeAddress("redis://127.0.0.1:6384");
//创建客户端(发现这一非常耗时,基本在2秒-4秒左右)
RedissonClient redisson = Redisson.create(config);  

//首先获取redis中的key-value对象,key不存在没关系
RBucket<String> keyObject = redisson.getBucket("key");
//如果key存在,就设置key的值为新值value
//如果key不存在,就设置key的值为value
keyObject.set("value");  

//最后关闭RedissonClient
redisson.shutdown();

spring整合redisson配置方式

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:redisson="http://redisson.org/schema/redisson"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://redisson.org/schema/redisson http://redisson.org/schema/redisson/redisson.xsd">

    <!--  Redis 连接池配置 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="minIdle" value="${redis.minIdle}"/>
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
        <property name="testWhileIdle" value="${redis.testWhileIdle}"/>
        <property name="testOnReturn" value="${redis.testOnReturn}"/>

        <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"/>
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
        <property name="timeBetweenEvictionRunsMillis" value="30000"/>
    </bean>

    <!-- jedisCluster 配置 -->
    <!-- 自定义的工厂类,实现了FactoryBean<JedisCluster>接口 -->
    <bean id="jedisCluster" class="com.xxxxx.JedisClusterFactory">
        <!-- address: 集群配置 -->
        <property name="address" value="${redisColony.host}"/>
        <!-- timeout: 连接超时时间 -->
        <property name="timeout" value="100000"/>
        <!-- maxRedirections: 最大重定向 -->
        <property name="maxRedirections" value="5"/>
        <!-- 连接池 -->
        <property name="genericObjectPoolConfig" ref="poolConfig"/>
    </bean>

    <!--redisson的实例 -->
    <redisson:client id="redissonClient">
        <redisson:cluster-servers>
            <!-- 节点地址同redis集群的节点 -->
            <redisson:node-address value="${redisColony.host1}"/>
            <redisson:node-address value="${redisColony.host2}"/>
            <redisson:node-address value="${redisColony.host3}"/>
            <redisson:node-address value="${redisColony.host4}"/>
            <redisson:node-address value="${redisColony.host5}"/>
            <redisson:node-address value="${redisColony.host6}"/>
        </redisson:cluster-servers>
    </redisson:client>
</beans>

properties文件

redisColony.host = 172.17.46.11:36379,172.17.46.11:36381,172.17.45.12:36379,172.17.45.12:36381,172.17.45.13:36379,172.17.45.13:36381
redis.timeOut = 100000
redis.redirection = 5
redisColony.host1 = redis://172.17.46.11:36379
redisColony.host2 = redis://172.17.46.11:36381
redisColony.host3 = redis://172.17.45.12:36379
redisColony.host4 = redis://172.17.45.12:36381
redisColony.host5 = redis://172.17.45.13:36379
redisColony.host6 = redis://172.17.45.13:36381

使用方式与哨兵配置方式相同,@Autowired注入即可

主从部署方式(master/slave)

纯java代码

    //创建配置
    Config config = new Config();
    //指定使用主从部署方式
    config.useMasterSlaveServers()
        //设置redis主节点
        .setMasterAddress("redis://127.0.0.1:6379")
        //设置redis从节点
        .addSlaveAddress("redis://127.0.0.1:6380", "redis://127.0.0.1:6381");
    //创建客户端(发现这一非常耗时,基本在2秒-4秒左右)
    RedissonClient redisson = Redisson.create(config);  

    //首先获取redis中的key-value对象,key不存在没关系
    RBucket<String> keyObject = redisson.getBucket("key");
    //如果key存在,就设置key的值为新值value
    //如果key不存在,就设置key的值为value
    keyObject.set("value");  

    //最后关闭RedissonClient
    redisson.shutdown();  

spring整合redisson.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:redisson="http://redisson.org/schema/redisson"
    xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://redisson.org/schema/redisson
       http://redisson.org/schema/redisson/redisson.xsd">
    <redisson:client id="masterSlave">
        <redisson:master-slave-servers master-address="redis://127.0.0.1:6379">
            <redisson:slave-address value="redis://127.0.0.1:6380" />
            <redisson:slave-address value="redis://127.0.0.1:6381" />
        </redisson:master-slave-servers>
    </redisson:client>
</beans>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决spring data redis的那些坑

    目录 spring data redis的那些坑 1. 使用lua脚本,返回类型解析错误 2. spring redis基于lettuce配置Client必须显示调用 spring data redis 的优缺点 spring data redis的那些坑 spring 的IOC很少有bug,AOPbug开始多起来,到了它的一些"玩具"一样的组件,bug无处不在.而且跟一般的开源框架不同,在github上你报告issue,会被"这不是一个bug"强行关闭.开一博文记

  • 详解java之redis篇(spring-data-redis整合)

    1,利用spring-data-redis整合 项目使用的pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/ma

  • Spring使用redis遇到的问题及解决方案

    本人在spring中使用redis作为缓存时,遇到两个坑,现在记录如下,算是作为自己的备忘吧,文笔不好,望大家见谅: 一.配置文件 <!-- 加载Properties文件 --> <bean id="configurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locatio

  • Spring-data-redis操作redis知识总结

    什么是spring-data-redis spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis,jredis也都属于redis的java客户端,他们之间是无法兼容的,如果你在一个项目中使用了jedis,然后后来决定弃用掉改用jdbc-redis就比较麻烦了,spring-data-redis提供了redis的java客

  • 使用Spring Data Redis实现数据缓存的方法

    引言 目前很多系统为了解决数据读写的性能瓶颈,在系统架构设计中使用Redis实现缓存,Spring框架为了让开发人员更加方便快捷的使用Redis实现缓存,对Redis的操作进行了包装. 0.缓存 个人理解的缓存是指用于存储频繁使用的数据的空间,关注点是存储数据的空间和使用频繁的数据.缓存技术,简单的说就是先从缓存中查询数据是否存在,存在则直接返回,不存在再执行相应的操作获取数据,并将获取的数据存储到缓存中,它是一种提升系统性能的重要方法. 1.Redis Redis是一个开源的.内存存储key-

  • 解决spring集成redisson踩过的坑

    目录 spring集成redisson踩过的坑 第一坑就是版本兼容问题 第二个坑是设置密码问题 spring整合redisson配置 配置方式 单节点配置standalone 哨兵配置sentinel 集群配置cluster 主从部署方式(master/slave) spring集成redisson踩过的坑 我用spring的xml集成一直报错,所以只能选择注解方式: @Configuration public class RedissionConfig { Logger log = Logge

  • 解决spring boot2集成activiti6踩过的坑

    spring boot2集成activiti6踩过的坑 1.activiti中的mybaitis版本冲突 错误信息 Caused by: java.lang.NoSuchFieldError: INSTANCE at com.baomidou.mybatisplus.MybatisMapperAnnotationBuilder.parseStatement(MybatisMapperAnnotationBuilder.java:332) ~[mybatis-plus-core-2.3.jar:?

  • 解决springboot集成rocketmq关于tag的坑

    springboot集成rocketmq关于tag的坑 新项目使用springboot的若依框架集成rocketmq,选择集成RocketMQTemplate这种方式实现消息的发送和接收. 1.客户端发送代码 此处回调方法里有些业务不用关注,只关心发送方法 @Component public class RocketMqHelper { Logger logger = LoggerFactory.getLogger(RocketMqHelper.class); @Resource private

  • Intellij IDEA 旗舰版创建 Spring MVC 项目踩过的坑

    学生可以申请Intellij IDEA旗舰版免费试用!我终于可以暂时不用折腾社区版啦啦啦啦啦!!! IDEA旗舰版可以直接创建Spring MVC项目,但创建后的项目并不是直接就可以运行,还需要进行一些配置. 一.创建项目 打开Intellij IDEA,创建项目(CreateNewProject): 在左边选择 "Spring",然后右边勾选"Spring MVC",下面的"WebApplication"应该会自动勾选,如果没有,则手动勾选上:

  • 解决spring boot 配置文件后缀的一个坑

    目录 spring boot 配置文件后缀的一个坑 spring boot配置文件支持 properties和yml 从新创建一个demo试试 spring boot 配置文件后缀导致启动失败 错误 错误原因 解决方案 spring boot 配置文件后缀的一个坑 Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot d

  • 解决线程并发redisson使用遇到的坑

    线程并发redisson的坑 背景 因为业务上的一个购买需求,需要对库存进行行程保护,防止超卖的出现(我们不是电商公司),经过调研,最终选择使用Redission来进行控制. 主要因为Redission丰富的API,开源框架,已经被广泛应用于实际生产环境. 问题描述 当我们使用Ression中Lock.lock()方法之后,如果存在线程并发常见情况下,会出现如下异常: java.lang.IllegalMonitorStateException: attempt to unlock lock,

  • 解决spring boot网关gateway导致的坑,无法下载文件问题

    话不多说,直接上图 接口返回内容,浏览器显示PDF文档.但是输入接口地址以后一直提示这个 核对接口路径也是正确的,并且没有报错提示,后面发现是网关没有配置放行路径,于是进行了补充 所以 以后对于前端请求统一由网关进行配置处理的,一定要对于静态资源合理配置,或者对于放行接口要统一补充进来(最后统一一下下接口前缀名称,这样就只需要写一个了) 下面我再说一个坑: spring cloud gateway启动报错:org.springframework.cloud.gateway.config.Gate

  • 解决Spring boot 整合Junit遇到的坑

    目录 这是我在使用springboot整合Junit的时候遇到的坑 1.在pom.xml中添加junit环境的依赖 2.在src/test/java下建立测试类 3.自己编写的启动类 SpringBoot 整合Junit测试注入Bean失败 问题描述 下面是我的测试类 解决过程 以下是我的启动类 总结 这是我在使用springboot整合Junit的时候遇到的坑 1.在pom.xml中添加junit环境的依赖 <dependency> <groupId>org.springfram

  • spring整合redisson开启缓存方式

    目录 spring整合redisson开启缓存 @Cacheable @CachePut @CacheEvict spring集成redisson踩过的坑 spring整合redisson开启缓存 先来了解几个注解: @Cacheable 表明所修饰的方法是可以缓存的:当第一次调用这个方法时,它的结果会被缓存下来,在缓存的有效时间内,以后访问这个方法都直接返回缓存结果,不再执行方法中的代码段. 这个注解可以用condition属性来设置条件,如果不满足条件,就不使用缓存能力,直接执行方法. 可以

  • Spring集成Swagger常见错误及解决办法

    概览 在当下几乎所有的公司都采用了前后端分离的开发模式,Swagger作为了在API在线文档工具,几乎是后端开发的必备组件,最近公司的有个项目,在项目启动和打开Swagger页面时候,后端产生了大量的异常日志,虽然不影响现在的正常启动,不过,每次看到大量的异常日志,对于有代码洁癖的我,不能忍.于是乎今天抽了个时间把以下这些问题解决了,解决后再看日志,简直不能再爽歪歪啦~ 下面对问题以及解决的办法做个记录. 问题一 异常描述:No enum constant org.springframework

随机推荐