【Java】SpringBoot快速整合Redis

什么是Redis?

        文末有源码gitee地址

        【面试】浅学Redis_redis 广播-CSDN博客

        Redis是一种高性能开源的基于内存的,采用键值对存储的非关系型数据库,它支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。Redis的特点之一是数据存储在内存中,因此读写速度非常快。

以下是Redis的一些主要特点和作用:

  1. 高性能: Redis的数据存储在内存中,读写速度非常快,这使得它成为处理大量请求的理想选择。

  2. 数据结构丰富: Redis支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。这使得它可以应用于各种不同的场景,如缓存、消息队列、计数器等。

  3. 持久化: Redis可以通过将数据写入磁盘来实现持久化,以防止数据丢失。它支持两种持久化方式:RDB(快照)和AOF(日志文件)。

  4. 分布式: Redis支持分布式架构,可以将数据分布在多个节点上,提高系统的扩展性和容错性。

  5. 缓存: 作为缓存系统,Redis可以用于存储频繁访问的数据,以减轻数据库负载,提高访问速度。

  6. 消息队列: Redis的发布/订阅机制可以用作简单的消息队列,用于解耦系统的各个组件。

  7. 计数器: Redis的原子操作和高速性使其成为实现计数器功能的理想选择,例如网站的访问计数器。

  8. 事务支持: Redis支持事务,可以将多个命令包装在一个事务中,保证这些命令要么全部执行成功,要么全部失败。

Redis的5种数据存储结构和使用场景

存储结构包含:String字符串,List列表,Set集合,ZSet有序集合,Hash哈希

    String(字符串):
        适用场景:存储简单的键值对数据,如配置信息、计数器等。
        示例应用:缓存系统配置、用户token、简单计数器。

    Hash(哈希表):
        适用场景:存储对象的多个字段,方便获取和更新特定字段。
        示例应用:用户信息存储、对象属性存储。

    List(列表):
        适用场景:存储有序的元素列表,支持在两端进行元素的插入和删除。
        示例应用:消息队列、任务队列、实时消息推送。

    Set(集合):
        适用场景:存储不重复的元素集合,支持集合运算(交集、并集、差集)。
        示例应用:用户标签、共同关注的好友、无序集合数据。

    ZSet(有序集合):
        适用场景:类似Set,但每个元素都关联一个分数,用于支持元素的有序排列。
        示例应用:排行榜、按权重排序的任务队列。

如何使用呢?

String(字符串):

// 存储String类型数据
redisTemplate.opsForValue().set("greeting", "Hello, Redis!");// 读取String类型数据
String value = (String) redisTemplate.opsForValue().get("greeting");System.out.println(value);  // 输出: Hello, Redis!

Hash(哈希表):

// 存储Hash类型数据
redisTemplate.opsForHash().put("userDetails", "userId", "123");
redisTemplate.opsForHash().put("userDetails", "userName", "John Doe");// 读取Hash类型数据
String userId = (String) redisTemplate.opsForHash().get("userDetails", "userId");
String userName = (String) redisTemplate.opsForHash().get("userDetails", "userName");System.out.println(userId);  // 输出: 123
System.out.println(userName);  // 输出: John Doe

List(列表):

// 存储List类型数据
redisTemplate.opsForList().rightPushAll("tasks", "task1", "task2");// 读取List类型数据
List<String> tasks = redisTemplate.opsForList().range("tasks", 0, -1);System.out.println(tasks);  // 输出: [task1, task2]

Set(集合):

// 存储Set类型数据
redisTemplate.opsForSet().add("uniqueUsers", "user1", "user2", "user3");// 读取Set类型数据
Set<String> uniqueUsers = redisTemplate.opsForSet().members("uniqueUsers");System.out.println(uniqueUsers);  // 输出: [user1, user2, user3]

ZSet(有序集合):

// 存储ZSet类型数据
redisTemplate.opsForZSet().add("topScores", "player1", 100.0);
redisTemplate.opsForZSet().add("topScores", "player2", 150.0);// 读取ZSet类型数据(按分数从小到大排序)
Set<ZSetOperations.TypedTuple<Object>> topScores = redisTemplate.opsForZSet().rangeWithScores("topScores", 0, -1);for (ZSetOperations.TypedTuple<Object> tuple : topScores) {System.out.println(tuple.getValue() + " - " + tuple.getScore());
}
// 输出:
// player1 - 100.0
// player2 - 150.0

SpringBoot整合ElasticSearch的步骤:

1.代码层级结构

1. 添加依赖

在pom.xml中添加redis的依赖:

        <!--Redis的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
2. 配置redis连接信息

在application.properties或(application.yml)中配置redis连接信息,如下:

spring:data:redis:port: 6379username:password:host: 127.0.0.1
3.在业务层进行注入RedisTemplate
package com.example.springbootredis.service.impl;import com.example.springbootredis.domain.Courses;
import com.example.springbootredis.mapper.CoursesMapper;
import com.example.springbootredis.service.CoursesService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.Arrays;
import java.util.List;@Service
@Slf4j
public class CoursesServiceImpl implements CoursesService {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate CoursesMapper coursesMapper;@Overridepublic List<Courses> findAll() throws JsonProcessingException {// 从Redis缓存中进行获取String cachedSalaries = (String) redisTemplate.opsForValue().get("Salaries");if (cachedSalaries != null) {// 如果有直接进行返回log.info("从缓存中获取");return Arrays.asList(new ObjectMapper().readValue(cachedSalaries, Courses[].class));}// 如果redis缓存中没有,从数据库中进行查询,然后同步到缓存中List<Courses> courses = coursesMapper.findAll();if (!courses.isEmpty()) {// 同步到Redis缓存当中log.info("从数据库中获取,并同步到缓存当中");redisTemplate.opsForValue().set("Salaries", new ObjectMapper().writeValueAsString(courses));return courses;}return null;}}

上述只给出了Redis相关部分的代码,如果想进行测试,直接拉去gitee代码,然后在数据库中执行courses对应的sql,还有修改数据库用户名和密码即可测试。

测试结果:

 测试从数据查询和从redis缓存中查询的效率差别。

gitee下载地址:https://gitee.com/sophisticatedxin/springboot-redis.git

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习--Matplotlib

机器学习–Matplotlib Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进、交互式方式实现数据可视化 简单的Matplotlib画图 — 以折线图为例 matplotlib.pyplot模块 matplotlib.pytplot包含了一系列类似于matlab的画图函数。 import matplotlib.pyplot as plt图形绘制流…

STM32入门教程-2023版【4-1】OLED调试工具

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! 一、概述 在这一节先提前介绍一下&#xff0c;在以后的教程中我们会经常用到这个显示屏&#xff0…

HCIA的访问控制列表ACL

ACL -----access control-list 允许/拒绝 ACL作用&#xff1a; 1.实现访问控制 2.定义感兴趣流量 ACL分类&#xff1a; 标准ACL 2000-2999&#xff08;只关注源IP地址&#xff0c;使用时应该尽量靠近目标&#xff09; 扩展ACL 3000-3999&#xff1a;写ACL不能写在源上&…

Java基础知识整理,注释、关键字、运算符

写在开头 万丈高楼平地起&#xff0c;要想学好汉语首先学拼音&#xff0c;想学好英语首先学26个字母&#xff0c;对于编程语言来说&#xff0c;一样的道理&#xff0c;要想学好必须先掌握其基础语法和知识&#xff0c;今天我们就来唠一唠Java语言中那些出现频率极高&#xff0…

Linux:shell脚本:基础使用(8)《函数局部|全局变量函数传入位置变量return》

基本的函数定义 把一些重复调用的命令写进一个函数里&#xff0c;下次直接调用函数名&#xff0c;这样的既方便修改&#xff0c;又可以让思路清晰 function 函数名(){ 当调用这个函数时候执行的命令...... } 这个是一个基础的函数定义&#xff0c;当然你不加function也是可以的…

Three.js Tri-panner (三面贴图) 材质 两种实现方式

文章目录 介绍自定义shaderNodeMaterial修复&#xff1a;骨骼材质特殊处理修复&#xff1a;使用法相贴图时整体变色 介绍 Tri-panner 在babylonjs中有支持 但是three.js目前的基础材质并不支持 需要自己定义shader 或者使用目前还没有什么完善的文档的 NodeMaterial 下面展示两…

C++ 之LeetCode刷题记录(十三)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可…

为什么使用双token实现无感刷新用户认证?

单token机制 认证机制&#xff1a;对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处&#xff1a; 安全性较低(因为只有一个token在客户端和服务器端之间进行传递&#xff0c;一目Acess Token被截获或者被泄露…

卷级实时备份功能特点及应用场景

为满足部分对RTO和RPO指标敏感的用户需求&#xff0c;云祺科技通过结合卷远程复制技术和持续数据保护技术、以及高可用技术的原理&#xff0c;推出了一款基于卷为最小处理单元的实时容灾备份产品&#xff0c;其对于备份源对象具有良好的兼容性&#xff0c;无论是文件、影音、应…

如何做好一个信息系统项目经理,一个项目经理的个人体会和经验总结(一)

前言 作为一个信息系统项目经理&#xff0c;最要紧的就是要明白什么是因地制宜、因势利导&#xff0c;只有最合适的&#xff0c;没有什么叫对的&#xff0c;什么叫错的&#xff1b;最忌讳的就是完美主义倾向&#xff0c;凡事都要寻找标准答案和最优答案&#xff0c;既耽误了项…

【欢迎您的到来】这里是开源库get_local_info作者的付费专栏

您好&#xff0c; 我是带剑书生&#xff0c;开源库get_local_info的作者&#xff0c;欢迎您的到来&#xff0c;这里是我的付费专栏&#xff0c;会用更简洁的语言&#xff0c;更通俗的话语&#xff0c;来帮助您更好的学习rust&#xff0c;这里不仅仅讲解Rust在某些应用功能实现上…

Java项目:121SSM记账管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 记账管理系统基于SpringSpringMVCMybatis开发&#xff0c;系统主要功能如下&#xff1a; 收入项管理 支出项管理 收入方式管理 支出方式管理 添加收入…