[Spring Boot]09 Spring Boot集成和使用Redis

SpringBoot基本操作(四)——SpringBoot使用RedisTemplate整合Redis(有demo) SpringBoot2.0笔记 (一)SpringBoot基本操作——环境搭建及项目创建(有demo) (二)SpringBoot基本操作——使用IDEA打war包发布及测试 (三)SpringBoot基本操作——SpringBoot整合SpringDataJpa(有demo) (四)SpringBoot基本操作——SpringBoot使用RedisTemplate整合Redis(有dem... 阅读详情

前言

在这里插入图片描述

Redis全称Remote Dictionary Server(远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilippo 使用C语言编写。

Redis的性能极高,可以用来缓存一些经常被访问的数据或者需要耗费大量资源的内容,把这些内容放到Redis中时,能够让应用程序快速地读取它们,从而降低应用的压力,减少访问的延迟。

Spring Boot如何集成Redis

在项目pom.xml文件中引入Redis,依赖内容如下:

<!--redis-->
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>
<!-- redis需要配合commons-pool2 对象池依赖 -->
  <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
  </dependency>

对应application.yml配置文件的配置:

//*******为redis的密码
  redis:
    host: 127.0.0.1
    port: 6379
    password: *******
    timeout: 5000
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        max-wait: 5000
        min-idle: 0

默认数据库0,如果要指定数据库,使用配置:

//指定使用数据库1,redis自带16(0—15)个数据库(默认使用0库)
database: 1

Spring Boot如何使用Redis

先准备2个文件:Redis配置文件和Redis工具类。
Redis配置文件,一般放在api项目里面,文件名为RedisConfig,源码如下:

package com.***.api.conf;// ***为自己的项目

import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author /
 */
@Configuration
@EnableCaching
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        // 配置redisTemplate
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // 配置连接工厂
        lettuceConnectionFactory.setValidateConnection(true);
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        // 设置序列化
        StringRedisSerializer stringSerializer = new StringRedisSerializer();
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        return redisTemplate;
    }
}

Redis工具类,一般放在common项目里面,文件名为RedisUtil,源码如下:

package com.***.common.util;// ***为自己的项目

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * redis 工具类
 *
 * @author /
 */
