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,Jedis 是 Redis 官方推荐的 java连接开发工具! 使用Java 操作 Redis 中间件! 1.导入对应的依赖 https://mvnrepository.com/artifact/redis.clients/jedis <dependency><groupId>redi…...
Expo创建的React Native项目如何在Windows上进行打包
文章目录 前言eas打包步骤什么是AAB转换为apk文件 本地打包以Windows为例先安装docker,然后手动创建下面的三个文件构建 前言 下面是Expo如何在本地进行打包的过程(windows) eas打包 如果使用云打包,花费时间较多,时…...
探索Go语言中的结构体:定义和使用
引言 Go语言是一种静态类型的编程语言,它提供了多种数据结构来组织数据。结构体(struct)是Go中一种强大的自定义数据类型,允许你将多个不同或相同类型的字段组合成一个单一的实体。本文将介绍Go语言中结构体的基本概念、定义方法…...
Unity Dots学习 (一)
先学习怎么使用,再研究底层代码。Dots大家都有所耳闻。一直没时间研究,最近研究一下 看上图可知,哪怕是CPU的第三级缓存也比内存要快2-5倍。 资料: 《DOTS之路》第零节——前导课(1)——DOTS的5W1H问题_哔哩哔哩_bilibili 《DOT…...
C语言刷题日记(附详解)(1)
一、选择判断部分 第一题: 如下代码是否存在风险,并说明原因和修改方案 #include<stdio.h> int main() {char* str "hello world";*str a;return 0; }思路提示:这种形式的字符串存储在什么区域呢?是否真的有…...
SpringSecurity实现登录功能实战!!!
实现思路 登录 ①自定义登录接口 调用ProviderManager的方法进行认证 如果认证通过生成jwt 把用户信息存入redis中 ②自定义UserDetailsService 在这个实现类中去查询数据库 注意配置passwordEncoder为BCryptPasswordEncoder 退出登录,删除redis中的数…...
mysql中用一个查询获取多个数据库(模式)和表的计数之和
问题 下面的查询返回了4排数据,这很好。但我同时需要对同一个查询中的所有计数求和。这如何实现?我已经尝试了多种不同的方法,但只得到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 应用整个目录的补丁 总结示例:制作和应用补丁 前言: 在Linux系统中,…...
白骑士的C#教学进阶篇 2.4 LINQ查询
系列目录 上一篇:白骑士的C#教学进阶篇 2.3 委托与事件 LINQ(Language Integrated Query)是C#中的一个强大特性,它提供了统一的语法来查询和操作各种数据源,如数组、集合、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 直流电机(电机专项教程) 4-1-2 直流电机主要参数尺寸参数额定电压额定电流空载转速 如何控制直流电机有刷直流电机转向控制H桥电路控制转向 如何控制电机转速PWM控制电机转速 4-1-2 直流电机 之前学习了有刷直流电机的基本结构个工作原理ÿ…...
[图解]用例规约之扩展路径
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:…...
学习记录第二十八天
有名管道(FIFO) 在Linux系统中,有名管道是一种特殊类型的文件,它允许不相关的进程之间进行通信。有名管道在文件系统中有一个具体的路径和名称,因此它们可以被多个进程共同访问。有名管道的特点包括持久性、多进程访问…...
SpringBoot的事务/调度/缓存/邮件发送和一些Spring知识点总结
目录 1、SpringBoot的事务管理 2、SpringBoot的异步任务 3、SpringBoot定时任务调度 4、SpringBoot整合Mail发送邮件 5、Spring框架中的Bean的作用域 6、Spring框架中的Bean的线程安全 7、 Spring框架中的Bean生命周期 8、Spring框架如何解决循环依赖? 9、…...
透明加密技术
透明加密技术,也被称为透明数据加密(Transparent Data Encryption, TDE),是一种加密方法,它允许数据在存储时自动加密和解密,而不需要用户进行任何手动操作。透明加密技术主要应用于数据库、文件系统和磁盘…...
深入理解Faiss:高效向量检索的利器
近年来,随着人工智能和机器学习技术的飞速发展,向量检索技术变得越来越重要。无论是在推荐系统、图像搜索还是自然语言处理等领域,向量检索都扮演着至关重要的角色。而在众多向量检索库中,Faiss(Facebook AI Similarit…...
RK3576 芯片介绍
RK3576 芯片介绍 RK3576瑞芯微第二代8nm高性能AIOT平台,它集成了独立的6TOPS(Tera Operations Per Second,每秒万亿次操作)NPU(神经网络处理单元),用于处理人工智能相关的任务。此外࿰…...
Python模块篇(五)
模块 模块与包模块的导入与使用标准库的常用模块第三方库的安装与使用(如:pip工具) 模块与包 模块是一个包含 Python 代码的文件,通常以 .py 作为扩展名。一个模块可以包含函数、类、变量,以及可执行的代码段。模块的…...
西安旅游系统--论文pf
TOC springboot383西安旅游系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿…...
分享一个思路,使用插桩技术解决慢查询测试问题
前段时间,我负责测试的系统在生产环境运行出现问题。该系统对于响应时间要求较高,问题发生的时候并发很高,出现大量请求超时,超时请求比例随时间推迟越来越高,最后几乎全部请求都失败。滚动重启了所有进程后࿰…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
