Redis在项目中的应用

2023-11-10

在aop模式下使用redis 的方式

(1)添加依赖

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.2.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

(2)配置文件中配置application.yml

spring:
  redis:
    host: 192.168.126.129  #写自己的ip
    port: 6379

(3)创建启动类,如果用注解方式需要在此处添加注解(@EnableCache)

package com.jt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//@EnableCache
@SpringBootApplication
public class RedisApplication {
    public static void main(String[] args) {
        SpringApplication.run(RedisApplication.class,args);
    }
}

(4)获取菜单基于restemplate(方式一)

package com.jt.service;
import com.jt.dao.MenuMapper;
import com.jt.pojo.Menu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.Duration;

@Service
public class MenuServiceImpl implements MenuService{
    @Autowired
    private MenuMapper menuMapper;

   // @Autowired
   // private RedisTemplate redisTemplate;

    @Resource(name="redisTemplate")
    private ValueOperations valueOperations;//从spring.io官方的data项目中去查这种注入方式
    /**
     * 基于id查询菜单信息,要求:
     * 1)先查redis,redis没有去查mysql
     * 2)将从mysql查询到的数据存储到redis
     * @param id
     * @return
     */
    @Override
    public Menu selectById(Long id) {
        //ValueOperations valueOperations = redisTemplate.opsForValue();
        Object obj=valueOperations.get(String.valueOf(id));
        if(obj!=null){
            System.out.println("Get Data from redis");
            return (Menu)obj;
        }
        Menu menu=menuMapper.selectById(id);
        valueOperations.set(String.valueOf(id), menu, Duration.ofSeconds(120));
        return menu;
    }
    @Override
    public Menu insertMenu(Menu menu) {
        menuMapper.insert(menu);
       // ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set(String.valueOf(menu.getId()), menu, Duration.ofSeconds(120));
        return menu;
    }
    @Override
    public Menu updateMenu(Menu menu) {
        menuMapper.updateById(menu);
       // ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set(String.valueOf(menu.getId()), menu, Duration.ofSeconds(120));
        return menu;
    }
}

(5)获取菜单基于注解(AOP方式,方式二)

package com.jt.service;

import com.jt.dao.MenuMapper;
import com.jt.pojo.Menu;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class DefaultMenuService implements MenuService{
    @Autowired
    private MenuMapper menuMapper;

    /**
     * 由此注解描述的方法为切入点方法,此方法执行时,底层会通过AOP机制
     * 先从缓存取数据,缓存有则直接返回,缓存没有则查数据,最后将查询的数据
     * 还会向redis存储一份
     * @param id
     * @return
     */
    @Cacheable(value = "menuCache",key="#id")
    @Override
    public Menu selectById(Long id) {
        return menuMapper.selectById(id);
    }

    /**
     * CachePut注解的意思是更新缓存
     * @param menu
     * @return
     */
    @CachePut(value = "menuCache",key="#menu.id")
    @Override
    public Menu insertMenu(Menu menu) {
         menuMapper.insert(menu);
         return menu;
    }

    @CachePut(value = "menuCache",key="#menu.id")
    @Override
    public Menu updateMenu(Menu menu) {
        menuMapper.updateById(menu);
        return menu;
    }
}

(6)设置redis中的序列化格式

package com.jt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * 重构CacheManager对象,其目的是改变AOP方式应用redis的序列化和反序列化的方式.
 */