@Component
public class RedisUtil {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 指定缓存失效时间
     *
     * @param key  键
     * @param time 时间(秒)
     * @return true / false
     */
    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;
        }
    }

    /**
     * 根据 key 获取过期时间
     *
     * @param key 键
     * @return /
     */
    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) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除缓存
     *
     * @param key 键(一个或者多个)忽略类型转换警告
     */
    @SuppressWarnings("unchecked")
    public void del(String... key) {
        if (key != null && key.length > 0) {
            if (key.length == 1) {
                redisTemplate.delete(key[0]);
            } else {
            //  传入一个 Collection<String> 集合
                redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }

    /**
     * 删除缓存集合
     *
     * @param keys 传入一个 Collection<String> 集合
     */
    public void del(List<String> keys) {
        redisTemplate.delete(keys);
    }
//    ============================== String ==============================

    /**
     * 普通缓存获取
     *
     * @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 则设置无限时间
     * @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;
        }
    }

    /**
     * 递增
     *
     * @param key   键
     * @param delta 递增大小
     * @return /
     */
    public Long incr(String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递增因子必须大于 0");
        }
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 递减
     *
     * @param key   键
     * @param delta 递减大小
     * @return /
     */
    public Long decr(String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递减因子必须大于 0");
        }
        return redisTemplate.opsForValue().increment(key, delta);
    }

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

    /**
     * HashGet
     *
     * @param key  键(no null)
     * @param item 项(no null)
     * @return 值
     */
    public Object hGet(String key, String item) {
        return redisTemplate.opsForHash().get(key, item);
    }

    /**
     * 获取 key 对应的 map
     *
     * @param key 键(no null)
     * @return 对应的多个键值
     */
    public Map<Object, Object> hmGet(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * HashSet
     *
     * @param key 键
     * @param map 值
     * @return true / false
     */
    public boolean hmSet(String key, Map<Object, Object> map) {
        try {
            redisTemplate.opsForHash().putAll(key, map);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * HashSet 并设置时间
     *
     * @param key  键
     * @param map  值
     * @param time 时间
     * @return true / false
     */
    public boolean hmSet(String key, Map<Object, 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;
        }
    }

    /**
     * 向一张 Hash表 中放入数据,如不存在则创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @return true / false
     */
    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;
        }
    }

    /**
     * 向一张 Hash表 中放入数据,并设置时间,如不存在则创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @param time  时间(如果原来的 Hash表 设置了时间,这里会覆盖)
     * @return true / false
     */
    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;
        }
    }

    /**
     * 删除 Hash表 中的值
     *
     * @param key  键
     * @param item 项(可以多个,no null)
     */
    public void hDel(String key, Object... item) {
        redisTemplate.opsForHash().delete(key, item);
    }

    /**
     * 判断 Hash表 中是否有该键的值
     *
     * @param key  键(no null)
     * @param item 值(no null)
     * @return true / false
     */
    public boolean hHasKey(String key, String item) {
        return redisTemplate.opsForHash().hasKey(key, item);
    }

    /**
     * Hash递增,如果不存在则创建一个,并把新增的值返回
     *
     * @param key  键
     * @param item 项
     * @param by   递增大小 > 0
     * @return
     */
    public Double hIncr(String key, String item, Double by) {
        return redisTemplate.opsForHash().increment(key, item, by);
    }

    /**
     * Hash递减
     *
     * @param key  键
     * @param item 项
     * @param by   递减大小
     * @return
     */
    public Double hDecr(String key, String item, Double by) {
        return redisTemplate.opsForHash().increment(key, item, -by);
    }

