首页 > 数据库 >SpringBoot3整合Redission

SpringBoot3整合Redission

时间:2025-01-10 13:22:43浏览次数:1  
标签:value return String param Redission 整合 SpringBoot3 key public

1.依赖

<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson-spring-boot-starter</artifactId>
  <version>3.25.0</version>
</dependency>

2.yml

spring:
  data:
    redis:
      # 数据库
      database: 0
      # 主机
      host: 10.43.119.175
      # 端口
      port: 6379
      # 密码
      password: 123456
      # 读超时
      timeout: 5s
      # 连接超时
      connect-timeout: 5s

  redis:
    redisson:
      # 编码。默认值: org.redisson.codec.JsonJacksonCodec
      codec: org.redisson.codec.JsonJacksonCodec
      # 线程池数量。默认值: 当前处理核数量 * 2
      threads: 16
      # Netty线程池数量。默认值: 当前处理核数量 * 2
      nettyThreads: 32
      # 传输模式。默认值: NIO
      transportMode: "NIO"
      # 监控锁的看门狗超时,单位:毫秒。默认值: 30000
      lockWatchdogTimeout: 30000
      # 是否保持订阅发布顺序。默认值: true
      keepPubSubOrder: true
      # Redisson 单实例配置
      singleServerConfig:
        # 节点地址。格式:redis://host:port
        address: "redis://10.43.119.175:6379"
        # 密码。默认值: null
        password: 123456
        # 数据库编号。默认值: 0
        database: 0
        # 客户端名称(在Redis节点里显示的客户端名称)。默认值: null
        clientName: null
        # 连接超时,单位:毫秒。默认值: 10000
        connectTimeout: 10000
        # 命令等待超时,单位:毫秒。默认值: 3000
        timeout: 3000
        # 命令失败重试次数。默认值: 3
        retryAttempts: 3
        # 命令重试发送时间间隔,单位:毫秒。默认值: 1500
        retryInterval: 1500
        # 最小空闲连接数。默认值: 32
        connectionMinimumIdleSize: 24
        # 连接池大小。默认值: 64
        connectionPoolSize: 64
        # 单个连接最大订阅数量。默认值: 5
        subscriptionsPerConnection: 5
        # 发布和订阅连接的最小空闲连接数。默认值: 1
        subscriptionConnectionMinimumIdleSize: 1
        # 发布和订阅连接池大小。默认值: 50
        subscriptionConnectionPoolSize: 50
        # DNS监测时间间隔,单位:毫秒。默认值: 5000
        dnsMonitoringInterval: 5000
        # 连接空闲超时,单位:毫秒。默认值: 10000
        idleConnectionTimeout: 10000

3.工具类

/**
 * Redis工具类
 */
@Component
@RequiredArgsConstructor(onConstructor_ = @Autowired)
public class RedisService {

    private final RedissonClient redissonClient;

    // ============================= String类型操作 ============================

    /**
     * 将值存储到Redis中
     *
     * @param key   键
     * @param value 值
     */
    public <T> void setString(String key, T value) {
        RBucket<T> bucket = redissonClient.getBucket(key);
        bucket.set(value);
    }

    /**
     * 将值存储到Redis中
     *
     * @param key      键
     * @param value    值
     * @param timeout  过期时间
     * @param timeUnit 时间单位
     */
    public <T> void setString(String key, T value, long timeout, TimeUnit timeUnit) {
        RBucket<T> bucket = redissonClient.getBucket(key);
        bucket.set(value, timeout, timeUnit);
    }

    /**
     * 根据键获取Redis中的值
     *
     * @param key 键
     * @return 值
     */
    public <T> T getString(String key) {
        RBucket<T> bucket = redissonClient.getBucket(key);
        return bucket.get();
    }

    // ============================= Hash类型操作 ============================

    /**
     * 将值存储到Redis中
     *
     * @param key   键
     * @param field hash键
     * @param value 值
     */
    public <T> boolean addToHash(String key, Object field, T value) {
        RMap<Object, T> hash = redissonClient.getMap(key);
        return hash.fastPut(field, value);
    }

    /**
     * 将值存储到Redis中
     *
     * @param key      键
     * @param field    hash键
     * @param value    值
     * @param timeout  过期时间
     * @param timeUnit 时间单位
     */
    public <T> boolean addToHash(String key, Object field, T value, long timeout, ChronoUnit timeUnit) {
        RMap<Object, T> hash = redissonClient.getMap(key);
        boolean fastPut = hash.fastPut(field, value);
        boolean expire = hash.expire(Instant.now().plus(timeout, timeUnit));
        return fastPut && expire;
    }

