spring boot+redis整合基础入门

news2025/1/18 3:42:14

文章目录

  • 前言
  • 准备
    • 依赖项
    • 配置文件
    • redis模板类注入设置序列化方式
  • 实施
    • 基础字符串操作、超时设置
    • Hash操作
      • hash的使用场景以及优缺点
    • 列表操作
      • 列表操作的应用场景以及优缺点
    • Set的基础操作
      • Set类型的业务场景以及优缺点
      • Demo地址
  • 总结

前言

最近项目中有用到redis进行一些数据的缓存,于是就想写一篇springboot集成redis的基础入门,也是给自己留一个可查看的地方,时刻能够提醒自己吧,后续应该会写一下进阶的redis的使用

准备

准备上redis的服务,以及搭建一个springboot项目框架,引入依赖

依赖项

		<!--redis的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

配置文件

spring:
  redis:
    host: localhost
    port: 6379
    lettuce:
      timeout: 5000 #(连接超时时间,单位为毫秒)
    database: 1

#   集群配置
#    spring:
#      redis:
#        password: 123456  #根据情况而定,看你的redis有没有密码设置
#        cluster:
#          nodes: 10.255.144.115:7001,10.255.144.115:7002,10.255.144.115:7003,10.255.144.115:7004,10.255.144.115:7005,10.255.144.115:7006
#          max-redirects: 3

# 连接池方式
#spring:
#  redis:
#    host: 10.255.144.111
#    port: 6379
#    password: 123456
#    database: 0
#    lettuce:
#      pool:
#        max-idle: 16
#        max-active: 32
#        min-idle: 8

redis模板类注入设置序列化方式

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        // 我们为了自己开发方便,一般直接使用 <String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(connectionFactory);
        // Json序列化配置
        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);
        // String 的序列化
        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;
    }

实施

基础字符串操作、超时设置

  //String 插入
    @Test
    void contextLoads() {
        String key = "zszxz";
        String value = "知识追寻者";
        redisTemplate.opsForValue().set(key, value);
    }
    // string 读取
    @Test
    public void testForValue(){
        String key = "zszxz";
        Object value = redisTemplate.opsForValue().get(key);
        // 知识追寻者
        System.out.println(value);
    }
    // string key过期时间入库
    @Test
    public void testForValueTimeOut(){
        String key = "today";
        String value = "周六";
        long time = 60;
        redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
    }
    // 测试 key 是否存在
    @Test
    public void testKeyIsExist(){
        String key = "zszxz";
        Boolean exist = redisTemplate.hasKey(key);
        // true
        System.out.println(exist);
    }
    // 设置 key 过期时间
    @Test
    public void testIsTimeOut(){
        String key = "zszxz";
        long time = 60;
        redisTemplate.expire(key, time, TimeUnit.SECONDS);
    }

    // 获取key过期时间
    @Test
    public void testGetKeyTimeOut(){
        String key = "zszxz";
        Long expire = redisTemplate.getExpire(key, TimeUnit.SECONDS);
        // 7
        System.out.println(expire);
    }

    // 删除key
    @Test
    public void testDeleteKey(){
        String key = "zszxz";
        redisTemplate.delete(key);
    }

Hash操作

   // 放入一个 hash ( key value )
    @Test
    public void testPushHash(){
        String key = "zszxz";
        String item = "name";
        String value = "知识追寻者";
        redisTemplate.opsForHash().put(key, item, value);
    }

    // 向hash中存放一个map
    @Test
    public void testPushMap(){
        String key = "feature";
        Map<String, Object> map = new HashMap<>();
        map.put("name", "知识追寻者");
        map.put("age", "18");
        redisTemplate.opsForHash().putAll(key, map);
    }

    // 获取一个hash 的 所有key-value
    @Test
    public void testGekHashAllData(){
        String key = "feature";
        Map<Object, Object> entries = redisTemplate.opsForHash().entries(key);
        // {name=知识追寻者, age=18}
        System.out.println(entries);
    }

    // 获取一个hash 的 指定key 的value
    @Test
    public void testGetHashByKey(){
        String key = "feature";
        String item = "name";
        Object value = redisTemplate.opsForHash().get(key, item);
        // 知识追寻者
        System.out.println(value);
    }

    // 删除指定 hash key 的value
    @Test
    public void testDeleteHashByKey(){
        String key = "zszxz";
        String item = "name";
        redisTemplate.opsForHash().delete(key, item);
    }

    // 是否存在 指定 hash 的key
    @Test
    public void testIsHashKeyExist(){
        String key = "zszxz";
        String item = "name";
        Boolean exist = redisTemplate.opsForHash().hasKey(key, item);
        // false
        System.out.println(exist);
    }