//    ============================== Set ==============================

    /**
     * 根据 key 获取 set 中的所有值
     *
     * @param key 键
     * @return 值
     */
    public Set<Object> sGet(String key) {
        try {
            return redisTemplate.opsForSet().members(key);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 从键为 key 的 set 中,根据 value 查询是否存在
     *
     * @param key   键
     * @param value 值
     * @return true / false
     */
    public boolean sHasKey(String key, Object value) {
        try {
            return redisTemplate.opsForSet().isMember(key, value);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 将数据放入 set缓存
     *
     * @param key    键值
     * @param values 值(可以多个)
     * @return 成功个数
     */
    public long sSet(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().add(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 将数据放入 set缓存,并设置时间
     *
     * @param key    键
     * @param time   时间
     * @param values 值(可以多个)
     * @return 成功放入个数
     */
    public long sSet(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;
        }
    }

    /**
     * 获取 set缓存的长度
     *
     * @param key 键
     * @return 长度
     */
    public long sGetSetSize(String key) {
        try {
            return redisTemplate.opsForSet().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 移除 set缓存中,值为 value 的
     *
     * @param key    键
     * @param values 值
     * @return 成功移除个数
     */
    public long setRemove(String key, Object... values) {
        try {
            return redisTemplate.opsForSet().remove(key, values);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

//    ============================== List ==============================

    /**
     * 获取 list缓存的内容
     *
     * @param key   键
     * @param start 开始
     * @param end   结束(0 到 -1 代表所有值)
     * @return
     */
    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;
        }
    }

    /**
     * 获取 list缓存的长度
     *
     * @param key 键
     * @return 长度
     */
    public long lGetListSize(String key) {
        try {
            return redisTemplate.opsForList().size(key);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 根据索引 index 获取键为 key 的 list 中的元素
     *
     * @param key   键
     * @param index 索引
     *              当 index >= 0 时 {0:表头, 1:第二个元素}
     *              当 index < 0 时 {-1:表尾, -2:倒数第二个元素}
     * @return 值
     */
    public Object lGetIndex(String key, long index) {
        try {
            return redisTemplate.opsForList().index(key, index);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 将值 value 插入键为 key 的 list 中,如果 list 不存在则创建空 list
     *
     * @param key   键
     * @param value 值
     * @return true / false
     */
    public boolean lSet(String key, Object value) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 将值 value 插入键为 key 的 list 中,并设置时间
     *
     * @param key   键
     * @param value 值
     * @param time  时间
     * @return true / false
     */
    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;
        }
    }

    /**
     * 将 values 插入键为 key 的 list 中
     *
     * @param key    键
     * @param values 值
     * @return true / false
     */
    public boolean lSetList(String key, List<Object> values) {
        try {
            redisTemplate.opsForList().rightPushAll(key, values);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 将 values 插入键为 key 的 list 中,并设置时间
     *
     * @param key    键
     * @param values 值
     * @param time   时间
     * @return true / false
     */
    public boolean lSetList(String key, List<Object> values, long time) {
        try {
            redisTemplate.opsForList().rightPushAll(key, values);
            if (time > 0) {
                expire(key, time);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根据索引 index 修改键为 key 的值
     *
     * @param key   键
     * @param index 索引
     * @param value 值
     * @return true / false
     */
    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;
        }
    }

    /**
     * 在键为 key 的 list 中删除值为 value 的元素
     *
     * @param key   键
     * @param count 如果 count == 0 则删除 list 中所有值为 value 的元素
     *              如果 count > 0 则删除 list 中最左边那个值为 value 的元素
     *              如果 count < 0 则删除 list 中最右边那个值为 value 的元素
     * @param value
     * @return
     */
    public long lRemove(String key, long count, Object value) {
        try {
            return redisTemplate.opsForList().remove(key, count, value);
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    
}

Redis使用举例:
比如,把用户登录的token信息放入Redis,从而提高登录访问的性能。
只要使用RedisUtil工具中,有关String字符串的函数来处理即可,可以使用放入缓存set和从缓存获取get这2个函数,代码单独摘出来了,如下:

    /**
     * 普通缓存获取
     *
     * @param key 键
     * @return 值
     */
    public Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }
    
    /**
     * 普通缓存放入并设置时间
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒),如果 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;
        }
    }

token信息放入Redis:

//  86400L:token过期时间,单位为秒,如设置为1天 
redisUtil.set("login:token:" + userId, token, 86400L);

从Redis中获取token信息:

Object obj = redisUtil.get("login:token:" + userId);

再比如,APP端,一般都会使用手机号码进行注册和登录,使用手机号码时,都会对接短信服务获取验证码,获取验证码一般都会使用一些限制,比如,一次短信验证码5分钟内有效,同一个号码每天不能发送超过10次等等。
由于,发送验证码的动作可能非常地频繁,我们也可以选择把获取验证码相关的操作放Redis里面来缓存,从而提高短信业务的性能。

短信验证码信息放入Redis:

// 验证码5分钟之内有效
redisUtil.set("sms:code:" + mobile, code, 300L);
// 1分钟之内不能重发
redisUtil.set("sms:resend:" + mobile, new Date(), 60L);
// 每天最多10次
  // 判断是否达到10次 格式 sms:incr:130****8888:20221109
String incrKey = "sms:incr:" + mobile + ":" + DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT);
redisUtil.incr(incrKey, 1L);
// 1天之后自动过期
redisUtil.expire(incrKey, 86400L);

从Redis中获取短信验证码信息:

// 获取短信验证码
Object obj = redisUtil.get("sms:code:" + mobile);
// 成功后 删除短信缓存,从而解除重发限制
redisUtil.del("sms:code:" + mobile, "sms:resend:" + mobile);
// 判断是否达到10次
String incrKey = "sms:incr:" + mobile + ":" + DateUtil.format(new Date(), DatePattern.PURE_DATE_FORMAT);
Object obj = redisUtil.get(incrKey);
// 判断是否超过了一分钟
Boolean bResend = redisUtil.hasKey("sms:resend:" + mobile);

小结

Redis使用的好,真的能够帮助我们的项目,解决很多的性能问题,我们要善于去发现能够使用Redis的场景,灵活使用Redis工具类里面的功能。
大家使用起来吧。

【SpringBoot详细教程】-09-Redis详细教程以及SpringBoot整合Redis【持续更新】 Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库Redis是互联网技术领域使用最为广泛的存储中间件,它是「Remote DictionaryService」的首字母缩写,也就是「远程字典服务」。Redis以其超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。 阅读详情

相关推荐

JAVA:Spring Boot 集成 Redis 实现每周热评

本文介绍了利用Redis实现每周热门评论功能的方法。通过Redis的Sorted Set数据结构,以评论ID为成员、点赞数为分数,实现了评论的自动排序功能。文章详细讲解了实现思路,包括数据结构设计、周期性更新和用户点赞操作处理,并提供了完整的Java代码实现,涵盖Redis服务类、Controller层和配置。该方案适用于社交平台、内容推荐和电商评论等场景,能够高效处理实时数据排序需求,提升用户体验。Redis的高性能特性使其成为实现实时热评功能的理想选择。

木头 1130

SpringBoot集成Redis及Redis使用方法

SpringBoot集成Redis及Redis使用方法 将一些经常展现和不会频繁变更的数据,存放在存取速率更快的地方。 缓存就是一个存储器,在技术选型中,常用 Redis 作为缓存数据库,可以帮我们分散掉数据库的压力,有了它能更好的支持并发性能,主要是在获取资源方便性能优化的关键方面。可以这样理解redis位于数据库和springboot框架之间,起到数据缓存的作用。

李指导的博客 4135

Spring Boot基础学习笔记08:Spring Boot整合Redis

1. 熟悉Redis相关概念; 2. 掌握使用Spring Boot整合Redis

howard2005的专栏 1303

SpringBoot集成redis

今天,日月在这里教大家如何使用springBoot集成redis,说实话比较简单,网上也有大把的教程。先套用一下网上的简介。 定义 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value...

真的愿意去努力,人生最坏的结果,也不过是大器晚成。 25万+

自然二进制数与格雷码的相互转换

自然二进制数与格雷码两者优势: 自然二进制数的编码方式简单明了,容易理解,在加减运算中能够直接进行,同时十分方便进行一些位运算操作(如移位、取反等)。 格雷码计数时只有一位变化,可有效减少计数器状态的冗余转换,同时在传输数据时能够减小传输错误的概率,此外带权重编码处理更加方便。 在一定程度上自然二进制数与格雷码优缺点基本相反,综上所述,自然二进制数和格雷码各有优劣之处,需要根据具体应用场景选择合适的编码方式。简单来说,在计数器和编码器中,倾向于使用格雷码;而在进行加减运算时,则倾向于使用自然二进制数。

Loudrs的博客 7490

LDPC码介绍:基础&编码&译码

本博客介绍了LDPC码的基本原理,其中包括校验矩阵的构造、Tanner 图和编译码的基础知识。

渺小的颗星的博客 4308

springboot整合redis和基本使用

ConditionalOnMissingBeana:当这个bean不存在的时候这个类就生效,也就是说当我们自己去写了个交redisTemplate可以把这个类替换掉 springboot1、0使用jredis,2.0用lettuce 测试 这里面每一个操作就是对应的一个数据类型 CRUD(增删改查) 获取redis连接对象 比如要操作一个字符串: 这样就取出来了...

无极 447

FPGA实战:用DDR3和乒乓操作解决视频帧撕裂问题(附Verilog代码)

本文详细介绍了如何利用DDR3内存和乒乓操作架构解决FPGA视频处理中的帧撕裂问题。通过多帧缓存原理、AXI接口配置和自适应乒乓操作设计,有效隔离读写操作,确保视频流稳定传输。文章包含Verilog代码实现和性能优化技巧,适用于工业相机、医疗影像等高速视频处理场景。

m2n3b4v5c6的博客 288

Spring Boot + Redis GEO 实现高性能附近的人服务:原理、实战与优化

在基于位置的服务(LBS)和邻近查询场景中,高效处理地理位置数据是核心技术挑战。其原理通常涉及将二维经纬度通过Geohash等算法编码为一维可排序的数据结构,从而实现快速的范围查询。这项技术的核心价值在于为社交、外卖、出行等应用提供实时、精准的邻近对象发现能力,是提升用户体验的关键。Redis的GEO数据类型正是为此场景设计的利器,它底层基于有序集合(ZSET)和Geohash算法,提供了简洁高效的命令接口。本文聚焦于如何利用Spring Boot集成Redis GEO,从环境搭建、服务封装到接口设计,构建

weixin_31714129的博客 305

高效静音黑科技 —— 单相直流无刷电机驱动器

然而,传统的BLDC电机驱动通常依赖于三相架构,电路复杂,成本高昂,且在低功率应用中显得有些“大材小用”。单相直流无刷电机驱动器作为一项高效、静音、经济的技术,正逐渐改变着各个领域的电机驱动方式。其精巧的控制策略、显著的优势以及广阔的应用前景,都预示着这项技术将在未来扮演越来越重要的角色。它相较于传统的三相驱动,显著简化了电路结构,降低了成本,尤其适用于低功率、对静音要求极高的应用场景。通过这些模块的协同工作,单相直流无刷电机驱动器能够实现对电机速度、扭矩的精确控制,并最大程度地降低噪声和振动。

wen8789的博客 1763

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

【Python程序开发】湖南省职业院校技能大赛python程序开发赛项样题二

况老师话竞赛&blog 2191

从入门到精通【Redis】如何在Java中使用Redis以及将Redis集成到Spring Boot

本篇文章给大家介绍redis在Java中的简单实用,可以快速上手。

双吉堡工程专业的一名27届Javaer。 1350

【离线OCR】微信离线实现图片OCR文本和表格识别

基于微信本地OCR引擎(由最新版微信自动安装)。通过Python对其官方调用逻辑进行完整翻译和封装,使开发者可以用简单的API调用其强大的OCR功能。

专注于医院数据分析技术与系统开发的创作与分享。 2620

Redis7_09 基础篇 第九章 SpringBoot集成Redis

SpringBoot集成redis的三种方式。Spring Framework 提供的 RedisTemplate 是对 Redis 客户端库的封装,它提供了一种更高级别的抽象,使得与 Redis 进行交互更加方便,并且可以与 Spring 框架更好地集成。 适用场景:如果你的应用程序已经在使用 Spring 框架,并且希望通过统一的接口来与 Redis 进行交互,那么 RedisTemplate 是一个很好的选择。

qq_33168558的博客 1208

034、MLCA 多尺度局部上下文注意力的 YOLOv11 适配:轻量级金字塔式空间上下文聚合

本文介绍了一种将多尺度局部上下文注意力(MLCA)模块集成到YOLOv11模型中的方法,以解决小目标检测中空间信息丢失的问题。MLCA采用金字塔式局部上下文聚合策略,通过不重叠的网格划分实现轻量级空间注意力计算,相比全局注意力机制能更好地保留小目标特征。 作者详细记录了实现过程,包括模块定义、参数调优和训练技巧,特别指出避免使用BN而改用GroupNorm以提升训练稳定性。在VisDrone数据集上的实验表明,MLCA-YOLOv11在参数量和计算量基本不变的情况下,mAP提升2.5%,其中行人检测提升3.

sundong_81的博客 278

Python爬虫实战:京东/淘宝商品价格与评论监控系统——从User-Agent伪装到编码陷阱的全面攻克

在电商数据驱动决策的今天,无论是个人消费者想抓住历史低价,还是市场分析师需要追踪竞品动态,抑或是算法交易员依赖实时价格信号,自动化的商品价格与评论监控系统都已成为不可或缺的工具。然而,电商平台的反爬虫策略日益严苛,字符编码的“暗坑”更是让初学者屡屡碰壁。本文将以京东(JD.com和淘宝(Taobao.com两大主流平台为目标,手把手带你构建一个稳定、高效的商品监控爬虫。User-Agent伪装——如何模拟真实浏览器行为,突破初级反爬。GBK/UTF-8编码混战。

2201_76125261的博客 72

Spring Boot(五):集成Redis和使用Redis实现缓存共享

Redis(REmote DIctionary Server)是一个key-value存储系统,是当下互联网公司最常用的NoSQL数据库之一。支持存储的value类型有string、list、set、zset(sorted set --有序集合)和hash。Redis的数据是存储在内存中的,通过磁盘的高速写入存储数据,存储速度和多种数据类型是Redis的两大优点,同时还有操作的原子性,以及它的通用...

1865

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

spring-boot 集成spring-session redis

Spring Session  提供了一套用于管理用户 session 信息的API和实现。 Spring Session为企业级Java应用的session管理带来了革新,使得以下的功能更加容易实现: 编写可水平扩展的原生云应用。 将session所保存的状态卸载到特定的外部session存储中,如Redis或Apache Geode中,它们能够以独立于应用服务器的方式提供

zl 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring Boot 2.3.0 Redis拓扑动态感应,使用Lettuce拓扑刷新

背景 关于 Redis 在生产中我们一般情况下都会选择 redis cluster 高可用架构部署,既能保证数据分片并且实现节点的故障自动转移。 基本部署拓扑如下: 创建测试集群 这里通过我封装的 pig4cloud/redis-cluster:4.0 镜像,即可构建一个 6 个节点的 redis cluster 测试环境。 docker run --name redis-cluster -d -e CLUSTER_ANNOUNCE_IP=宿主机IP \ -p 7000-700...

zzhongcy的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring cloud gateway 详解和配置使用(文章较长)

目录 spring cloud gateway 介绍 1. 网关是怎么演化来的 2. 网关的基本功能 3.关于Spring Cloud Gateway 4.Spring Cloud Gateway 功能特征 5.predicate简介 6.GatewayFilter 工厂介绍 7.集成Hystrix的断路器功能 8.请求限流 pom.xml application.ym...

荡漾 21万+

java学习09(Spring Boot)

spring boot发展史:在之前所讲的Spring MVC框架中使用过滤器、前端控制器、拦截器等的使用都需要进行配置处理,不然无法依赖特定的文件,导致报错。Spring Boot的莫得就是用来简化新Spring 应用的初始搭建以及开发过程的。该框架使用特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简单的来说就是Spring Boot 不是什么新的框架,它是默认配置了很多框架的使用方式,就像Maven 整合了所有的jar包,Spring Boot 整合了所有的框架。

weixin_73416102的博客 678

redis 缓存 @class: 会有 $hibernateproxy_Spring Boot学习09_整合Redis

一、环境搭建1、在前面的Demo的基础上在pom文件上添加上redis的starter<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </d...

weixin_39685697的博客 387

Spring Boot 11 : Redis

pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> &lt...

weixin_30437337的博客 68

springboot 集成redis-om-spring使用

/</</</说明:因为v0.9.1之后集成了Spring AI相关的,所以在Spring AIv1.0.0版后才处理,所以先用v0.9.0。

qq_27354909的博客 1048

Spring Boot 集成 Redisson 实现消息队列

【代码】Spring Boot基于Redisson的RBlockingQueue实现简单的消息队列,适用于简单队列应用。有普通队列与延迟队列实现。

大橘的博客 2140
上一篇: [Spring Boot]08 IDEA接入MyBatisCodeHelper代码自动生成器
下一篇: [思考进阶]01 如何克服自己的无知?
joinclear
博客等级 码龄21年 1316粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joinclear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值