@Configuration
public class CacheManagerConfig {
    /**
     * 重构CacheManager对象
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        //定义RedisCache配置
        RedisCacheConfiguration cacheConfig=
                RedisCacheConfiguration.defaultCacheConfig()
        //定义key的序列化方式
        .serializeKeysWith(
                RedisSerializationContext.
                   SerializationPair.fromSerializer(RedisSerializer.string()))
        //定义value的序列化方式
        .serializeValuesWith(
                RedisSerializationContext.SerializationPair
                .fromSerializer(RedisSerializer.json()));

        return  RedisCacheManager.builder(redisConnectionFactory)
               .cacheDefaults(cacheConfig)
               .build();//建造者模式(复杂对象的创建,建议使用这种方式,封装了对象的创建细节)
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis在项目中的应用 的相关文章

  • 在 JTable 中移动行

    我使用 MVC 模式 并且有一个如下所示的 JTable List
  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • deepin v20安装mysql

    deepin v20 换源和安装mysql 由于deepin v20不能直接安装mysql所以先进行换源 更换成阿里源 这样以后速度可以更快 修改文件 sudo vim etc apt sources list 删除内容 并添加以下内容 G
  • DDlog语言特征

    原文地址 这里写链接内容 DDlog是一种语法为datalog式 用来编写DeepDive应用的语言 一个ddlog程序会被编译成deepdive格式下的配置文件 我们通常用这个文件来运行我们的应用 一个ddlog程序由一组声明组成 这些声
  • 【Doxygen】Vscode 插件 DoxyGen Documentation Generator C语言详细设置

    DoxyGen Documentation Generatorc 这个VsCode插件可以设置C C 的doxygen格式自动填充 本文只介绍C语言的json文件配置 触发方式 doxdocgen c triggerSequence 输入
  • Eclipse查看JDK源码

    1 找到jdk 2 配置rt的源码
  • 关于Connection aborted等问题的解决

    错误类型 在爬虫中报如下的错误 requests exceptions ConnectionError Connection aborted RemoteDisconnected Remote end closed connection w
  • Win10远程桌面连接怎么用?(远程桌面连接教程)

    怎么开启远程桌面连接 电脑远程桌面连接怎么用 要使用远程桌面控制电脑 您需先在电脑上开启远程桌面连接并且两台电脑还需在同一个局域网中 否则您的设置端口转发才能使用远程桌面连 那么怎么开启远程桌面连接呢 具体操作步骤如下 步骤1 在Win10
  • Redis的String常用命令

    Redis 基础知识 不想key被更改 再key的后面加上nx eg 127 0 0 1 6379 gt set s 11 OK 127 0 0 1 6379 gt set ss 111 OK 127 0 0 1 6379 gt renam
  • Jest 单元测试术语解析:describe、it、expect、test

    jest测试代码片段 describe number test gt it 1 is true gt expect 1 toBeTruthy test 2 is true gt expect 2 toBeTruthy describe 描述
  • Vue研习录(08)——Vue引入Swiper知识详解及示例分析

    Vue研习录 08 Vue引入Swiper知识详解及示例分析 版权声明 一 Swiper 版权声明 本文原创作者 清风不渡 博客地址 https blog csdn net WXKKang 重拾前端记忆 记录学习笔记 现在进入Vue引入Sw
  • uniapp的webview实现左滑返回上一个页面

    uniapp默认左滑是关闭整个webview 而不是关闭当前页 实现思路 拦截webview的url跳转操作 将新url用webview组件重新打开 当左滑的时候 默认关闭的就是当前webview 继而跳转到上一次的页面中
  • 100 道 Linux 常见面试题,慢慢读~

    1 Linux 概述 1 1 什么是 Linux Linux 是一套免费使用和自由传播的类 Unix 操作系统 是一个基于 POSIX 和 Unix 的多用户 多任务 支持多线程和多 CPU 的操作系统 它能运行主要的 Unix 工具软件
  • 关于对话机器人,你需要了解这些技术

    对话系统 对话机器人 本质上是通过机器学习和人工智能等技术让机器理解人的语言 它包含了诸多学科方法的融合使用 是人工智能领域的一个技术集中演练营 图1给出了对话系统开发中涉及到的主要技术 对话系统技能进阶之路 图1给出的诸多对话系统相关技术
  • Linux SELinux

    Security Enhanced Linux SELinux 是一种Linux系统的安全体系结构 允许管理员对系统访问权限进行更精细的控制 它最初由美国国家安全局 NSA 开发 使用Linux安全模块 LSM 对Linux内核打了一系列补
  • emd分解MATLAB自带函数

    matlab 2018开始自带了emd和hht函数 现将emd函数用法总结如下 imf residual info emd x Interpolation pchip 或者 emd x Interpolation pchip 输入参数 x
  • DataWhale Linux——Task01 Linux简介

    目录 什么是Linux Linux的优点 常用发行版 什么是Linux Linux 全称为GNU Linux 是一种免费使用和自由传播的类UNIX操作系统 我们常说的Linux 是指Linux内核 Linux的优点 开源免费 多用户 多任务
  • 预备1-window常用快捷键

    window常用快捷键 快捷键有很多很多 开发程序 刚入门只需要掌握简单的 菜单键 和书本一样的按键 鼠标的右键 1 查看 菜单 v gt gt gt gt 常用于 隐藏桌面图标 gt gt gt 菜单 v d 2 刷新 菜单键 E 3 新
  • 多功能透明屏,在智能家居领域中,有哪些功能特点?显示、连接

    多功能透明屏是一种新型的显示技术 它能够在透明的表面上显示图像和视频 并且具有多种功能 这种屏幕可以应用于各种领域 如商业广告 智能家居 教育等 为用户提供更加便捷和多样化的体验 首先 多功能透明屏可以用于商业广告 传统的广告牌通常是单一的
  • 一文教你如何用C代码解析一段网络数据包?【含代码】

    本文的目的是通过随机截取的一段网络数据包 然后根据协议类型来解析出这段内存 学习本文需要掌握的基础知识 网络协议 C语言 Linux操作 抓包工具的使用 其中抓包工具的安装和使用见下文 一文包你学会网络数据抓包 视频教学链接如下 教你如何抓
  • shell编写监控httpd服务80端口脚本.间隔3秒监控端口如果服务关闭自动重启

    bin bash 实时每隔3秒监控HTTP服务状态 服务异常输出报警信息 并尝试启动 服务正常时提示正常运行 web netstat ant grep 80 awk print 4 awk F print 4 apachelog var l
  • Redis在项目中的应用

    在aop模式下使用redis 的方式 1 添加依赖