    /**
     * 根据键和Hash键获取Redis中的值
     *
     * @param key   键
     * @param field hash键
     * @return 值
     */
    public <T> T getFromHash(String key, Object field) {
        RMap<Object, T> hash = redissonClient.getMap(key);
        return hash.get(field);
    }

    /**
     * 根据键获取Redis中的值
     *
     * @param key 键
     * @return 值
     */
    public <T> Map<Object, T> getFromHash(String key) {
        RMap<Object, T> hash = redissonClient.getMap(key);
        return hash.readAllMap();
    }

    /**
     * 根据键和Hash键更新Redis中的值
     *
     * @param key   键
     * @param field hash键
     * @param value 值
     * @return 更新成功返回true,否则返回false
     */
    public <T> boolean updateToHash(String key, Object field, T value) {
        RMap<Object, T> hash = redissonClient.getMap(key);
        return hash.fastReplace(field, value);
    }

    /**
     * 根据Key,删除Hash类型的数据
     *
     * @param key      键
     * @param hashKeys hash键
     * @return 删除成功的数量
     */
    public <T> long removeFromHash(String key, T... hashKeys) {
        RMap<Object, T> hash = redissonClient.getMap(key);
        return hash.fastRemove(hashKeys);
    }

        // ============================= List类型操作 ============================

    /**
     * 向List数据类型中添加值
     *
     * @param key   键
     * @param value 值
     */
    public <T> boolean addToList(String key, T value) {
        RList<T> list = redissonClient.getList(key);
        return list.add(value);
    }

    /**
     * 向List数据类型中添加值
     *
     * @param key   键
     * @param value 值
     */
    public <T> boolean addToList(String key, List<T> value) {
        RList<T> list = redissonClient.getList(key);
        return list.addAll(value);
    }

    /**
     * 向List数据类型中添加值
     *
     * @param key      键
     * @param value    值
     * @param timeout  过期时间
     * @param timeUnit 时间单位
     */
    public <T> boolean addToList(String key, T value, long timeout, ChronoUnit timeUnit) {
        RList<T> list = redissonClient.getList(key);
        list.add(value);
        return list.expire(Instant.now().plus(timeout, timeUnit));
    }

    /**
     * 从List数据类型中获取值
     *
     * @param key   键
     * @param start 起始位置
     * @param end   结束位置
     * @return 值
     */
    public <T> List<T> getFromList(String key, int start, int end) {
        RList<T> list = redissonClient.getList(key);
        return list.range(start, end);
    }

    /**
     * 获取List数据类型中的所有值
     *
     * @param key 键
     * @return 值
     */
    public <T> List<T> getFromList(String key) {
        RList<T> list = redissonClient.getList(key);
        return list.readAll();
    }


    /**
     * 移除集合左侧第一个元素
     *
     * @param key 键
     */
    public void removeListLeft(String key) {
        RList<Object> list = redissonClient.getList(key);
        list.fastRemove(0);
    }

    /**
     * 移除集合右侧第一个元素
     *
     * @param key 键
     */
    public void removeListRight(String key) {
        RList<Object> list = redissonClient.getList(key);
        list.fastRemove(list.size() - 1);
    }

    /**
     * 移除集合指定位置元素
     *
     * @param key   键
     * @param index 索引
     */
    public void removeFromList(String key, int index) {
        RList<Object> list = redissonClient.getList(key);
        list.fastRemove(index);
    }

    /**
     * 移除集合指定元素
     *
     * @param key   键
     * @param value 值
     */
    public <T> boolean removeFromList(String key, T value) {
        RList<T> list = redissonClient.getList(key);
        return list.removeIf(o -> o.equals(value));
    }

        // ============================= Set类型操作 ============================

    /**
     * 添加值到Set数据类型中
     *
     * @param key   键
     * @param value 值
     */
    public <T> boolean addToSet(String key, T value) {
        RSet<T> set = redissonClient.getSet(key);
        return set.add(value);
    }

    /**
     * 添加值到Set数据类型中
     *
     * @param key      键
     * @param value    值
     * @param timeout  过期时间
     * @param timeUnit 时间单位
     * @return 是否成功
     */
    public <T> boolean addToSet(String key, T value, long timeout, ChronoUnit timeUnit) {
        RSet<T> set = redissonClient.getSet(key);
        boolean add = set.add(value);
        boolean expire = set.expire(Instant.now().plus(timeout, timeUnit));
        return add && expire;
    }

