Spring Boot 使用 Redis

news2024/11/25 18:50:07

1,Spring 是如何集成Redis的?

首先我们要使用jar包

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

 </dependency>
 <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
 </dependency>

2,我们使用的时候需要用到高级封装

2,配置Redis

# Redis服务器地址
spring.redis.host=10.1.30.222
# Redis数据库索引(默认为0)
spring.redis.database=0 
# Redis服务器连接端口
spring.redis.port=6379 
# Redis服务器连接密码(默认为空)
#spring.redis.password=
## 连接超时时间(毫秒)
spring.redis.timeout=30000

# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8

# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=1

#连接池中最大空闲等待时间,3s没有活干的时候直接驱逐该链接
spring.redis.lettuce.pool.min-evictable-idle-time-millis = 3000


# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1

StringRedisTemplate

String

public class StringDemo {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private final String key = "zhengzhou";

    public void test() {

        stringRedisTemplate.opsForValue().set(key, "我的家乡", 30, TimeUnit.SECONDS);
        String value = stringRedisTemplate.opsForValue().get(key);
        System.out.println(value);
    }
}

Java

Hash

@Component
public class HashDemo {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private  final  String key ="zhouxingxing";
    public void  test(){
        stringRedisTemplate.opsForHash().put(key,"20220325","郑州");
        stringRedisTemplate.opsForHash().put(key,"20220326","洛阳");

        List<Object> values = stringRedisTemplate.opsForHash().values(key);

        for (Object value:values){
            System.out.println(value);
        }

    }
}

Java

List

