当前位置: 首页 > news >正文

Java 操作 Redis和redis持久化

一、Jedis

我们要使用 Java 来操作 Redis,Jedis 是 Redis 官方推荐的 java连接开发工具! 使用Java 操作 Redis 中间件!

1.导入对应的依赖

https://mvnrepository.com/artifact/redis.clients/jedis

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version>
</dependency>

2、编码测试:

@SpringBootTest
class TransactionYiburenwuApplicationTests {@Testvoid contextLoads() {//测试一下redis//1.new Jedis对象即可Jedis jedis = new Jedis("localhost", 6379);//2.jedis所有的命令就是我们之前学习的所有指令!所以之前的指令学习很重要!//System.out.println(jedis.ping());System.out.println(jedis.set("name","lili"));System.out.println(jedis.get("name"));}
}

二、Spring-data-redis

spring data redis中封装了两个模板类,帮助我们实现redis的crud

RedisTemplate            key value泛型都是object

StringRedisTemplate   key value泛型都是string

注意:

1.两者数据各自存,各自取,数据不互通。

RedisTemplate不能取StringRedisTemplate存入的数据 StringRedisTemplate不能取RedisTemplate存入的数据

2.序列化策略不同:

RedisTemplate采用JDK的序列化策略(JdkSerializationRedisSerializer)保存的key 和value 都是采用此策略序列化保存的存储时,先将数据序列化为字节数组,再存入Redis数据库。查看Redis会发现,是字节数组的形式类似乱码读取时,会将数据当做字节数组转化为我们需要的数据,以用来存储对象,但是要实现 Serializable接口

StringRedisTemplate采用String的序列化策略(StringRedisSerializer)保存的key和 value都是采用此策略序列化保存的当存入对象时,会报错:can not cast into String 存储和读取,都为可读的数据

3.两者的关系是StringRedisTemplate继承RedisTemplate

4.使用场景:

当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。 但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