    /**
     * 添加值到Set数据类型中
     *
     * @param key    键
     * @param values 值
     * @return 是否成功
     */
    public <T> boolean addToSet(String key, List<T> values) {
        RSet<T> set = redissonClient.getSet(key);
        return set.addAll(values);
    }

    /**
     * 添加值到Set数据类型中
     *
     * @param key      键
     * @param values   值
     * @param timeout  过期时间
     * @param timeUnit 时间单位
     * @return 是否成功
     */
    public <T> boolean addToSet(String key, List<T> values, long timeout, ChronoUnit timeUnit) {
        RSet<T> set = redissonClient.getSet(key);
        set.addAllCounted(values);
        return set.expire(Instant.now().plus(timeout, timeUnit));
    }


    /**
     * 获取Set的所有元素。
     *
     * @param key 键
     * @return 所有值
     */
    public <T> Set<T> getFromSet(String key) {
        RSet<T> set = redissonClient.getSet(key);
        return set.readAll();
    }

    /**
     * 从Set数据类型中删除值
     *
     * @param key    键
     * @param values 值
     */
    public <T> void removeFromSet(String key, List<T> values) {
        RSet<T> set = redissonClient.getSet(key);
        values.forEach(set::remove);
    }

    /**
     * 从Set数据类型中删除值
     *
     * @param key   键
     * @param value 值
     */
    public <T> boolean removeFromSet(String key, T value) {
        RSet<T> set = redissonClient.getSet(key);
        return set.remove(value);
    }

        // ============================= ZSet类型操作 ============================

    /**
     * 添加值到ZSet数据类型中
     *
     * @param key   键
     * @param value 值
     * @param score 分值
     */
    public <T> void addToZSet(String key, T value, double score) {
        RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);
        sortedSet.add(score, value);
    }

    /**
     * 在ZSet数据类型中添加值
     *
     * @param key      键
     * @param value    值
     * @param score    分值
     * @param timeout  过期时间
     * @param timeUnit 时间单位
     */
    public <T> void addToZSet(String key, T value, double score, long timeout, ChronoUnit timeUnit) {
        RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);
        sortedSet.add(score, value);
        sortedSet.expire(Instant.now().plus(timeout, timeUnit));
    }

    /**
     * 获取ZSet的范围元素。
     *
     * @param key   键
     * @param start 起始位置
     * @param end   结束位置
     * @return Set类型的值
     */
    public <T> Set<Object> getFromZSet(String key, int start, int end) {
        RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);
        return new HashSet<>(sortedSet.valueRange(start, end));
    }

    /**
     * 删除ZSet数据类型中的值
     *
     * @param key    键
     * @param values 值
     */
    public <T> void removeFromZSet(String key, List<T> values) {
        RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);
        sortedSet.removeAll(values);
    }

    /**
     * 删除ZSet数据类型中的值
     *
     * @param key   键
     * @param value 值
     */
    public <T> void removeFromZSet(String key, T value) {
        RScoredSortedSet<T> sortedSet = redissonClient.getScoredSortedSet(key);
        sortedSet.remove(value);
    }

        // ============================= Common ============================

    /**
     * 判断Key是否存在
     *
     * @param key 键
     * @return 存在返回true,否则返回false
     */
    public boolean exists(String key) {
        return redissonClient.getBucket(key).isExists();
    }

    /**
     * 删除Key
     *
     * @param key 键
     */
    public boolean remove(String key) {
        long delete = redissonClient.getKeys().delete(key);
        return delete > 0;
    }

    /**
     * 设置Key的过期时间
     *
     * @param key      键
     * @param timeout  过期时间
     * @param timeUnit 时间单位
     * @return 设置成功返回true,否则返回false
     */
    public boolean expire(String key, long timeout, ChronoUnit timeUnit) {
        return redissonClient.getBucket(key).expire(Instant.now().plus(timeout, timeUnit));
    }

    /**
     * 获取Key的过期时间
     *
     * @param key 键
     * @return 过期时间
     */
    public Long getExpire(String key) {
        return redissonClient.getBucket(key).getExpireTime();
    }

    /**
     * 递增操作
     *
     * @param key   键
     * @param delta 增加的值
     * @return 递增后的值,如果键不存在,则返回-1
     */
    public long increment(String key, long delta) {
        RAtomicLong atomicLong = redissonClient.getAtomicLong(key);
        return atomicLong.addAndGet(delta);
    }

    /**
     * 递减操作
     *
     * @param key   键
     * @param delta 减少的值
     * @return 递减后的值,如果键不存在,则返回-1
     */
    public long decrement(String key, long delta) {
        RAtomicLong atomicLong = redissonClient.getAtomicLong(key);
        return atomicLong.decrementAndGet();
    }

    /**
     * 递增操作
     *
     * @param key   键
     * @param delta 增加的值
     * @return 递增后的值,如果键不存在,则返回-1
     */
    public double increment(String key, double delta) {
        RAtomicDouble atomicDouble = redissonClient.getAtomicDouble(key);
        return atomicDouble.addAndGet(delta);
    }

    /**
     * 递减操作
     *
     * @param key   键
     * @param delta 减少的值
     * @return 递减后的值,如果键不存在,则返回-1
     */
    public double decrement(String key, double delta) {
        RAtomicDouble atomicDouble = redissonClient.getAtomicDouble(key);
        return atomicDouble.decrementAndGet();
    }
}

