SpringBoot 2.x 整合 Redis

整合

1)添加依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 如果没有使用下面给出的工具类,那么就不需要引入 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.2.4</version>
</dependency>

2)application.xml 配置

spring:
  redis:
    database: 0
    # ip 或者域名
    host: 192.168.224.128
    # 密码
    password: TO6Md91Advf
    # redis 默认端口是 6379
    port: 6379

3)配置 RedisTemplate

这里替换序列化器是因为 , RedisTemplate 默认的序列化方案是 JdkSerializationRedisSerializer,它将对象序列化为字节数组。

@Configuration
public class RedisTemplateConfig {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 自定义的string序列化器
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        // jackson 序列化器
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

        // kv 序列化
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(jsonRedisSerializer);

        // hash 序列化
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);

        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }
}

使用例子

1)Redis 使用工具类

public class RedisUtil {

    @SuppressWarnings("unchecked")
    private static RedisTemplate<Object, Object> redisTemplate = SpringUtil.getBean("redisTemplate", RedisTemplate.class);

    /**
     * 指定键的值增加
     * @param key 键
     * @param num  要增加的数
     * @return
     */
    public static int incrementInt(String key,int num){
        Long increment = redisTemplate.opsForValue().increment(key,num);
        return increment.intValue();
    }
    /**
     * 指定缓存失效时间
     *
     * @param key  键
     * @param time 时间(秒)
     */
    public static void expire(String key, long time) {
        if (time > 0) {
            redisTemplate.expire(key, time, TimeUnit.SECONDS);
        }
    }

    public static long getExpire(String key){
        return redisTemplate.getExpire(key);
    }

    /**
     * 普通缓存获取
     *
     * @param key 键
     * @return 值
     */
    public static Object get(String key) {
        return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 获取数据
     *
     * @param key 键
     * @return 对应的键值
     */
    public static Map<Object, Object> getMap(String key) {
        return redisTemplate.opsForHash().entries(key);
    }


    /**
     * 缓存放入
     *
     * @param key   键
     * @param value 值
     */
    public static void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 缓存放入
     *
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     */
    public static void set(String key, Object value, long time) {
        if (time > 0) {
            redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        } else {
            set(key, value);
        }
    }

    /**
     * Map 缓存放入
     * @param key  键
     * @param map  对应多个键值
     */
    public static void putMap(String key, Map<Object, Object> map) {
        redisTemplate.opsForHash().putAll(key, map);
    }

    /**
     * Map 缓存放入
     *
     * @param key  键
     * @param map  对应多个键值
     * @param time 时间(秒)
     */
    public static void putMap(String key, Map<Object, Object> map, long time) {
        redisTemplate.opsForHash().putAll(key, map);
        if (time > 0) {
            expire(key, time);
        }
    }

    /**
     * list 缓存放入,尾部添加
     * @param key 键
     * @param value 值
     */
    public static void pushList(String key, Object value) {
        redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * list 缓存放入,尾部添加, 批量存放 list
     * @param key
     * @param list
     */
    public static void pushListAll(String key, List<Object> list) {
        if (list != null){
            redisTemplate.opsForList().rightPushAll(key, list);
        }
    }

    /**
     * 通过 key 获取 list
     */
    public static List<Object> getAllList(String key){
        return redisTemplate.opsForList().range(key, 0, -1);
    }

}

2)TestRdsController

如果没有使用 lomback,swagger,可以将对应的注解删除掉

/**
 * 用于测试 rds
 * @author fei
 *
 */
@Slf4j
@RestController
@RequestMapping("/")
@Api(value = "测试 RDS API", tags = {"测试 RDS API"})
public class TestRdsController extends BaseController {

    @Autowired
    TestRdsService testRdsService;

    @GetMapping(value = "/rds/setString")
    @OperationLog(name="set String",type = OperationLogType.CREATE)
    @ApiOperation(value = "set String")
    public String rdsSetString(@ApiParam(value = "key", required = true) @RequestParam(value = "key")String key,
                                          @ApiParam(value = "value", required = true) @RequestParam(value = "value")String value) {
        testRdsService.rdsSetString(key, value);
        return "操作成功!");
    }

    @GetMapping(value = "/rds/getString")
    @ApiOperation(value = "get String")
    public String rdsGetString(@ApiParam(value = "key", required = true) @RequestParam(value = "key")String key) {
        String value = testRdsService.rdsGetString(key);
        return value;
    }

    @GetMapping(value = "/rds/putMap")
    @ApiOperation(value = "putMap")
    public String rdsPutMap(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key,
                    @ApiParam(value = "name", required = true) @RequestParam(value = "name") String name,
                    @ApiParam(value = "age", required = true) @RequestParam(value = "age") Integer age) {
        testRdsService.putMap(key, name, age);
        return "操作成功";
    }

