RedisTemplate和Redisson的使用和区别

文章目录

  • 一. 数据缓存
    • 1.1 **为什么要用缓存**
    • 1.2 缓存的实现
    • 1.3 Redis
    • 1.4 Redis 数据结构
    • 1.5 实现方式
    • 1.6 对比
    • 1.7 实现定时预热缓存
      • 1.7.1 什么是热缓存
      • 1.7.2 什么时候用缓存预热
      • 1.7.3 缓存预热带来的问题
      • 1.7.4 怎么实现缓存预热
      • 1.7.5 预热缓存的注意点
      • 1.7.6 缓存预热 - 定时任务
  • 二. RedisTemplate和Redisson
    • 2.1 简介
    • 2.2 主要区别
    • 2.3 总结
  • 三. 如何使用RedisTemplate
    • 3.1 导入依赖
    • 3.2 配置application.yml
    • 3.3 配置序列化
    • 3.4 测试
  • 四. 如何使用Redisson
    • 4.1 导入依赖
    • 4.2 配置application.yml
    • 4.3 配置Redisson
    • 4.4 测试

一. 数据缓存

1.1 为什么要用缓存

用户数量很大,导致数据查询慢,导致页面加载的时间过长。

用缓存:提前把数据取出来保存好(通常保存到读写更快的介质,比如内存),就可以更快地读写。

1.2 缓存的实现

●Redis(分布式缓存)
●memcached(分布式)
●Etcd(云原生架构的一个分布式存储,存储配置,扩容能力)
●ehcache(单机)
● 本地缓存(Java 内存 Map)
● Caffeine(Java 内存缓存,高性能)
● Google Guava

单机缓存存在的问题:

  1. 得到的数据不一致
  2. 获取不到资源

分布式缓存:

  1. 用户访问不同的服务器能获得到相同的资源数据
  2. 也就是在一个公共的服务器上存储数据,其他的服务器都讲数据读写在这个服务器上

redis 内存不能无限增加,一定要设置过期时间!!!

1.3 Redis

NoSQL 数据库
key - value 存储系统(区别于 MySQL,它存储的是键值对)

不是存那种表格之类的数据,不像数据库存储一行一行的数据,而是存储键值对的数据。

1.4 Redis 数据结构

String 字符串类型: name: “yupi”
List 列表:names: [“yupi”, “dogyupi”, “yupi”]
Set 集合:names: [“yupi”, “dogyupi”](值不能重复)
Hash 哈希:nameAge: { “yupi”: 1, “dogyupi”: 2 }
Zset 集合:names: { yupi - 9, dogyupi - 12 }(适合做排行榜)

bloomfilter(布隆过滤器,主要从大量的数据中快速过滤值,比如邮件黑名单拦截)
geo(计算地理位置)
hyperloglog(pv / uv)
pub / sub(发布订阅,类似消息队列)
BitMap (1001010101010101010101010101)二进制数据

1.5 实现方式

●Spring-Data-Redis**(推荐)**

Spring Data:通用的数据访问框架,定义了一组 增删改查 的接口

●Spring Data:通用的数据访问框架,定义了一组 增删改查 的接口mysql、redis、jpa
●Jedis: (独立于 Spring 操作 Redis 的 Java 客户端,要配合 Jedis Pool 使用)
●Lettuce
○高阶 的操作 Redis 的 Java 客户端
○异步、连接池
●Redisson:分布式操作 Redis 的 Java 客户端,让你像在使用本地的集合一样操作 Redis(分布式 Redis 数据网格)

1.6 对比

  1. 如果你用的是 Spring,并且没有过多的定制化要求,可以用 Spring Data Redis,最方便
  2. 如果你用的不是 SPring,并且追求简单,并且没有过高的性能要求,可以用 Jedis + Jedis Pool
  3. 如果你的项目不是 Spring,并且追求高性能、高定制化,可以用 Lettuce,支持异步、连接池
  4. 如果你的项目是分布式的,需要用到一些分布式的特性(比如分布式锁、分布式集合),推荐用 redisson

1.7 实现定时预热缓存

1.7.1 什么是热缓存

●数据量大时,可以提前将数据提前写入缓存,提高第一次访问的数据

●解决第一次访问时间过长,太长时间加载不出来页面,但是后面的访问页面就不会存在访问页面时间过长

●提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

1.7.2 什么时候用缓存预热

  1. 第一次访问时间比较长,但是后面的访问时间就很快一点。

  2. 第一次进入系统的加载时间过长

1.7.3 缓存预热带来的问题

  1. 增加开发成本(你要额外的开发、设计)
  2. 预热的时机和时间如果错了,有可能你缓存的数据不对或者太老
  3. 需要占用额外空间