4.测试

@RestController
@RequestMapping("/redission")
@Slf4j
public class RedissionAPI {

    @Resource
    private RedisService redisService;

    private static final String STRING_KEY = "redis:string";
    private static final String LIST_KEY = "redis:list";
    private static final String SET_KEY = "redis:set";
    private static final String HASH_KEY = "redis:hash";


    @PostMapping("/redis1")
    public void redisStringTest() {
        log.info("Redis String 数据类型测试");
        redisService.setString(STRING_KEY, LocalDateTime.now().toString());
        String redisGetStringData = redisService.getString(STRING_KEY);
        log.info("Redis String Get:{}", redisGetStringData);
        boolean remove = redisService.remove(STRING_KEY);
        log.info("Redis String Remove:{}", remove);
        redisGetStringData = redisService.getString(STRING_KEY);
        log.info("Redis String Get After Delete:{}", redisGetStringData);
    }

    @PostMapping("/redis2")
    public void redisListTest() {
        // 填充数据
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(LocalDateTime.now().getNano());
            ThreadUtil.sleep(5);
        }

        boolean addItemResult = redisService.addToList(LIST_KEY, LocalDateTime.now().getNano());
        redisService.getFromList(LIST_KEY)
                .forEach(s -> log.info("Redis List Get After Add Item:{}", s));

        boolean addListDataResult = redisService.addToList(LIST_KEY, list);
        log.info("Redis List Add List:{}", addListDataResult);
        redisService.getFromList(LIST_KEY)
                .forEach(s -> log.info("Redis List Get After Add List:{}", s));

        redisService.getFromList(LIST_KEY, 0, 2)
                .forEach(s -> log.info("Redis List Get By Index:{}", s));

        log.info("Redis List Size Before Delete:{}", redisService.getFromList(LIST_KEY).size());
        redisService.removeFromList(LIST_KEY, 0);
        log.info("Redis List Size After Delete:{}", redisService.getFromList(LIST_KEY).size());

        boolean remove = redisService.remove(LIST_KEY);
        log.info("Redis List Remove:{}", remove);
    }


    public void redisSetTest() {
        log.info("Redis Set 数据类型测试");
        // 填充数据
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(LocalDateTime.now().getNano());
            ThreadUtil.sleep(5);
        }

        boolean addItemResult = redisService.addToSet(SET_KEY, LocalDateTime.now().getNano());
        log.info("Redis Set Add item:{}", addItemResult);
        redisService.getFromSet(SET_KEY)
                .forEach(s -> log.info("Redis Set Get After Add Item:{}", s));

        boolean addListDataResult = redisService.addToSet(SET_KEY, list);
        log.info("Redis Set Add List:{}", addListDataResult);
        redisService.getFromSet(SET_KEY)
                .forEach(s -> log.info("Redis Set Get After Add List:{}", s));

        log.info("Redis Set Size Before Delete:{}", redisService.getFromSet(SET_KEY).size());
        redisService.removeFromSet(SET_KEY, LocalDateTime.now().getNano());
        log.info("Redis Set Size After Delete:{}", redisService.getFromSet(SET_KEY).size());

        boolean remove = redisService.remove(SET_KEY);
        log.info("Redis Set Remove:{}", remove);
    }


    public void redisHashTest() {
        log.info("Redis Hash 数据类型测试");
        Integer key = LocalDateTime.now().getNano();

        boolean addItemResult = redisService
                .addToHash(HASH_KEY, key, LocalDateTime.now().toString());
        log.info("Redis Hash Add item:{}", addItemResult);
        redisService.getFromHash(HASH_KEY)
                .forEach((k, v) -> log.info("Redis Hash Get After Add Item:{} - {}", k, v.toString()));

        log.info("Redis Hash Get By Key:{}", redisService.getFromHash(HASH_KEY, key).toString());

        log.info("Redis Hash Size Before Delete:{}", redisService.getFromHash(HASH_KEY).size());
        redisService.removeFromHash(HASH_KEY, key);
        log.info("Redis Hash Size After Delete:{}", redisService.getFromHash(HASH_KEY).size());

        boolean remove = redisService.remove(HASH_KEY);
        log.info("Redis Hash Remove:{}", remove);
    }
}