@Component
public class ListDemo {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private  final  String key ="onewayroad";
    void  test(){

        stringRedisTemplate.opsForList().leftPush(key,"周星星");
        stringRedisTemplate.opsForList().leftPush(key,"张敏");
        stringRedisTemplate.opsForList().leftPush(key,"李大锤");
        String value = stringRedisTemplate.opsForList().rightPop(key);
        System.out.println(value);


    }
}
    @Test
    void test6() {
     // 如果一些原生命令,spring 没有给我们封装,redisTemplate.execute(new RedisCallback)
    while (true){
        System.out.println("开始一轮监听");
        List<byte[]> rawResults = redisTemplateProduct.execute(new RedisCallback<List<byte[]>>() {
            @Override
            public List<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {
                return connection.bRPop(5,"product.hot".getBytes());
            }
        });
        if(ObjUtil.isNotEmpty(rawResults)){
            byte[] rawKey = rawResults.get(0);
            byte[] rawValue = rawResults.get(1);
            Product product = (Product)redisTemplateProduct.getValueSerializer().deserialize(rawValue);
            System.out.println(product);
        }
    }


Java

Set

@Component
public class SetDemo {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private final  String zhouxingxing ="zhouxingxing";
    private  final  String zhangmin = "zhangming";

    public void  test(){
        //添加周星星同学感兴趣的科目
        stringRedisTemplate.opsForSet().add(zhouxingxing,"语文");
        stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");
        stringRedisTemplate.opsForSet().add(zhouxingxing,"数学");
        //添加张敏同学感兴趣的科目
        stringRedisTemplate.opsForSet().add(zhangmin,"数学");
        stringRedisTemplate.opsForSet().add(zhangmin,"英语");

        //获取两位同学共同感兴趣的科目
        Set<String> values = stringRedisTemplate.opsForSet().intersect(zhouxingxing, zhangmin);

        System.out.println("周星星和张敏共同感兴趣的科目为:");

        for(String value : values){
            System.out.println(value);
        }
        
    }
}

Java

ZSet

@Component
public class ZSetDemo {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private final  String key ="zhouxingxing";
    public void  test(){
        //添加周星星同学成绩
        stringRedisTemplate.opsForZSet().add(key,"语文",98);
        stringRedisTemplate.opsForZSet().add(key,"数学",87);
        stringRedisTemplate.opsForZSet().add(key,"英语",75);
        //获取分数最高的成绩
        ZSetOperations.TypedTuple<String> values = stringRedisTemplate.opsForZSet().popMax(key);
        //打印值
        System.out.println("周星星最好成绩科目是:"+values.getValue());
        System.out.println("周星星最好成绩:"+values.getScore());
        
    }
}

Java

BitMap

@Component
public class BitMapDemo {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    private final  String key ="sign#2022#zhouxingxing";
    public void test(){
       //设置签到
        stringRedisTemplate.opsForValue().setBit(key,2,true);
        stringRedisTemplate.opsForValue().setBit(key,85,true);
        //获取周星星同学的签到天数
        RedisCallback<Long> callback = connection -> { return  connection.bitCount(key.getBytes(),0,365);};
        Long count = stringRedisTemplate.execute(callback);
        //打印周星星2022年签到天数
        System.out.println("周星星2022年一共签到天数:"+count);
    }
}

Java

3.RedisTemplate

3.1泛型约束的使用

@Component
public class RedisTemplateDemo {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate<String, String> redisTemplate_string_string;

    @Resource
    private RedisTemplate<String, User> redisTemplate;

    @Resource(name="redisTemplate")
    private ValueOperations<String,User> valueOperations;

    private final String key = "useris#01";

    public void test() {
        User user = User.builder().id(1).name("李四").build();
        redisTemplate.opsForValue().set(key,user );
        User value = redisTemplate.opsForValue().get(key);
        valueOperations.set(key,user );
        User value2 = valueOperations.get(key);
        System.out.println(value);

    }
}

4,乱码的问题

JdkSerializationRedisSerializer  serializer = new JdkSerializationRedisSerializer();
        byte[] serialize = serializer.serialize("user#01");
        System.out.println(new String(serialize));

自定义序列化工具

@Configuration
public class RedisConfig {
    

 @Bean //主动注册了一个名字叫redisTemplate 的bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
    {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        Jackson2JsonRedisSerializer jackson = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper  mapper = new ObjectMapper();

        // 启用默认类型推理,将类型信息作为属性写入JSON
        // 就是把对象的全类名写入json
        mapper.activateDefaultTyping( mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);

        jackson.setObjectMapper(mapper);
        template.setKeySerializer(StringRedisSerializer.UTF_8);
        template.setValueSerializer(jackson);
        template.setHashKeySerializer(StringRedisSerializer.UTF_8);
        template.setHashValueSerializer(jackson);
        return template;
    }


}

为什么要自定话应该序列化工具,因为他自己提供的不是很好,所以我们要自己定义一个,这样的话可以把java对象转化成json和字节码存入Redis 里,反序列化就是把json和字节码转化为java对象,泛型指定为 Object.class 表示可以处理任何类型的对象。

最后返回配置好的 RedisTemplate 实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。

详细的介绍:

  1. @Configuration 注解表明这是一个配置类,Spring IoC容器将会读取该类中的bean定义。

  2. @Bean 注解的方法表示该方法会返回一个对象,该对象会被注册为Spring容器中的bean。在这个例子中,方法名为 redisTemplate,所以生成的bean的名字也是 "redisTemplate"。

  3. 方法体中首先创建了一个 RedisTemplate<Object, Object> 实例,并将其连接工厂设置为传入的 RedisConnectionFactory,这是连接Redis的基础配置。

  4. 创建了 Jackson2JsonRedisSerializer 实例,用于将Java对象序列化为JSON字符串,反序列化时则将JSON字符串转回为Java对象。泛型指定为 Object.class 表示可以处理任何类型的对象。

  5. 初始化 ObjectMapper,它是Jackson库中用于处理JSON的核心类。这里启用了默认类型推理(activateDefaultTyping),这样在序列化时,即使目标类没有显式地声明类型信息,也能根据实际运行时类型推断并在JSON中包含类型信息,这对于处理多态类型的场景非常有用。

  6. 将初始化好的 ObjectMapper 设置给 Jackson2JsonRedisSerializer

  7. 配置RedisTemplate的序列化策略:

    • template.setKeySerializer(StringRedisSerializer.UTF_8); 设置键(key)的序列化器为 StringRedisSerializer,以UTF-8格式进行字符串序列化。
    • template.setValueSerializer(jackson); 设置值(value)的序列化器为刚才创建的 Jackson2JsonRedisSerializer,即所有值都将转化为JSON字符串存储。
    • template.setHashKeySerializer(StringRedisSerializer.UTF_8); 设置哈希表键(hash key)的序列化器也为 StringRedisSerializer,同样以UTF-8格式进行字符串序列化。
    • template.setHashValueSerializer(jackson); 设置哈希表值(hash value)的序列化器为 Jackson2JsonRedisSerializer,意味着哈希表中的每个值也将被转化为JSON字符串存储。

最后,返回配置好的 RedisTemplate 实例,这样在整个Spring Boot应用中,当需要使用RedisTemplate进行操作时,将自动使用这个经过JSON序列化配置的模板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

px转rem VsCode插件和快捷键

安装插件 修改配置参数 设置里面的 快捷键 altz

Java算法之哈希算法

Java算法之哈希算法 哈希表 哈希表&#xff08;Hash Table&#xff09;&#xff0c;也称为散列表&#xff0c;是一种根据关键码值&#xff08;Key Value&#xff09;直接进行访问的数据结构。它通过哈希函数&#xff08;Hash Function&#xff09;将关键码值映射到哈希表中的…

CXL系统架构

CXL系统架构 CXL支持三种设备类型&#xff0c;如下图。Type 1支持CXL.cache和CXL.io&#xff1b;Type 2支持CXL.cache&#xff0c;CXL.mem和CXL.io&#xff1b;Type 3支持CXL.mem和CXL.io。无论哪种类型&#xff0c;CXL.io都是不可缺少的&#xff0c;因为设备的发现&#xff0…

c实现猜数游戏(猜不对可是要自动帮你电脑关机)

接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 前言 猜数字游戏作为一个基础的C程序小项目&#xff0c;实现简单&#xff0c;可以帮助我们巩固很多知识&#xff0c;作为扩展接下来我们实现一个自定猜数次数&#xff0c;用完次数电脑自动…

测试开发(测试用例篇)

一 测试用例篇 1.测试用例的概念: 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合&#xff0c;这组集合包含&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素 2.测试用例的好处 测试执行者的依据 使得工作可重复&#xf…

STM32CubeIDE基础学习-RS232通信

STM32CubeIDE基础学习-RS232通信 文章目录 STM32CubeIDE基础学习-RS232通信前言第1章 工程配置第2章 代码编写第3章 实验现象总结 前言 RS232也是串口的一种&#xff0c;RS-232是由电子工业协会(Electronic Industries Association, EIA)所制定的异步传输标准接口。在1962年发布…

常用类(比较器、System类、Math类、BigInteger与BigDecimal)

目录 一、Java比较器1.1、概述1.2、Comparable自然排序举例1.3、自定义类实现Comparable自然排序1.4、使用Comparator实现定制排序 二、System类、Math类、BigInteger与BigDecimal2.1、System类2.2、Math类2.3、BigInteger与BigDecima 一、Java比较器 1.1、概述 Java中的对象…

物联网实战--入门篇之(五)嵌入式-IIC驱动(SHT30温湿度)

目录 一、IIC简介 二、IIC驱动解析 三、SHT30驱动 四、总结 一、IIC简介 不管是IIC还是串口&#xff0c;亦或SPI&#xff0c;它们的本质区别在于有各自的规则&#xff0c;就是时序图&#xff1b;它们的相同点就是只要你理解了时序图&#xff0c;你就可以用最普通的IO引脚模…

P6学习:Oracle Primavera P6 OBS/责任人解析

前言 Primavera P6 EPPM 责任人用于管理 P6 企业项目组合管理 (EPPM) 系统中的项目所有权和权限。 Primavera P6 EPPM 中的所有项目都至少围绕三个结构进行组织&#xff1a;称为企业项目结构 (EPS) 的用于组织项目的结构、称为工作分解结构 (WBS) 的用于组织项目内活动的结构…

书生·浦语全链路开源开放体系 第二期

文章目录 大模型背景大模型开发流程InternLM 2.0SFT与RLHFInternLM2主要亮点 书生浦语全链路开源开放体系数据-书生万卷InternLM-Train微调 XTuner评测工具 OpenCompass部署 LMDeploy智能体 Lagent智能体工具箱 AgentLego 大模型背景 专用模型&#xff1a;针对特定的任务&…

亚马逊测评新策略:解决底层环境防关联,提升下单成功率

对于做测评的环境系统&#xff0c;确保稳定性和成功率是非常重要的。市面上有各种环境方案&#xff0c;如虚拟机、模拟机、gcs、云手机、VPS等。然而&#xff0c;这些方案不仅成本高&#xff0c;而且成功率很低。因此&#xff0c;一个好的环境系统是成功的基础。 亚马逊平台的…

算法学习——LeetCode力扣动态规划篇5(198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III )

算法学习——LeetCode力扣动态规划篇5 198. 打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统…

echarts 图表/SVG 图片指定位置截取

echarts 图表/SVG 图片指定位置截取 1.前期准备2.图片截取3.关于drawImage参数 需求&#xff1a;如下图所示&#xff0c;需要固定头部legend信息 1.前期准备 echarts dom渲染容器 <div :id"barchart id" class"charts" ref"barchart">&…

动态规划-----背包类问题(0-1背包与完全背包)详解

目录 什么是背包问题&#xff1f; 动态规划问题的一般解决办法&#xff1a; 0-1背包问题&#xff1a; 0 - 1背包类问题 分割等和子集&#xff1a; 完全背包问题&#xff1a; 完全背包类问题 零钱兑换II: 什么是背包问题&#xff1f; 背包问题(Knapsack problem)是一种…

jsp中设置动态时间

第一步 在head中写入meta <head><meta charset"UTF-8" http-equiv"Refresh" content"1"> </head> 第二步在head中写入函数 <head><meta charset"UTF-8" http-equiv"Refresh" content"…

Mac m1 Flink的HelloWorld

首先在官方下载Downloads | Apache Flink 下载好压缩包后解压&#xff0c;得到Flink文件夹 进入&#xff1a;cd flink-1.19.0 ls 查看里面的文件&#xff1a; 执行启动集群 ./bin/start-cluster.sh 输出显示它已经成功地启动了集群&#xff0c;并且正在启动 standalonesessio…

基于YOLOV8+Pyqt5光伏太阳能电池板目标检测系统

1、YOLOV8算法 YOLOv8 是当前效果较好的目标检测 算法&#xff0c;它的核心网络来源于 DarkNet-53&#xff0c;该网络初次在 YOLOv3[11] 中被引入&#xff0c;并深受 ResNet[12] 的影响。DarkNet-53 使用了残差机制&#xff0c;并连续添加了卷积模块来加强其功能性。 这 53 层…

AI 音乐的 “ChatGPT“ 时刻,SunoV3简介和升级教程

一句话总结 Suno AI音乐平台发布了V3版本&#xff0c;标志着AI音乐创作领域的一个重要进步&#xff0c;类似于ChatGPT在文本生成领域的影响。 关键信息点 Suno AI是专注于生成式AI音乐的平台&#xff0c;最新发布的V3版本在音质、咬字和节奏编排上有显著提升。V3版本的AI音乐…

集成百兆,千兆,万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用

Hqst华轩盛(石门盈盛)电子导读&#xff1a;集成百兆&#xff0c;千兆&#xff0c;万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用 一 ﹑集成百兆&#xff0c;千兆&#xff0c;万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用前景 近年…