1.7.4 怎么实现缓存预热

  1. 直接写个缓存刷新页面,上线时手工操作下。
  2. 数据量不大,可以在项目启动的时候自动进行加载。
  3. 定时任务,定时刷新缓存

1.7.5 预热缓存的注意点

  1. 缓存预热的意义(新增少、总用户多)

  2. 缓存的空间不能太大,要预留给其他缓存空间

  3. 缓存数据的周期(此处每天一次)

1.7.6 缓存预热 - 定时任务

  1. 在启动类上加注解
@EnableScheduling
public class UserCenterApplication {public static void main(String[] args) {SpringApplication.run(UserCenterApplication.class, args);}
}
  1. 在方法上添加注解
// cron 秒 分 时 日 月 年(每天这一刻执行)
@Scheduled(cron = "0 26 22 * * *")
public void doPreCacheRecommendUser() {}

二. RedisTemplate和Redisson

2.1 简介

RedisTemplate和Redisson都是操作Redis的Java客户端库。

2.2 主要区别

RedisTemplate:

RedisTemplate则提供了一套更简洁和易用的API,方便开发人员进行数据读写操作,但相对于Redisson,其功能相对较少,如不支持分布式锁等。
RedisTemplate采用了Spring的整体架构,与Spring的各种组件相结合,因此在性能和可靠性上可能会有一些差异。
RedisTemplate作为Spring框架的一部分,与Spring集成度较高,使用起来更加方便。
RedisTemplate适用于基本的Redis操作场景,如缓存、消息队列等。
RedisTemplate采用了传统的同步编程模型,适合于传统的Java应用。
RedisTemplate将Redis的操作封装为一组方法,并提供了丰富的数据类型支持。

Redisson:

Redisson提供了更丰富和更高级的功能和API,比如分布式锁、分布式集合、分布式对象等。它的API设计更加灵活和面向对象,能够更方便地进行并发控制和数据共享。
Redisson基于Netty框架,它在连接池、线程池等方面进行了优化,以提高性能和可靠性。
Redisson则需要额外配置和引入依赖,使用起来相对繁琐一些。
Redisson更适用于需要高级Redis功能的场景,如分布式锁、分布式计数器等。
Redisson采用了Reactive编程模型,支持异步、响应式的操作方式,适合于高并发、高性能的应用。
Redisson将Redis的操作封装为一组对象,并提供了对应的操作方法,更加直观易用。

2.3 总结

RedisTemplate更适合于简单的Redis操作,比如简单缓存、简单消息队列;而Redisson则提供了更高级的功能,比如分布式系统、集群和哨兵模式、RxJava集成。

三. 如何使用RedisTemplate

3.1 导入依赖

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

3.2 配置application.yml

spring:# redis 配置redis:port: 6379host: localhostdatabase: 0

3.3 配置序列化

使用 Redis 缓存高频访问用户信息时提到了自定义序列化器,为什么需要自定义序列化器,以及自定义序列化器的实现方式?

由于 Spring Boot Data Redis 默认使用 JDK 序列化器,会将存储到 Redis 的键值对转化为字节数组,不利于在 Redis 可视化工具中阅读、并且不利于跨语言兼容,所以需要指定序列化器。

所以我通过新建 RedisTemplateConfig 配置类来创建自定义的 RedisTemplate Bean,并且通过 redisTemplate.setKeySerializer(RedisSerializer.string()) 指定了 Redis Key 的序列化方式。

java自带的redistemplate只能查询字符串类型

是的,Java自带的RedisTemplate默认只支持序列化字符串类型。这是因为RedisTemplate是基于Spring框架的,而Spring Data Redis为了简化操作,默认使用了StringRedisSerializer来序列化和反序列化数据。这意味着当你使用RedisTemplate存储非字符串类型的数据时,你需要自定义序列化器来处理这些数据。

/****  自定义序列化**/
@Configuration
public class RedisTemplateConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {//创建RedisTemplate对象RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();//设置连接工厂redisTemplate.setConnectionFactory(connectionFactory);//设置Key的序列化redisTemplate.setKeySerializer(RedisSerializer.string());//创建Json序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//设置Value的序列化redisTemplate.setValueSerializer(jsonRedisSerializer);return redisTemplate;}
}

3.4 测试

在测试包里创建测试类RedisTest,测试代码如下

@SpringBootTest
public class RedisTest {//@Resourceprivate RedisTemplate redisTemplate;@Testvoid test(){ValueOperations valueOperations = redisTemplate.opsForValue();//增valueOperations.set("yupiString","dog");valueOperations.set("yupiInt",1);valueOperations.set("yupiDouble",2.0);User user = new User();user.setId(1L);user.setUsername("yupi");valueOperations.set("yupiUser",user);//查Object yupi = valueOperations.get("yupiString");Assertions.assertTrue("dog".equals((String)yupi));yupi = valueOperations.get("yupiInt");Assertions.assertTrue(1==((Integer)yupi));yupi = valueOperations.get("yupiDouble");Assertions.assertTrue(2.0==((Double)yupi));System.out.println(valueOperations.get("yupiUser"));
//        valueOperations.set("yupiString","dog");
//        redisTemplate.delete("yupiString");}
}

