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 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿…...

分享一个思路,使用插桩技术解决慢查询测试问题
前段时间,我负责测试的系统在生产环境运行出现问题。该系统对于响应时间要求较高,问题发生的时候并发很高,出现大量请求超时,超时请求比例随时间推迟越来越高,最后几乎全部请求都失败。滚动重启了所有进程后࿰…...

【STM32项目】在FreeRtos背景下的实战项目的实现过程(二)
个人主页~ 实战项目的实现过程(一)~ 实战项目的实现过程 二、初步了解各个外设硬件1、OLED模块2、GPS模块3、MPU6050模块4、超声测距模块5、温度测控模块6、语音模块7、SIM模块8、按键模块 三、查阅资料1、查看手册2、查找例程 四、研究硬件功能1、OLED…...

javaer快速入门 goweb框架 gin
gin 入门 前置条件 安装环境 配置代理 # 配置 GOPROXY 环境变量,以下三选一# 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOPROXYhttps://goproxy.…...

SQL - 数据类型
字符串类型 char(10),存储固定长度字符串 varchar(255),存储可变长度字符串 mediumtext,中文本,对于存储JSON对象、SCV字符串很好使 longtext,长文本,可以很好地存储教本或许多年地日志文件 tinytext&#…...

进程相关知识
进程和程序的区别 程序 程序是静态的,是存储在硬盘、SSD等存储介质中的一个文件,通常由源代码(如 .c 文件)编译生成的二进制可执行文件(如 a.out)。程序包含了指令和数据,但在未被执行时&#…...

萝卜快跑和端到端的自动驾驶(1)
先看一篇论文 2311.18636 (arxiv.org) 这篇论文里有一个非常好的图 比较了一下模块化任务(级联任务)和端到端自动驾驶的区别 首先什么叫模块化任务(级联) 如上图所示,左边的方块中的子方块,是展示了自动驾驶获取数据的途径,这里包括&…...

通信原理学习笔记
一个手机通话需要经过下面三个网络 类别接入网(Access Network)承载网(Transport Network)核心网(Core Network)定义连接终端用户与电信网络的部分。在接入网和核心网之间传输数据的网络。处理、交换和管理…...

系统编程---day4
1. 链接文件 命令行: ln -s 文件名 softlink 1.1 symlink int symlink(const char *oldpath, const char *newpath); 功能:创建一个链接向oldpath文件的新符号链接文件 参数:oldpath:被链接向的文件的路径 newpath:新符号链接文件 返回值:成功返回0,失败返回…...

01:电容的什么,各类电容的优缺点
1.电容是什么? 电容是由两块不连通的导体,已经中间的不导电材料组成 电容结构: 1.2电容的容量计算公式 C ε s d \displaystyle\frac{εs}{d} dεs 1.3常见电容的种类 1.4各类电容的特点...

Android+Jacoco+code-diff全量、增量覆盖率生成实战
背景 主要是记录下Android项目使用jacoco生成代码覆盖率的实战流程,目前已完成全量覆盖方案,仅使用jacoco就能实现; 由于我们的Android端是使用Java和kotlin语言,目前增量的方案code-diff仅针对Java代码,卡在kotlin文件的分析&am…...

乌龟对对碰在线版
爆肝两天使用vue开发了一个在线版的乌龟对对碰小游戏之幸运对对碰。没有找到合适的乌龟素材,现在使用小兔子代替。 体验地址:幸运对对碰 | 乌龟对对碰小游戏 之前的python版本的乌龟对对碰:写文章-CSDN博客 乌龟对对碰-幸运对对碰...