    @GetMapping(value = "/rds/getMap")
    @ApiOperation(value = "getMap")
    public Map<Object, Object> getMap(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key) {
        Map<Object, Object> map = testRdsService.getMap(key);
        return map;
    }

    @GetMapping(value = "/rds/pushList")
    @ApiOperation(value = "list 缓存放入,尾部添加")
    public String pushList(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key,
                                                   @ApiParam(value = "value", required = true) @RequestParam(value = "value") Object value) {
        testRdsService.pushList(key, value);
        return "操作成功";
    }

    @GetMapping(value = "/rds/pushAllList")
    @ApiOperation(value = "将list数据全部放入 list 缓存")
    public String pushAllList(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key,
                                      @ApiParam(value = "list", required = true) @RequestParam(value = "list") List<Object> list) {
        testRdsService.pushListAll(key, list);
        return "操作成功";
    }

    @GetMapping(value = "/rds/getAllList")
    @ApiOperation(value = "通过 key 获取所有 list")
    public List<Object> getAllList(@ApiParam(value = "key", required = true) @RequestParam(value = "key") String key) {
        List<Object> allList = testRdsService.getAllList(key);
        return allList;
    }

}

3)TestRdsService

/***
 * @author fei
 * @create 2024/11/20 9:12
 **/
public interface TestRdsService {

    void rdsSetString(String key, String value);

    String rdsGetString(String key);

    void putMap(String key, String name, Integer age);

    Map<Object, Object> getMap(String key);

    void pushList(String key, Object value);

    void pushListAll(String key, List<Object> list);

    List<Object> getAllList(String key);

}

4)TestRdsServiceImpl

/***
 * @author fei
 * @create 2024/11/20 9:12
 **/
@Service
public class TestRdsServiceImpl implements TestRdsService {

    @Override
    public void rdsSetString(String key, String value) {
        RedisUtil.set(key, value);
    }

    @Override
    public String rdsGetString(String key) {
        Object o = RedisUtil.get(key);
        if (o == null){
            return "";
        }
        return (String)o;
    }

    @Override
    public void putMap(String key, String name, Integer age) {
        Map<Object, Object> map = new HashMap<>();
        map.put("name", name);
        map.put("age", age);
        RedisUtil.putMap(key, map, 10000);
    }

    @Override
    public Map<Object, Object> getMap(String key) {
        return RedisUtil.getMap(key);
    }

    @Override
    public void pushList(String key, Object value) {
        RedisUtil.pushList(key, value);
    }

    @Override
    public void pushListAll(String key, List<Object> list) {
        RedisUtil.pushListAll(key, list);
    }

    @Override
    public List<Object> getAllList(String key) {
        return RedisUtil.getAllList(key);
    }

}

5)测试

最后可以使用 swagger 或者 Apifox 等工具调用接口测试,或者直接写个测试用例也可以

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing

tips&#xff1a; 本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title&#xff1a; Content-Aware Scalable Deep Compressed Sensing Journal&#xff1a; TIP 2022 代码链接&#xff1a; https://github.com/Guaishou74851/CASNet…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回&#xff1f; 其实统一数据返回是运用了AOP&#xff08;对某一类事情的集中处理&#xff09;的思维。 优点&#xff1a; 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本&#xff0c;因为所有接⼝都…

window 中安装 php 环境

window 中安装 php 环境 一、准备二、下载三、安装四、测试 一、准备 安装前需要安装 Apache &#xff0c;可以查看这篇博客。 二、下载 先到这里下载 这里选择版本为“VS16 x64 Thread Safe”&#xff0c;这个版本不要选择线程安全的&#xff0c;我试过&#xff0c;会缺少文…

HarmonyOS Next 关于页面渲染的性能优化方案

HarmonyOS Next 关于页面渲染的性能优化方案 HarmonyOS Next 应用开发中&#xff0c;用户的使用体验至关重要。其中用户启动APP到呈现页面主要包含三个步骤&#xff1a; 框架初始化页面加载布局渲染 从页面加载到布局渲染中&#xff0c;主要包含了6个环节&#xff1a; 执行页…

【Linux网络编程】简单的UDP套接字

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 三&#xff0c;UDP套接字的应用 3-1&#xff0c;实现英译汉字典 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信…

【WPF】Prism学习(十)

Prism MVVM 1.BindableBase 1.1. BindableBase的作用&#xff1a; Prism库提供了一个基础类BindableBase&#xff0c;这个类实现了INotifyPropertyChanged接口。这个接口允许ViewModel&#xff08;视图模型&#xff09;通知视图&#xff08;View&#xff09;当属性&#xff0…