hash的使用场景以及优缺点

Redis 中的 Hash 数据类型适用于以下业务场景:

  1. 对象存储:当需要存储和访问复杂对象时,可以将对象的属性作为 Hash 的字段,字段值作为对应属性的值。这样可以将一个完整对象存储在一个 Hash 中,方便操作和管理。

  2. 缓存场景:在缓存中存储一些结构化的数据,例如用户信息、配置项等。通过 Hash 可以有效地组织和管理这些数据,减少缓存键的数量,提高查询效率。

  3. 统计和计数器:使用 Hash 可以方便地存储和更新统计数据和计数器,例如网站的访问次数、文章的点赞数等。通过 Hash 提供的自增和自减操作,可以高效地实现计数功能。

  4. 表示关系:在需要表示关系的场景中,可以将关联关系存储为 Hash 的字段,字段值表示关系的描述或其他附加信息。这样可以清晰地表示不同实体之间的关系。

Hash 的优点包括:

  • 结构清晰:Hash 存储的数据结构清晰,字段名和字段值之间有明确的映射关系,方便理解和操作。
  • 灵活性高:Hash 可以存储不同类型的字段和值,支持各种复杂的数据结构和对象存储需求。
  • 查询效率高:通过字段名直接访问字段值,查询操作的时间复杂度为 O(1)。

Hash 的缺点包括:

  • 存储空间占用相对较高:由于每个 Hash 对象都需要存储字段名和字段值的映射关系,因此占用的存储空间较多。
  • 不支持单字段更新:当需要更新 Hash 中的某一个字段时,需要先获取整个 Hash 对象并进行修改,然后再写回数据库。
  • 不适用于大规模数据存储:当 Hash 中的字段数量很多时,操作和维护都会变得复杂,不适合存储大规模的数据。

列表操作

// 列表右推入
@Test
public void testRightPush(){
    String key = "zszxz";
    String value = "知识追寻者";
    redisTemplate.opsForList().rightPush(key, value);
}

// 列表左推入
@Test
public void testLeftPush(){
    String key = "zszxz";
    String value = "晴雨天";
    redisTemplate.opsForList().leftPush(key, value);
}
// 列表左弹出
@Test
public void testLeftPop(){
    String key = "zszxz";
    Object value = redisTemplate.opsForList().leftPop(key);
    // 晴雨天
    System.out.println(value);

}
// 列表右弹出
@Test
public void testRightPop(){
    String key = "zszxz";
    Object value = redisTemplate.opsForList().rightPop(key);
    // 知识追寻者
    System.out.println(value);
}

// 将list右推入列表
@Test
public void testListRightPushAll(){
    List<Object> list = new ArrayList<>();
    list.add(12);
    list.add(22);
    list.add(32);
    String key = "number";
    redisTemplate.opsForList().rightPushAll(key, list);

    //根据key获取key对应的集合信息
    List<Object> listValue = redisTemplate.opsForList().range(key, 0, -1);
    for (Object o:listValue)
        System.out.println(o);
}

// 修改列表指定索引的值
@Test
public void testUpdateByIndex(){
    String key = "number";
    int index = 0;
    int value = 666;
    redisTemplate.opsForList().set(key, index, value);
}
// 获取列表指定索引的值
@Test
public void testByIndex(){
    String key = "number";
    int index = 0;
    Object value = redisTemplate.opsForList().index(key, index);
    // 666
    System.out.println(value);
}

列表操作的应用场景以及优缺点

Redis 中的列表数据类型适用于以下业务场景:

  1. 消息队列:通过列表实现消息队列,将任务或消息存储在列表尾部,消费者从列表头部获取任务或消息并进行处理。由于 Redis 提供了多种阻塞式读取列表的方法,因此可以实现高效的异步任务处理和发布订阅功能。

  2. 实时排名:通过列表存储用户访问次数、商品销量等排名信息,使用 Redis 提供的自增和排序操作可以快速地更新和查询排名数据。

  3. 时间轴:通过列表存储和查询时间轴上的事件数据,例如聊天室中的历史消息、微博中的动态等。通过 Redis 提供的切片操作,可以实现按照时间范围查询数据和分页显示等功能。

  4. 历史记录:通过列表存储用户的搜索记录、浏览记录等历史数据,并可以通过 Redis 提供的去重、分页等操作进行查询和展示。

列表的优点包括:

  • 可以方便地支持队列、栈等多种数据结构。
  • 可以支持快速的随机访问和遍历操作。
  • 无须预先定义长度,支持动态增长和缩容。
  • 支持多种操作,如插入、删除、修剪、合并、排序、查询等。