标签:value,return,String,param,Redission,整合,SpringBoot3,key,public
From: https://www.cnblogs.com/lwx11111/p/18663793

相关文章

  • 【Linux】Linux 安装 Mosquitto 及 SpringBoot整合
    一、Linux(centos)下MosquittoMQTT代理的安装与配置MQTT(MessageQueuingTelemetryTransport)是一种轻量级的、基于发布/订阅模式的消息传输协议,广泛应用于物联网(IoT)领域。Mosquitto是一个开源的MQTT代理,它支持MQTT协议3.1和3.1.1,适用于各种设备和平台。在工业上使用......
  • 城市生命线安全管理:数据要素整合与场景应用实践
    城市生命线工程是确保城市正常运行和居民安全生活的关键基础设施,涉及供水、排水、燃气、电力等多个方面。随着信息技术的发展,特别是大数据、物联网、人工智能等技术的应用,城市生命线数据要素与场景应用的深度融合成为提升城市治理能力的重要途径。数据要素的重要性......
  • 【stable diffusion】:秋叶大佬整合包安装全过程,保姆级教程
    整合包对非技术出身的同学比较友好,因为秋叶大佬把相关的东西已经都整合好了,只需要点点点就行了。当然懂编程的同学就更没有问题了。准备为了保证AI绘画的效率,建议在本机安装Nvidia独立显卡,也就是俗称的N卡,并且显存要达到6G以上,6G只能出图,如果要做训练建议12G以上。推荐选......
  • 【详解】Spring整合Redis
    目录Spring整合Redis1.环境准备1.1技术栈1.2工具2.添加依赖3.配置Redis4.创建Redis配置类5.使用RedisTemplate6.测试7.总结1.添加依赖2.配置Redis连接3.创建Redis配置类4.创建服务类5.创建控制器6.启动应用7.测试API1.添加依赖2.配置Redi......
  • Meta 的新策略,将 AI 生成的角色整合到其社交媒体平台
    一、Meta新年规划及引人注目的举措多元规划背景:在新的一年,Meta制定了多维度的战略规划,旨在巩固并拓展其在科技领域的影响力。增强现实与元宇宙是其长期布局的重点方向,期望借此塑造未来互联网的交互形态;面对TikTok可能被禁的潜在情况,提前做好准备以吸纳其用户,显示出对用户流量......
  • Springboot(五十六)SpringBoot3集成SkyWalking
    这里我们将skywalking集成到Springboot中。关于docker部署skyWalking的相关问题,请移步《docker(二十八)docker-compose部署链路追踪SkyWalking》一:下载java-agents先放一下skyWalking的官网下载地址 Downloads|ApacheSkyWalking其他的版本的APM地址(这个我不需要,我......
  • SpringBoot 整合 Quartz 定时任务框架
    本文没有聊到 Java 其他的实现定时任务的方法啥的~,只是对使用Quartz做了一个小实践一、简单聊一聊QuartzQuartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz其实就是通过一个调度线程不断的扫描数据库......
  • 超强AI绘画工具StableDiffusion,SD整合包V4.9 来了 版本win加mac安装包以及搭载PS安装
    众所周知,StableDiffusion是非常强大的AI绘图工具,今天为大家带来的是StableDiffusionSD整合包v4.9版本安装说明。这里带来的安装版本是9月最新整合包sd-webui-aki-v4.9版本。WIN加MAC有需要stablediffusion整合包以及提示词插件,可以扫描下方,免费获取一、整合......
  • springboot3 redis 常用操作工具类
    在SpringBoot3中,操作Redis通常使用SpringDataRedis提供的工具类,如RedisTemplate和StringRedisTemplate。以下是一个详细的Redis操作工具类的实现,涵盖了常用功能。完整的Redis工具类以下工具类可以实现基本的Redis操作,例如字符串、哈希、列表、集合和有......
  • 3dsmax将两个物体整合成一个物体
    在3dsMax中,将两个物体合并成一个物体,可以通过多种方法实现,具体取决于您想要的效果和物体的特性。以下是几种常用的方法:方法一:使用布尔运算调整物体位置:首先,将两个物体移动到想要合并的位置。选中其中一个物体:在视图中单击选中其中一个物体。打开复合对象:在修改面......