计算机网络学习笔记-3.3以太网和局域网

以太网 以太网&#xff08;Ethernet&#xff09;是一种用于计算机网络的技术规范&#xff0c;广泛应用于局域网&#xff08;LAN&#xff09;的构建。它定义了如何在网络设备之间传输数据&#xff0c;并确保这些数据能够被可靠传送。以太网是目前最常见和最广泛使用的局域网技术…

聊一聊Elasticsearch的索引分片的恢复机制

1、什么是索引分片的恢复&#xff1f; 所谓索引分片的恢复指的是在某些条件下&#xff0c;索引分片丢失&#xff0c;ES会把某索引的分片复制一份来得到该分片副本的过程。 2、触发分片恢复的场景有哪些&#xff1f; 分片的分配 当集群中节点的数量发生变化&#xff0c;或者配…

LLaMA-Factory 上手即用教程

LLaMA-Factory 是一个高效的大型语言模型微调工具&#xff0c;支持多种模型和训练方法&#xff0c;包括预训练、监督微调、强化学习等&#xff0c;同时提供量化技术和实验监控&#xff0c;旨在提高训练速度和模型性能。 官方开源地址&#xff1a;https://github.com/hiyouga/L…

NVR接入录像回放平台EasyCVR视频融合平台加油站监控应用场景与实际功能

在现代社会中&#xff0c;加油站作为重要的能源供应点&#xff0c;面临着安全监管与风险管理的双重挑战。为应对这些问题&#xff0c;安防监控平台EasyCVR推出了一套全面的加油站监控方案。该方案结合了智能分析网关V4的先进识别技术和EasyCVR视频监控平台的强大监控功能&#…

信息与网络安全

1.对称密码体制的优缺点 优点&#xff1a;1.加密解密处理速度快 2.保密度高&#xff1b; 缺点&#xff1a;1.对称密码算法的密钥 分发过程复杂&#xff0c;所花代价高 2.多人通信时密钥组合的数量会出现爆炸性膨胀&#xff08;所需密钥量大&#xff09; 3.通信双方必须统一密钥…

NAT网络地址转换——Easy IP

NAT网络地址转换 Tip&#xff1a; EasylP没有地址池的概念,使用接口地址作为NAT转换的公有地址。EasylP适用于不具备固定公网IP地址的场景:如通过DHCP, PPPOE拨号获取地址的私有网络出口,可以直接使用获取到的动态地址进行转换。 本次实验模拟nat协议配置 AR1配置如下&…

【Three.js基础学习】27.Modified materials

前言 补充&#xff1a;\node_modules\three\src\renderers\shaders 自Three.js第132版以来&#xff0c;位于ShaderLib/文件夹中的着色器现在按材质分组。 顶点代码和片段代码都在同一个文件中。 课程 学习如何改进3DS内置材质 改进网格标准材质 两种方法 1.使用Three.js钩子&am…

使用 AI 在医疗影像分析中的应用探索

文章目录 摘要引言医疗影像分析中的 AI 应用场景AI 技术在医疗影像中的核心算法成功案例解析实现医疗影像分类的关键技术点代码示例及解析1. 数据加载与预处理2. 模型定义3. 模型训练4. 主函数完整代码 QA 环节总结参考资料 摘要 医疗影像分析是 AI 在医疗领域的重要应用方向&…

全面认识AI Agent,一文读懂AI智能体的架构指南

文章目录&#xff1a; AI Agent概述 AI Agent的架构 AI Agent与相关技术的比较 AI Agent框架和平台 总结与未来展望 AI Agent概述 1.1 定义AI Agent AI Agent&#xff0c;或称为人工智能代理&#xff0c;我更愿意称为AI智能体。它是一种模拟人类智能行为的人工智能系统…

【提效工具开发】管理Python脚本执行系统实现页面展示

Python脚本执行&#xff1a;工具管理Python脚本执行系统 背景 在现代的软件开发和测试过程中&#xff0c;自动化工具和脚本的管理变得至关重要。为了更高效地管理工具、关联文件、提取执行参数并支持动态执行Python代码&#xff0c;我们设计并实现了一套基于Django框架的工具…

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节&#xff5c;征文# 博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…

典型的 SOME/IP 多绑定用例总结

SOME/IP 部署中 AP SWC 不自行打开套接字连接的原因 在典型的 SOME/IP 网络协议部署场景里&#xff0c;AP SWC 不太可能自己打开套接字连接与远程服务通信&#xff0c;因为 SOME/IP 被设计为尽可能少用端口。这一需求源于低功耗 / 低资源的嵌入式 ECU&#xff0c;并行管理大量…

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明&#xff1a;版本说明 下面截取说明&#xff1a; 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系