列表的缺点包括:

  • 在插入和删除操作频繁的场景中,列表的性能可能会有影响。
  • 在查询和遍历大型列表时,需要消耗大量内存和网络资源。
  • 列表数据无法持久化到磁盘中,重启后数据将被清空。

Set的基础操作

    // set 中存储值
    @Test
    public void testSetPush(){
        String key = "zszxz";
        String value1 = "晴雨天";
        String value2 = "公众号:知识追寻者";
        redisTemplate.opsForSet().add(key, value1, value2);
    }

    // 从 set 中取值
    @Test
    public void testGetValue(){
        String key = "zszxz";
        Set<Object> members = redisTemplate.opsForSet().members(key);
        // [晴雨天, 公众号:知识追寻者]
        System.out.println(members);
    }

    // 判定 set 中是否存在 key-value
    @Test
    public void testSetIsExist(){
        String key = "zszxz";
        String value = "晴雨天";
        Boolean member = redisTemplate.opsForSet().isMember(key, value);
        // true
        System.out.println(member);
    }

Set类型的业务场景以及优缺点

Redis 中的集合数据类型(Set)适用于以下业务场景:

  1. 标签和分类:使用集合可以方便地管理标签或分类信息。每个元素表示一个标签或分类,可以进行添加、删除、查询等操作,同时还可以计算交集、并集、差集等集合运算。

  2. 好友关系:通过集合可以表示用户之间的好友关系。每个集合表示一个用户的好友列表,可以使用集合操作来实现添加好友、查找共同好友、推荐好友等功能。

  3. 去重:集合中的元素是唯一的,因此可以用于对数据进行去重操作。将需要去重的数据存储在集合中,可以方便地去除重复数据并保留唯一值。

  4. 兴趣爱好:使用集合可以表示用户的兴趣爱好。每个集合表示一个用户的兴趣集合,可以进行集合运算来计算用户之间的相似度或偏好匹配。

集合的优点包括:

  • 支持快速的元素查找和判断是否存在。
  • 提供了多种集合操作,如并集、交集、差集等,方便对多个集合进行操作和计算。
  • 集合中的元素是唯一的,可以方便地进行去重操作。
  • 集合操作的时间复杂度为 O(n),适用于大规模数据的处理。

集合的缺点包括:

  • 不支持按照特定顺序排序元素。
  • 集合操作的性能随着元素数量增加而降低,当集合中元素过多时,操作可能会变慢。
  • 集合数据无法持久化到磁盘中,重启后数据将被清空。

可以使用RedisDesktopManager查看redis中的存储情况
在这里插入图片描述

Demo地址

总结

对于redis的简单使用springboot已经帮助我们做了集成,给我们封装了很多的api,只要借助提供的api就可以快速入门,但是到入土还需要一些时间。

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

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

相关文章

【Linux】编译器 gcc/g++

1、背景知识 &#xff08;1&#xff09;[LMYhecs-38755 ~]$ gcc code.c -o code.exe -stdc99【-o 生成指定名字的可执行文件&#xff0c;-stdc99 以 C99 的标准执行程序】 &#xff08;2&#xff09;安装 g&#xff0c;yum install gcc-c 2、gcc如何完成 &#xff08;1&#x…

如何使用 Node.js和Express搭建服务器?

如何使用NodeJs搭建服务器 1. 准备工作1.1 安装Node.js 2. 安装express2.1 初始化package.json2.2 安装express2.3 Express 应用程序生成器 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段…

前端面试合集(三——浏览器)

浏览器的页面渲染 1.浏览器是如何渲染页面的&#xff1f;2. 什么是reflow(重排&#xff09;&#xff1f;3. 什么是repaint(重绘&#xff09;&#xff1f;4.为什么transform效率高&#xff1f; 1.浏览器是如何渲染页面的&#xff1f; 当浏览器的网络线程收到HTML文档之后&#…

Leetcode刷题_链表相关_c++版

&#xff08;1&#xff09;92反转链表–中等 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 /*** Definition for singly-linked list.* struct Lis…

Claude: ChatGPT替代大语言模型

【产品介绍】 Claude是Anthropic推出的类ChatGPT大语言模型&#xff0c;也是一个AI人工智能助理&#xff0c;可以帮助各种行业的用户处理工作&#xff0c;如客户服务、法律、教练、搜索和销售。Claude可以通过聊天界面和API进行访问&#xff0c;能够完成各种对话和文本处理任务…

计算机二级知识点整理

翻到了之前准备计算机二级的笔记&#xff0c;现在给大家分享出来。 一、基本知识&#xff1a; 计算机把完成一条指令所花费的时间称为一个指令周期结构化程序设计强调的是程序的易读性boolean类型不能转为其他基本类型数据表达式是由运算符和运算对象构成的&#xff0c;#不是…