  五大数据类型 *         *         *    

redisTemplate.opsForValue();//操作字符串

redisTemplate.opsForList();//操作List

redisTemplate.opsForSet();//操作Set        

redisTemplate.opsForZSet();//操作ZSet

redisTemplate.opsForHash();//操作Hash

操作: 

1.加入Redis相关依赖

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

2.application.properties中加入redis相关配置

# Redis数据库索引(默认为0)  

spring.redis.database=0  

# Redis服务器地址  

spring.redis.host=192.168.0.24  

# Redis服务器连接端口  

spring.redis.port=6379  

# Redis服务器连接密码(默认为空)  

spring.redis.password=  

# 连接池最大连接数(使用负值表示没有限制)  

spring.redis.pool.max-active=200  

# 连接池最大阻塞等待时间(使用负值表示没有限制)  

spring.redis.pool.max-wait=-1  

# 连接池中的最大空闲连接  

spring.redis.pool.max-idle=10

# 连接池中的最小空闲连接  

spring.redis.pool.min-idle=0  

# 连接超时时间(毫秒)  

spring.redis.timeout=1000 

3.具体代码了解

@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootRedisApplicationTests {//演示1(专用对象)@Autowiredpublic RedisTemplate redisTemplate;//演示2(专用字符串key value均是String)@Autowiredpublic StringRedisTemplate stringRedisTemplate;//演示3(自定义)@Autowiredpublic RedisTemplate jsonRedisTemplate;/*** 测试RedisTemplate* 注意:* 1.测试RedisTemplate与stringRedisTemplate存的数据相互独立* 2.redisTemplate默认使用key序列化方式和value的序列化方式都使用的是jdk serializer序列化* 	 所以存对象会乱码** */@Testpublic void redisTemplate() {ValueOperations valueOperations = redisTemplate.opsForValue();valueOperations.set("name","lili");String name = (String)valueOperations.get("name");System.out.println(name);Student stu1 = new Student(1, "pony", "play");redisTemplate.opsForValue().set("stu1",stu1);Object ss1 = redisTemplate.opsForValue().get("stu1");System.out.println(ss1);redisTemplate.opsForList().leftPushAll("mylist","睡觉","打豆豆");List<String> list=redisTemplate.opsForList().range("mylist",0,-1);for(int i=0;i<list.size();i++){String s = list.get(i);System.out.println(s);}System.out.println("打印默认序列策略"+redisTemplate.getDefaultSerializer());}/*** 测试stringRedisTemplate+* */@Testpublic void stringRedisTemplate() {//1.key相关Set<String> keys = stringRedisTemplate.keys("*");for (String key:keys){System.out.println(key);}//2.各种类型支持stringRedisTemplate.opsForValue();//StringstringRedisTemplate.opsForList();//ListstringRedisTemplate.opsForHash();//hashstringRedisTemplate.opsForSet();//setstringRedisTemplate.opsForZSet();//zset//3.举例字符串stringRedisTemplate.opsForValue().set("name","ken");String name = stringRedisTemplate.opsForValue().get("name");System.out.println(name);//4.操作list列表stringRedisTemplate.opsForList().leftPush("mylist1","吃饭");stringRedisTemplate.opsForList().leftPush("mylist1","玩儿");stringRedisTemplate.opsForList().leftPushAll("mylistall","吃饭","睡觉","打豆豆");List<String> list = stringRedisTemplate.opsForList().range("mylistall", 0, 2);System.out.println(list);}}

三、jsonRedisTemplate自定义序列化策略

1.配置类:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<Object, Object> jsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {//1.创建自定义模板类RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();//配置json类型的序列化工具template.setKeySerializer(new StringRedisSerializer());//这样key会用字符串方式保存template.setDefaultSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));template.setConnectionFactory(redisConnectionFactory);return template;}}

2.具体代码了解: 

 /*** 测试自定义* 法意:定义配置类JavaConfig,自定义序列化策略** */@Testpublic void jsonRedisTemplate(){//保存对象Student stu = new Student(1,"xx","拉面");jsonRedisTemplate.opsForValue().set("stu",stu);//获取对象Object s1 = jsonRedisTemplate.opsForValue().get("stu");String jsonS1 = JSONObject.toJSONString(s1);Student s11 = JSONObject.parseObject(jsonS1,Student.class);System.out.println(s11);Student stu2 = new Student(2,"ll","拉面");Student stu1 = new Student(2,"ll","拉面");Student stu3 = new Student(2,"ll","拉面");List<Student> students = Arrays.asList(stu1, stu2, stu3);jsonRedisTemplate.opsForValue().set("stus",students);//必须Object接受,利用ObjectMapper对象转换,如果强制转换会报错Object data = jsonRedisTemplate.opsForValue().get("stus");String dataJson = JSONObject.toJSONString(data);//将JSON类型转为ListList<Student> stus = JSONObject.parseArray(dataJson, Student.class);System.out.println(stus);}

四、redis持久化

Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中 的数据库状态也会消失。所以 Redis 提供了持久化功能!

持久化过程保存什么

1.将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据 (RDB) 2.将数据的操作过程进行保存,日志形式,存储操作过程,关注点在数据的操作过程(AOF)

4.1RDB方式

概念: 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将 快照文件直接读到内存里

4.2AOF方式

概念: AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令 达到恢复数据的目的;与RDB相比可以简单描述为改记录数据为记录数据产生的过程AOF的主要作用是 解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

AOF执行过程

客户端的请求写命令会被append追加到AOF缓冲区内;

AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中;

AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;

Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的;

AOF写数据三种策略(appendfsync)

always(每次) 每次写入操作均同步到AOF文件中,数据零误差,性能较低

everysec(每秒) 每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高 在系统突然宕机的情况下丢失1秒内的数据

no(系统控制) 由操作系统控制每次同步到AOF文件的周期,整体过程不可控

比较: 

 

 

相关文章:

Java 操作 Redis和redis持久化

一、Jedis 我们要使用 Java 来操作 Redis&#xff0c;Jedis 是 Redis 官方推荐的 java连接开发工具&#xff01; 使用Java 操作 Redis 中间件&#xff01; 1.导入对应的依赖 https://mvnrepository.com/artifact/redis.clients/jedis <dependency><groupId>redi…...

Expo创建的React Native项目如何在Windows上进行打包

文章目录 前言eas打包步骤什么是AAB转换为apk文件 本地打包以Windows为例先安装docker&#xff0c;然后手动创建下面的三个文件构建 前言 下面是Expo如何在本地进行打包的过程&#xff08;windows&#xff09; eas打包 如果使用云打包&#xff0c;花费时间较多&#xff0c;时…...

探索Go语言中的结构体:定义和使用

引言 Go语言是一种静态类型的编程语言&#xff0c;它提供了多种数据结构来组织数据。结构体&#xff08;struct&#xff09;是Go中一种强大的自定义数据类型&#xff0c;允许你将多个不同或相同类型的字段组合成一个单一的实体。本文将介绍Go语言中结构体的基本概念、定义方法…...

Unity Dots学习 (一)

先学习怎么使用&#xff0c;再研究底层代码。Dots大家都有所耳闻。一直没时间研究&#xff0c;最近研究一下 看上图可知&#xff0c;哪怕是CPU的第三级缓存也比内存要快2-5倍。 资料&#xff1a; 《DOTS之路》第零节——前导课(1)——DOTS的5W1H问题_哔哩哔哩_bilibili 《DOT…...

C语言刷题日记(附详解)(1)

一、选择判断部分 第一题&#xff1a; 如下代码是否存在风险&#xff0c;并说明原因和修改方案 #include<stdio.h> int main() {char* str "hello world";*str a;return 0; }思路提示&#xff1a;这种形式的字符串存储在什么区域呢&#xff1f;是否真的有…...

SpringSecurity实现登录功能实战!!!

实现思路 登录 ①自定义登录接口 调用ProviderManager的方法进行认证 如果认证通过生成jwt 把用户信息存入redis中 ②自定义UserDetailsService 在这个实现类中去查询数据库 注意配置passwordEncoder为BCryptPasswordEncoder 退出登录&#xff0c;删除redis中的数…...

mysql中用一个查询获取多个数据库(模式)和表的计数之和

问题 下面的查询返回了4排数据&#xff0c;这很好。但我同时需要对同一个查询中的所有计数求和。这如何实现&#xff1f;我已经尝试了多种不同的方法&#xff0c;但只得到sintax报错。 SELECT COUNT(*) FROM schema1.table WHERE STATE 17 AND LEVEL 1 UNION ALL SELECT CO…...

linux patch 的制作方式

文章目录 制作patch1. 准备工作2. 使用 diff 命令生成补丁文件生成单个文件的补丁生成整个目录的补丁 3. 检查补丁文件 使用patch1. 应用补丁文件1.1 应用单个文件的补丁1.2 应用整个目录的补丁 总结示例&#xff1a;制作和应用补丁 前言&#xff1a; 在Linux系统中&#xff0c…...

白骑士的C#教学进阶篇 2.4 LINQ查询

系列目录 上一篇&#xff1a;白骑士的C#教学进阶篇 2.3 委托与事件 LINQ&#xff08;Language Integrated Query&#xff09;是C#中的一个强大特性&#xff0c;它提供了统一的语法来查询和操作各种数据源&#xff0c;如数组、集合、XML和数据库等。LINQ通过一种类似SQL的查询语…...

2024华为OD机试真题- 贪吃的猴子Python-C卷D卷-200分

目录 题目描述 输入描述 输出描述 用例1 用例2 用例3 解题思路 代码 2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述 一只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。 猴子获取香蕉,…...

4-1-2 直流电机(电机专项教程)

4-1-2 直流电机&#xff08;电机专项教程&#xff09; 4-1-2 直流电机主要参数尺寸参数额定电压额定电流空载转速 如何控制直流电机有刷直流电机转向控制H桥电路控制转向 如何控制电机转速PWM控制电机转速 4-1-2 直流电机 之前学习了有刷直流电机的基本结构个工作原理&#xff…...

[图解]用例规约之扩展路径

1 00:00:01,710 --> 00:00:03,670 基本路径写完之后 2 00:00:04,690 --> 00:00:07,270 接下来就是扩展路径 3 00:00:08,620 --> 00:00:14,000 扩展路径就是系统要处理的意外和分支 4 00:00:14,010 --> 00:00:19,710 系统要处理的 5 00:00:20,970 --> 00:00:…...

学习记录第二十八天

有名管道&#xff08;FIFO&#xff09; 在Linux系统中&#xff0c;有名管道是一种特殊类型的文件&#xff0c;它允许不相关的进程之间进行通信。有名管道在文件系统中有一个具体的路径和名称&#xff0c;因此它们可以被多个进程共同访问。有名管道的特点包括持久性、多进程访问…...

SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结

目录 1、SpringBoot的事务管理 2、SpringBoot的异步任务 3、SpringBoot定时任务调度 4、SpringBoot整合Mail发送邮件 5、Spring框架中的Bean的作用域 6、Spring框架中的Bean的线程安全 7、 Spring框架中的Bean生命周期 8、Spring框架如何解决循环依赖&#xff1f; 9、…...

透明加密技术

透明加密技术&#xff0c;也被称为透明数据加密&#xff08;Transparent Data Encryption, TDE&#xff09;&#xff0c;是一种加密方法&#xff0c;它允许数据在存储时自动加密和解密&#xff0c;而不需要用户进行任何手动操作。透明加密技术主要应用于数据库、文件系统和磁盘…...

深入理解Faiss:高效向量检索的利器

近年来&#xff0c;随着人工智能和机器学习技术的飞速发展&#xff0c;向量检索技术变得越来越重要。无论是在推荐系统、图像搜索还是自然语言处理等领域&#xff0c;向量检索都扮演着至关重要的角色。而在众多向量检索库中&#xff0c;Faiss&#xff08;Facebook AI Similarit…...

RK3576 芯片介绍

RK3576 芯片介绍 RK3576瑞芯微第二代8nm高性能AIOT平台&#xff0c;它集成了独立的6TOPS&#xff08;Tera Operations Per Second&#xff0c;每秒万亿次操作&#xff09;NPU&#xff08;神经网络处理单元&#xff09;&#xff0c;用于处理人工智能相关的任务。此外&#xff0…...

Python模块篇(五)

模块 模块与包模块的导入与使用标准库的常用模块第三方库的安装与使用&#xff08;如&#xff1a;pip工具&#xff09; 模块与包 模块是一个包含 Python 代码的文件&#xff0c;通常以 .py 作为扩展名。一个模块可以包含函数、类、变量&#xff0c;以及可执行的代码段。模块的…...

西安旅游系统--论文pf

TOC springboot383西安旅游系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿…...

分享一个思路,使用插桩技术解决慢查询测试问题

前段时间&#xff0c;我负责测试的系统在生产环境运行出现问题。该系统对于响应时间要求较高&#xff0c;问题发生的时候并发很高&#xff0c;出现大量请求超时&#xff0c;超时请求比例随时间推迟越来越高&#xff0c;最后几乎全部请求都失败。滚动重启了所有进程后&#xff0…...

C++ 模板类型推导的底层实现

C模板类型推导的底层实现 C的模板类型推导是现代C编程中不可或缺的核心机制&#xff0c;它使得泛型编程变得灵活而高效。从简单的函数模板到复杂的元编程&#xff0c;类型推导在编译期间自动推断模板参数&#xff0c;减少了冗余代码。其底层实现机制却鲜为人知。本文将揭开模板…...

ExifToolGUI完全指南:让照片元数据管理效率倍增的实用技巧

ExifToolGUI完全指南&#xff1a;让照片元数据管理效率倍增的实用技巧 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 还在为照片位置管理烦恼&#xff1f;这款工具让地理标记效率提升300%。ExifToolGUI作为…...

别再手动写DSP了!Vivado里用Multiply Adder IP核实现MAC运算的保姆级教程

高效实现MAC运算&#xff1a;Vivado中Multiply Adder IP核的工程实践指南 在FPGA开发中&#xff0c;乘累加&#xff08;MAC&#xff09;运算作为数字信号处理的核心操作&#xff0c;其实现效率直接影响系统性能。传统手写RTL代码不仅耗时&#xff0c;还容易引入时序问题和资源浪…...

SillyTavern角色系统深度解析:从基础配置到高级应用

SillyTavern角色系统深度解析&#xff1a;从基础配置到高级应用 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 引言&#xff1a;为什么角色系统是SillyTavern的核心竞争力&#xff1f; 在…...

Java程序员,如何从零开始学习AI?

文章为Java程序员提供了零学习大模型并实现涨薪的六阶段路线&#xff1a;掌握AI基础概念、用Java调用大模型API、基于Spring AI实现轻量级AI业务场景、在真实项目中落地、学习智能体进阶技能、将AI知识融入简历。强调应聘AI应用开发工程师而非大模型工程师&#xff0c;适合文本…...

**发散创新:基于Python的鲁棒水印技术实战解析与代码实现**在多

发散创新&#xff1a;基于Python的鲁棒水印技术实战解析与代码实现 在多媒体内容日益泛滥的今天&#xff0c;数字水印技术已成为版权保护、防伪溯源和内容认证的核心手段之一。本文将深入探讨一种基于离散余弦变换&#xff08;DCT&#xff09;的鲁棒图像水印嵌入与提取算法&…...

Evo FPGA伺服控制库:基于xlr8_servo硬件IP的兼容封装

1. 项目概述evo_servo是一个专为 Evo 系列 FPGA 开发板设计的伺服电机控制封装库&#xff0c;其核心定位是为 Evo 平台提供对 XLR8 平台xlr8_servo模块的兼容性访问能力。该库并非从零构建的全新驱动&#xff0c;而是对已有硬件加速逻辑的功能性桥接层&#xff08;wrapper&…...

5大核心功能打造专业直播录制系统:从入门到精通的全方位指南

5大核心功能打造专业直播录制系统&#xff1a;从入门到精通的全方位指南 【免费下载链接】DouyinLiveRecorder 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveRecorder 一、核心价值&#xff1a;为什么选择这款直播录制工具 场景引导&#xff1a;当你需要保…...

新手友好:通过快马生成带详解的nodepad项目轻松入门Web开发

作为一个刚接触Web开发的新手&#xff0c;想要自己动手实现一个简易的文本编辑器(nodepad)可能会觉得无从下手。最近我在InsCode(快马)平台上尝试了这个项目&#xff0c;发现整个过程比我预想的要简单很多&#xff0c;特别适合像我这样的初学者来理解Web开发的基本流程。 项目结…...

AutoGen实战解析:如何用多智能体对话构建下一代LLM应用

1. 什么是AutoGen&#xff1f;为什么它值得关注&#xff1f; 如果你最近在关注大语言模型&#xff08;LLM&#xff09;的应用开发&#xff0c;可能已经听说过AutoGen这个名字。简单来说&#xff0c;AutoGen是微软开源的一个人工智能框架&#xff0c;它让开发者能够通过多个可以…...