Redis和springboot 整合redisUtil类的示例代码

一、引入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二、在application.yml 配置redis服务器

spring:
 # 环境 dev|test|prod
 profiles:
  active: dev
 servlet:
  multipart:
   max-file-size: 100MB
   max-request-size: 100MB
   enabled: true
 redis:
  database: 0      # Redis服务器数据库
  host: 192.168.6.27  # Redis服务器地址
  port: 6379      # Redis服务器连接端口
  password: 123456   # Redis服务器连接密码(默认为空)
  timeout: 6000ms    # 连接超时时间(毫秒)
  jedis:
   pool:
    max-active: 200  # 连接池最大连接数(使用负值表示没有限制)
    max-wait: -1   # 连接池最大阻塞等待时间(使用负值表示没有限制)
    max-idle: 10   # 连接池中的最大空闲连接
    min-idle: 0    # 连接池中的最小空闲连接

三、写一个redis配置类

(1)聊聊RedisTemplate的自动配置 其实现在就可以在代码中注入RedisTemplate,为啥可以直接注入呢?先看下源码吧。下图为RedisAutoConfiguration类中的截图,为了防止图片失效,代码也贴上。

通过源码可以看出,SpringBoot自动帮我们在容器中生成了一个RedisTemplate和一个StringRedisTemplate。但是,这个RedisTemplate的泛型是<Object,Object>,写代码不方便,需要写好多类型转换的代码;我们需要一个泛型为<String,Object>形式的RedisTemplate。并且,这个RedisTemplate没有设置数据存在Redis时,key及value的序列化方式。
看到这个@ConditionalOnMissingBean注解后,就知道如果Spring容器中有了RedisTemplate对象了,这个自动配置的RedisTemplate不会实例化。因此我们可以直接自己写个配置类,配置RedisTemplate。(2)既然自动配置不好用,就重新配置一个RedisTemplate

包的结构如下

代码如下:

package com.yux.redisdemo.redis;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.PropertyAccessor;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
15
 * redis配置类
16
 * @author YUX
17
 * @date  2018年6月6日
18
 *
19
 */

@Configuration
public class RedisConfig {

  @Bean
  @SuppressWarnings("all")
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

    RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();

    template.setConnectionFactory(factory);

    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

    ObjectMapper om = new ObjectMapper();

    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

    jackson2JsonRedisSerializer.setObjectMapper(om);

    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

    // key采用String的序列化方式

    template.setKeySerializer(stringRedisSerializer);

    // hash的key也采用String的序列化方式

    template.setHashKeySerializer(stringRedisSerializer);

    // value序列化方式采用jackson

    template.setValueSerializer(jackson2JsonRedisSerializer);

    // hash的value序列化方式采用jackson
    template.setHashValueSerializer(jackson2JsonRedisSerializer);

    template.afterPropertiesSet();

    return template;

  }

}

 四、编写一个RedisUtil类

package com.yux.redisdemo.redis;

import java.util.List;

import java.util.Map;

import java.util.Set;

import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.stereotype.Component;

import org.springframework.util.CollectionUtils;

/**
14
 * Redis工具类
15
 * @author YUX
16
 * @date  2018年6月7日
17
 */

@Component
public final class RedisUtil {

  @Autowired

  private RedisTemplate<String, Object> redisTemplate;

  // =============================common============================

  /**
   * 26
   * 指定缓存失效时间
   * 27
   *
   * @param key 键
   *       28
   * @param time 时间(秒)
   *       29
   * @return 30
   */