SimpleCG程序交互操作

前言 之前所有示例程序都是属于展示型的&#xff0c;只是作为展示板输出使用&#xff0c;不涉及键盘和鼠标的输入交互&#xff0c;下面我们开始接触具有交互功能的程序。 没有交互功能的程序可以满足一定需求,不过大部分的程序是不能脱离交互功能的。程序依据使用者的操作进行相…

Error response from daemon

文章目录 遇到的问题解决方法参考 遇到的问题 当输入下面的指令时 docker pull xxxxxx解决方法 打开/etc/docker/daemon.json文件 vim /etc/docker/daemon.json写入以下内容&#xff1a; {"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]…

OpenCV 图像像素运算操作

加法操作详解 加减乘除 #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat image imread("image.jpg");if (image.empty()) {std::cout << "无法加载图像" << std::endl;return -1;}// 加法变换Mat addResult;add(ima…

mac在vscode编码过程中输入()光标在里面的时候想移出来还得动用左右键很麻烦有什么快捷方法

下载vscode插件: 想跳出大括号的时候就可以使用tab直接跳出来就行了

Buuctf web [SUCTF 2019]EasySQL

又是一道考察sql注入的题 1、起手试探 &#xff08;主要看看输入什么内容有正确的回显&#xff09; 1 0 1 1 # 发现只有在输入1的情况下有正常的回显,输入0或其他字符都没有回显&#xff0c;所以这题就要尝试堆叠注入了。 ps&#xff1a;&#xff08;如果想尝试其他注入方法…

带你打穿三层内网-红日靶场七

文章目录 前记环境配置web1信息搜集cve-2021-3129redis未授权|ssh密钥后渗透 Win7&#xff08;PC1&#xff09;永恒之蓝 web2docker逃逸 win7&#xff08;PC2&#xff09;|DC 前记 所用工具 msfcsvenomfrp蚁剑冰蝎laravel.pyfscan 注意事项 msf的永恒之蓝每次都需要两次才能…

VM-Linux基础操作命令

命令执行的本质&#xff1a; 当输入命令&#xff08;单词&#xff09;后敲击回车的那一刻。它就会立刻到以下图片&#xff0c;变量中的文件中去找对应的可执行文件 此路径又叫环境变量 1.shell命令提示符 默认&#xff1a;[rootlocalhost ~]# root&#xff1a;现已登录的账户名…

重构优化第三方查询接口返回大数据量的分页问题

# 问题描述 用户线上查询其上网流量详单数据加载慢&#xff0c;且有时候数据没有响应全~ 1、经排除是调用第三方数据量达10w条响应会超时&#xff0c;数据没正常返回 2、现有线上缓存分页也是加载慢数据不能正常展示 3、第三方接口返回类似报文jsonj&#…

基于Yolov8的光伏电池缺陷检测,引入ICCV2023 动态蛇形卷积和独家全网首发多维协作注意模块MCA,实现涨点创新十足

1.光伏电池缺陷数据集介绍 背景&#xff1a;太阳能作为一种极具吸引力的替代电力能源&#xff0c;太阳能光伏电池&#xff08;即光伏电池&#xff09;是太阳能发电系统的基础&#xff0c;一般情况下&#xff0c;电池中的各类缺陷会直接影响到光伏电池的光电转化效率和使用寿命…

Mybatis-Genertor逆向工程

1、导入mybaties插件 <build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.2</version><dependencies><dependency>…

Android Fragment

基本概念 Fragment是Android3.0后引入的一个新的API&#xff0c;他出现的初衷是为了适应大屏幕的平板电脑&#xff0c; 普通手机开发也会加入这个Fragment&#xff0c; 可以把他看成一个小型的Activity&#xff0c;又称Activity片段&#xff01; 如果一个很大的界面&#xff…

视频直播点播平台EasyDSS创建用户详细操作来啦!

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 由于旭帆科技的EasyDSS平台支持新建用户&#xff0c;但新建时用户…

Python 图片处理笔记

import numpy as np import cv2 import os import matplotlib.pyplot as plt# 去除黑边框 def remove_the_blackborder(image):image cv2.imread(image) #读取图片img cv2.medianBlur(image, 5) #中值滤波&#xff0c;去除黑色边际中可能含有的噪声干扰#medianBlur( Inp…

懒汉式之并发安全问题

在高并发场景下的懒汉式创建对象&#xff0c;造成ID重复创建&#xff0c;代码见下图&#xff1a; 并发场景下&#xff0c;iDCreator对象并未随类的创建而创建&#xff0c;而是在需要的时候进行创建&#xff0c;导致垃圾回收器可以对其进行回收&#xff0c;从而有可能同一时间戳…