四. 如何使用Redisson

4.1 导入依赖

<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.19.1</version>
</dependency>  

4.2 配置application.yml

spring:# redis 配置redis:port: 6379host: localhostdatabase: 0password: 123456

4.3 配置Redisson

@Configuration
@ConfigurationProperties(prefix = "spring.redis")
@Data
public class RedissonConfig {private Integer database;private String host;private String password;private String port;@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useReplicatedServers().setDatabase(database).setPassword("".equals(password) ? null : password) // 这样没有密码就用默认值 null 有密码就用密码更加灵活.addNodeAddress(String.format("redis://%s:%s", host, port));return Redisson.create(config);}
}

4.4 测试

编写测试类来使用Redisson 实现分布式锁


@SpringBootTest
public class RedissonTest {@Resourceprivate RedissonClient redissonClient;@Testvoid test() {// list,数据存在本地 JVM 内存中List<String> list = new ArrayList<>();list.add("yupi");System.out.println("list:" + list.get(0));list.remove(0);// 数据存在 redis 的内存中RList<String> rList = redissonClient.getList("test-list");rList.add("yupi");System.out.println("rlist:" + rList.get(0));rList.remove(0);// mapMap<String, Integer> map = new HashMap<>();map.put("yupi", 10);map.get("yupi");RMap<Object, Object> map1 = redissonClient.getMap("test-map");// set// stack}
}

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

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

相关文章

three.js+WebGL踩坑经验合集(2):3D场景被相机裁切后,被裁切的部分依然可以被鼠标碰撞检测得到(射线检测)

three.js内置了Raycaster类实现鼠标的碰撞检测&#xff0c;用它可以实现3D物体的鼠标点击&#xff0c;移入移出&#xff0c;触屏检测一类的业务功能。 该功能虽然强大&#xff0c;但同事们普遍反映不是那么好用&#xff0c;因为它不像其它配套了可视编辑的3D引擎一样&#xff…

Spring Boot spring.factories文件详细说明

优质博文&#xff1a;IT-BLOG-CN 前言&#xff1a;经常看到 spring.factories 文件&#xff0c;却没有对它进行深入的了解和分析&#xff0c;今天我们就一起揭开面纱看看它的内在。 spring.factories 文件是 Spring Boot 自动配置机制的核心部分之一。它位于每个 Spring Boo…

从前端视角看设计模式之行为型模式篇

上篇我们介绍了 设计模式之结构型模式篇&#xff0c;接下来介绍设计模式之行为型模式篇 责任链模式 责任链模式允许将请求沿着一条链传递&#xff0c;直到有一个对象处理它为止。每个处理者都有机会处理该请求&#xff0c;或者将其传递给链中的下一个处理者&#xff0c;每个处…

[2025分类时序异常检测指标R-AUC与VUS]

梳理了一下分类中常见的指标&#xff0c;这些指标与时序异常检测中新提出的A-RUC与VUS之间的关系 真正例(True Positive,TP): 被正确识别为正样本的数量。真负例(True Negative,TN): 被正确识别为负样本的数量。假正例(False Positive ,FP): 被错误识为正样本数量假负例(Fals…

Unity中实现伤害跳字效果(简单好抄)

第一步骤安装并导入Dotween插件&#xff08;也可以不用导入之后直接下载我的安装包&#xff09; 官网DOTween - 下载 第二步&#xff1a; 制作跳字预制体 建议把最佳适应打开&#xff0c;这样就不怕数字太大显示不全了。 第三步&#xff1a;创建一个空对象并编写脚本JumpNumbe…

考研机试:学分绩点

描述 北京大学对本科生的成绩施行平均学分绩点制&#xff08;GPA&#xff09;。 既将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算。 公式如下&#xff1a; 一门课程的学分绩点 该课绩点 该课学分 总评绩点 所有学科学分绩点之和 / 所有课程学分之和 …

【玩转全栈】----YOLO8训练自己的模型并应用

继上篇&#xff1a; 【玩转全栈】---基于YOLO8的图片、视频目标检测-CSDN博客 相信大家已经可以训练一些图片和视频了&#xff0c;接下来我将为大家介绍如何训练自己的特定模型&#xff0c;并用其进行检测 目录 准备数据 图片数据 标识数据 配置文件 运行 测试训练结果 存在的问…

OpenCV文字绘制支持中文显示

OpenCV版本&#xff1a;4.4 IDE&#xff1a;VS2019 功能描述 OpenCV绘制文本的函数putText()不支持中文的显示&#xff0c;网上很多方法推荐的都是使用FreeType来支持&#xff0c;FreeType是什么呢&#xff1f;FreeType的官网上有介绍 FreeType官网 https://www.freetype.or…

我谈《概率论与数理统计》的知识体系

学习《概率论与数理统计》二十多年后&#xff0c;在廖老师的指导下&#xff0c;才厘清了各章之间的关系。首先&#xff0c;这是两个学科综合的一门课程&#xff0c;这一门课程中还有术语冲突的问题。这一门课程一条线两个分支&#xff0c;脉络很清晰。 概率论与统计学 概率论…

ElasticSearch JavaRestClient查询之快速入门

文章目录 查询操作流程概述构建并发起请求1. 创建请求对象2. 设置请求体3. 发送请求 查询结果的解析1. 解析结果结构2. 获取总条数3. 获取命中的数据 完整示例代码总结 查询操作流程概述 Elasticsearch 查询操作大致可以分为两个部分&#xff1a; 构建并发起请求&#xff1a;…

Quartus:开发使用及 Tips 总结

Quartus是Altera&#xff08;现已被Intel收购&#xff09;推出的一款针对其FPGA产品的综合性开发环境&#xff0c;用于设计、仿真和调试数字电路。以下是使用Quartus的一些总结和技巧(Tips)&#xff0c;帮助更高效地进行FPGA项目开发&#xff1a; 这里写目录标题 使用总结TIPS…

elementUI Table组件实现表头吸顶效果

需求描述 当 table 内容过多的时候&#xff0c;页面上滑滚动&#xff0c;表头的信息也会随着被遮挡&#xff0c;无法将表头信息和表格内容对应起来&#xff0c;需要进行表头吸顶 开始编码&#x1f4aa; 环境&#xff1a;vue2.6、element UI step1&#xff1a; 给el-table__h…

用于牙科的多任务视频增强

Multi-task Video Enhancement for Dental Interventions 2022 miccai Abstract 微型照相机牢牢地固定在牙科手机上&#xff0c;这样牙医就可以持续地监测保守牙科手术的进展情况。但视频辅助牙科干预中的视频增强减轻了低光、噪音、模糊和相机握手等降低视觉舒适度的问题。…

Vue3轮播图左右联动

1、轮播图部分&#xff0c;右边鼠标移入&#xff0c;左边对应展示轮播图 可以在swiper 官网 Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 选择vue中使用swiper npm i swiper 左右两边的联动&#xff1a;左边的轮播图和右边的小的列表他们的列表组成结构是一样的&#…

windows下本地部署安装hadoop+scala+spark-【不需要虚拟机】

注意版本依赖【本实验版本如下】 Hadoop 3.1.1 spark 2.3.2 scala 2.11 1.依赖环境 1.1 java 安装java并配置环境变量【如果未安装搜索其他教程】 环境验证如下&#xff1a; C:\Users\wangning>java -version java version "1.8.0_261" Java(TM) SE Runti…

go-zero框架基本配置和错误码封装

文章目录 加载配置信息配置 env加载.env文件配置servicecontext 查询数据生成model文件执行查询操作 错误码封装配置拦截器错误码封装 接上一篇&#xff1a;《go-zero框架快速入门》 加载配置信息 配置 env 在项目根目录下新增 .env 文件&#xff0c;可以配置当前读取哪个环…

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递&#xff1f; 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别&#xff1f; 4.简述Dart语音特性 5. Navigator 是什么&#xff1f;在 Flutter 中 Routes 是什么&#xff1f; 6、Dart 是不是…

HarmonyOS Next构建工具 lycium 原理介绍

HarmonyOS Next构建工具 lycium 原理介绍 背景介绍 HarmonyOS Next中很多系统API是以C接口提供&#xff0c;如果要使用C接口&#xff0c;必须要使用NAPI在ArkTS与C间交互&#xff0c;这种场景在使用DevEco-Studio中集成的交叉编译工具&#xff0c;以及cmake构建工具就完全够用…

【远程视频必备】Briefing:安全视频群聊让远程办公无忧

文章目录 前言1.关于briefing2.本地部署briefing3.使用briefing4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定briefing公网地址 前言 对于有远程办公或者身处异地与家人好友视频聊天需求的人来说&#xff0c;在享受高效沟通的同时&#xff0c;也或多或少会有对信息泄…

热更新杂乱记

热更新主要有一个文件的MD5值的比对过程&#xff0c;期间遇到2个问题&#xff0c;解决起来花费了一点时间 1. png 和 plist 生成zip的时候再生成MD5值会发生变动。 这个问题解决起来有2种方案&#xff1a; &#xff08;1&#xff09;.第一个方案是将 png和plist的文件时间改…