  public boolean expire(String key, long time) {

    try {

      if (time > 0) {

        redisTemplate.expire(key, time, TimeUnit.SECONDS);

      }

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 44
   * 根据key 获取过期时间
   * 45
   *
   * @param key 键 不能为null
   *      46
   * @return 时间(秒) 返回0代表为永久有效
   * 47
   */

  public long getExpire(String key) {

    return redisTemplate.getExpire(key, TimeUnit.SECONDS);

  }

  /**
   * 53
   * 判断key是否存在
   * 54
   *
   * @param key 键
   *      55
   * @return true 存在 false不存在
   * 56
   */

  public boolean hasKey(String key) {

    try {

      return redisTemplate.hasKey(key);

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 67
   * 删除缓存
   * 68
   *
   * @param key 可以传一个值 或多个
   *      69
   */

  @SuppressWarnings("unchecked")

  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));

      }

    }

  }

  // ============================String=============================

  /**
   * 83
   * 普通缓存获取
   * 84
   *
   * @param key 键
   *      85
   * @return 值
   * 86
   */

  public Object get(String key) {

    return key == null ? null : redisTemplate.opsForValue().get(key);

  }

  /**
   * 92
   * 普通缓存放入
   * 93
   *
   * @param key  键
   *       94
   * @param value 值
   *       95
   * @return true成功 false失败
   * 96
   */

  public boolean set(String key, Object value) {

    try {

      redisTemplate.opsForValue().set(key, value);

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 109
   * 普通缓存放入并设置时间
   * 110
   *
   * @param key  键
   *       111
   * @param value 值
   *       112
   * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
   *       113
   * @return true成功 false 失败
   * 114
   */

  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;

    }

  }

  /**
   * 130
   * 递增
   * 131
   *
   * @param key  键
   *       132
   * @param delta 要增加几(大于0)
   *       133
   * @return 134
   */

  public long incr(String key, long delta) {

    if (delta < 0) {

      throw new RuntimeException("递增因子必须大于0");

    }

    return redisTemplate.opsForValue().increment(key, delta);

  }

  /**
   * 143
   * 递减
   * 144
   *
   * @param key  键
   *       145
   * @param delta 要减少几(小于0)
   *       146
   * @return 147
   */

  public long decr(String key, long delta) {

    if (delta < 0) {

      throw new RuntimeException("递减因子必须大于0");

    }

    return redisTemplate.opsForValue().increment(key, -delta);

  }

  // ================================Map=================================

  /**
   * 157
   * HashGet
   * 158
   *
   * @param key 键 不能为null
   *       159
   * @param item 项 不能为null
   *       160
   * @return 值
   * 161
   */

  public Object hget(String key, String item) {

    return redisTemplate.opsForHash().get(key, item);

  }

  /**
   * 167
   * 获取hashKey对应的所有键值
   * 168
   *
   * @param key 键
   *      169
   * @return 对应的多个键值
   * 170
   */

  public Map<Object, Object> hmget(String key) {

    return redisTemplate.opsForHash().entries(key);

  }

  /**
   * 176
   * HashSet
   * 177
   *
   * @param key 键
   *      178
   * @param map 对应多个键值
   *      179
   * @return true 成功 false 失败
   * 180
   */

  public boolean hmset(String key, Map<String, Object> map) {

    try {

      redisTemplate.opsForHash().putAll(key, map);

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 192
   * HashSet 并设置时间
   * 193
   *
   * @param key 键
   *       194
   * @param map 对应多个键值
   *       195
   * @param time 时间(秒)
   *       196
   * @return true成功 false失败
   * 197
   */

  public boolean hmset(String key, Map<String, Object> map, long time) {

    try {

      redisTemplate.opsForHash().putAll(key, map);

      if (time > 0) {

        expire(key, time);

      }

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 212
   * 向一张hash表中放入数据,如果不存在将创建
   * 213
   *
   * @param key  键
   *       214
   * @param item 项
   *       215
   * @param value 值
   *       216
   * @return true 成功 false失败
   * 217
   */

  public boolean hset(String key, String item, Object value) {

    try {

      redisTemplate.opsForHash().put(key, item, value);

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 229
   * 向一张hash表中放入数据,如果不存在将创建
   * 230
   *
   * @param key  键
   *       231
   * @param item 项
   *       232
   * @param value 值
   *       233
   * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
   *       234
   * @return true 成功 false失败
   * 235
   */

  public boolean hset(String key, String item, Object value, long time) {

    try {

      redisTemplate.opsForHash().put(key, item, value);

      if (time > 0) {

        expire(key, time);

      }

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 250
   * 删除hash表中的值
   * 251
   *
   * @param key 键 不能为null
   *       252
   * @param item 项 可以使多个 不能为null
   *       253
   */

  public void hdel(String key, Object... item) {

    redisTemplate.opsForHash().delete(key, item);

  }

  /**
   * 259
   * 判断hash表中是否有该项的值
   * 260
   *
   * @param key 键 不能为null
   *       261
   * @param item 项 不能为null
   *       262
   * @return true 存在 false不存在
   * 263
   */

  public boolean hHasKey(String key, String item) {

    return redisTemplate.opsForHash().hasKey(key, item);

  }

  /**
   * 269
   * hash递增 如果不存在,就会创建一个 并把新增后的值返回
   * 270
   *
   * @param key 键
   *       271
   * @param item 项
   *       272
   * @param by  要增加几(大于0)
   *       273
   * @return 274
   */

  public double hincr(String key, String item, double by) {

    return redisTemplate.opsForHash().increment(key, item, by);

  }

  /**
   * 280
   * hash递减
   * 281
   *
   * @param key 键
   *       282
   * @param item 项
   *       283
   * @param by  要减少记(小于0)
   *       284
   * @return 285
   */

  public double hdecr(String key, String item, double by) {

    return redisTemplate.opsForHash().increment(key, item, -by);

  }

  // ============================set=============================

  /**
   * 292
   * 根据key获取Set中的所有值
   * 293
   *
   * @param key 键
   *      294
   * @return 295
   */

  public Set<Object> sGet(String key) {

    try {

      return redisTemplate.opsForSet().members(key);

    } catch (Exception e) {

      e.printStackTrace();

      return null;

    }

  }

  /**
   * 306
   * 根据value从一个set中查询,是否存在
   * 307
   *
   * @param key  键
   *       308
   * @param value 值
   *       309
   * @return true 存在 false不存在
   * 310
   */

  public boolean sHasKey(String key, Object value) {

    try {

      return redisTemplate.opsForSet().isMember(key, value);

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 321
   * 将数据放入set缓存
   * 322
   *
   * @param key  键
   *        323
   * @param values 值 可以是多个
   *        324
   * @return 成功个数
   * 325
   */

  public long sSet(String key, Object... values) {

    try {

      return redisTemplate.opsForSet().add(key, values);

    } catch (Exception e) {

      e.printStackTrace();

      return 0;

    }

  }

  /**
   * 336
   * 将set数据放入缓存
   * 337
   *
   * @param key  键
   *        338
   * @param time  时间(秒)
   *        339
   * @param values 值 可以是多个
   *        340
   * @return 成功个数
   * 341
   */

  public long sSetAndTime(String key, long time, Object... values) {

    try {

      Long count = redisTemplate.opsForSet().add(key, values);

      if (time > 0)

        expire(key, time);

      return count;

    } catch (Exception e) {

      e.printStackTrace();

      return 0;

    }

  }

  /**
   * 355
   * 获取set缓存的长度
   * 356
   *
   * @param key 键
   *      357
   * @return 358
   */

  public long sGetSetSize(String key) {

    try {

      return redisTemplate.opsForSet().size(key);

    } catch (Exception e) {

      e.printStackTrace();

      return 0;

    }

  }

  /**
   * 369
   * 移除值为value的
   * 370
   *
   * @param key  键
   *        371
   * @param values 值 可以是多个
   *        372
   * @return 移除的个数
   * 373
   */

  public long setRemove(String key, Object... values) {

    try {

      Long count = redisTemplate.opsForSet().remove(key, values);

      return count;

    } catch (Exception e) {

      e.printStackTrace();

      return 0;

    }

  }

  // ===============================list=================================

  /**
   * 386
   * 获取list缓存的内容
   * 387
   *
   * @param key  键
   *       388
   * @param start 开始
   *       389
   * @param end  结束 0 到 -1代表所有值
   *       390
   * @return 391
   */

  public List<Object> lGet(String key, long start, long end) {

    try {

      return redisTemplate.opsForList().range(key, start, end);

    } catch (Exception e) {

      e.printStackTrace();

      return null;

    }

  }

  /**
   * 402
   * 获取list缓存的长度
   * 403
   *
   * @param key 键
   *      404
   * @return 405
   */

  public long lGetListSize(String key) {

    try {

      return redisTemplate.opsForList().size(key);

    } catch (Exception e) {

      e.printStackTrace();

      return 0;

    }

  }

  /**
   * 416
   * 通过索引 获取list中的值
   * 417
   *
   * @param key  键
   *       418
   * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
   *       419
   * @return 420
   */

  public Object lGetIndex(String key, long index) {

    try {

      return redisTemplate.opsForList().index(key, index);

    } catch (Exception e) {

      e.printStackTrace();

      return null;

    }

  }

  /**
   * 431
   * 将list放入缓存
   * 432
   *
   * @param key  键
   *       433
   * @param value 值
   *       434
   * @param time 时间(秒)
   *       435
   * @return 436
   */

  public boolean lSet(String key, Object value) {

    try {

      redisTemplate.opsForList().rightPush(key, value);

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 将list放入缓存
   *
   * @param key  键
   * @param value 值
   * @param time 时间(秒)
   * @return
   */

  public boolean lSet(String key, Object value, long time) {

    try {

      redisTemplate.opsForList().rightPush(key, value);

      if (time > 0)

        expire(key, time);

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 467
   * 将list放入缓存
   * 468
   *
   * @param key  键
   *       469
   * @param value 值
   *       470
   * @param time 时间(秒)
   *       471
   * @return 472
   */

  public boolean lSet(String key, List<Object> value) {

    try {

      redisTemplate.opsForList().rightPushAll(key, value);

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 484
   * 将list放入缓存
   * 485
   * <p>
   * 486
   *
   * @param key  键
   *       487
   * @param value 值
   *       488
   * @param time 时间(秒)
   *       489
   * @return 490
   */

  public boolean lSet(String key, List<Object> value, long time) {

    try {

      redisTemplate.opsForList().rightPushAll(key, value);

      if (time > 0)

        expire(key, time);

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 504
   * 根据索引修改list中的某条数据
   * 505
   *
   * @param key  键
   *       506
   * @param index 索引
   *       507
   * @param value 值
   *       508
   * @return 509
   */

  public boolean lUpdateIndex(String key, long index, Object value) {

    try {

      redisTemplate.opsForList().set(key, index, value);

      return true;

    } catch (Exception e) {

      e.printStackTrace();

      return false;

    }

  }

  /**
   * 521
   * 移除N个值为value
   * 522
   *
   * @param key  键
   *       523
   * @param count 移除多少个
   *       524
   * @param value 值
   *       525
   * @return 移除的个数
   * 526
   */

  public long lRemove(String key, long count, Object value) {

    try {

      Long remove = redisTemplate.opsForList().remove(key, count, value);

      return remove;

    } catch (Exception e) {

      e.printStackTrace();

      return 0;

    }

  }
}

五、在service中注入RedisUtil可用

到此这篇关于Redis和springboot 整合redisUtil类的示例代码的文章就介绍到这了,更多相关Redis和springboot 整合redisUtil类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot整合redis集群过程解析

    简介 在springboot使用搭建好的redis集群 添加redis和连接池依赖 <!--redis连接池 start--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!--redis连接池 end--> <!--redis start-

  • Scala 操作Redis使用连接池工具类RedisUtil

    本文介绍了Scala 操作Redis,分享给大家,具体如下: package com.zjw.util import java.util import org.apache.commons.pool2.impl.GenericObjectPoolConfig import org.apache.logging.log4j.scala.Logging import redis.clients.jedis.{Jedis, JedisPool, Response} import redis.clien

  • SpringBoot 整合 Lettuce Redis的实现方法

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 Spring Boot 除了支持常见的ORM框架外,更是对常用的中间件提供了非常好封装,随着Spring Boot2.x的到来,支持的组件越来越丰富,也越来越成熟,其中对Redis的支持不仅仅是丰富了它的API,更是替换掉底层Jedis的依赖,取而代之换成了Le

  • 基于springboot和redis实现单点登录

    本文实例为大家分享了基于springboot和redis实现单点登录的具体代码,供大家参考,具体内容如下 1.具体的加密和解密方法 package com.example.demo.util; import com.google.common.base.Strings; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.KeyG

  • SpringBoot中Shiro缓存使用Redis、Ehcache的方法

    SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这shiro基础之上的补充内容 第一种:Redis缓存,将数据存储到redis 并且开启session存入redis中. 引入pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifac

  • Redis和springboot 整合redisUtil类的示例代码

    一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 二.在application.yml 配置redis服务器 spring: # 环境 dev|test|prod profiles: active: dev servle

  • springboot整合mongodb changestream的示例代码

    目录 前言 ChangeStream介绍 环境准备 Java客户端操作changestream 1.引入maven依赖 2.测试类核心代码 下面来看看具体的整合步骤 1.引入核心依赖 2.核心配置文件 3.编写实体类,映射comment集合中的字段 4.编写一个服务类 5.编写一个接口 6.接下来,只需要依次添加下面3个配置类即可 典型应用场景 数据迁移 应用监控 对接大数据应用 前言 changestream是monggodb的3.6版本之后出现的一种基于collection(数据库集合)的变

  • Springboot整合mqtt服务的示例代码

    首先在pom文件里引入mqtt的依赖配置 <!--mqtt--> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.4</version> </dependency> 其次在springboot 的配置yml文件,配

  • springboot整合kaptcha验证码的示例代码

    前言: 关于kaptcha简介以及spring整合kaptcha,我在另一篇文章中已详细讲解,请参考:spring整合kaptcha验证码. 本文将介绍springboot整合kaptcha的两种方式. 开发工具及技术: 1.idea 2017 2.springboot 2.0.2 3.kaptcha 正式开始: 方式一:通过kaptcha.xml配置 1.用idea新建一个spring Initializr 2.添加kaptcha的依赖: <!-- kaptcha验证码 --> <de

  • SpringBoot整合Redis实现消息发布与订阅的示例代码

    当我们在多个集群应用中使用到本地缓存时,在数据库数据得到更新后,为保持各个副本当前被修改的数据与数据库数据保持同步,在数据被操作后向其他集群应用发出被更新数据的通知,使其删除;下次当其他应用请求该被更新的数据时,应用会到数据库去取,也就是最新的数据,从而使得被更新数据与数据库保持同步! 能实现发送与接收信息的中间介有很多,比如:RocketMQ.RabbitMQ.ActiveMQ.Kafka等,本次主要简单介绍Redis的推送与订阅功能并集成Spring Boot的实现. 1.添加SpringB

  • SpringBoot整合Redis正确的实现分布式锁的示例代码

    前言 最近在做分块上传的业务,使用到了Redis来维护上传过程中的分块编号. 每上传完成一个分块就获取一下文件的分块集合,加入新上传的编号,手动接口测试下是没有问题的,前端通过并发上传调用就出现问题了,并发的get再set,就会存在覆盖写现象,导致最后的分块数据不对,不能触发分块合并请求. 遇到并发二话不说先上锁,针对执行代码块加了一个JVM锁之后问题就解决了. 仔细一想还是不太对,项目是分布式部署的,做了负载均衡,一个节点的代码被锁住了,请求轮询到其他节点还是可以进行覆盖写,并没有解决到问题啊

  • SpringBoot整合JWT的实现示例

    目录 一. JWT简介 二. Java实现JWT(SpringBoot方式整合) JWT总结 一. JWT简介 1. 什么是JWT? JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准. 它将用户信息加密到token里,服务器不保存任何用户信息.服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证:应用场景如用户登录.JWT详细讲解请见 github:https://github.com/jwtk/jjwt 2. 为什么使用JWT

  • Springboot使用redis实现接口Api限流的示例代码

    前言 该篇介绍的内容如题,就是利用redis实现接口的限流(  某时间范围内 最大的访问次数 ) . 正文 惯例,先看下我们的实战目录结构: 首先是pom.xml 核心依赖: <!--用于redis数据库连接--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId>

  • springboot整合spring-retry的实现示例

    1.背景 本系统调用外围系统接口(http+json),但是发现有时外围系统服务不太稳定,有时候会出现返回一串xml或者gateway bad的信息,导致调用失败,基于这一原因,采用基于springboot,整合spring-retry的重试机制到系统工程中,demo已经放到github上. 2.解决方案 简要说明:demo工程基于springboot,为了方便验证,采用swagger进行测试验证. 2.1 pom文件 <?xml version="1.0" encoding=&

  • Springboot+Redis实现API接口限流的示例代码

    添加Redis的jar包. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 在application.yml中配置redis spring: ## Redis redis: database: 0 host: 127.0.0.1 p

随机推荐