Java 操作 Redis和redis持久化

news2024/9/21 2:30:37

一、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 {

    @Test
    void 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(专用对象)
    @Autowired
    public RedisTemplate redisTemplate;

    //演示2(专用字符串key value均是String)
    @Autowired
    public StringRedisTemplate stringRedisTemplate;

    //演示3(自定义)
    @Autowired
    public RedisTemplate jsonRedisTemplate;

    /**
     * 测试RedisTemplate
     * 注意:
     * 1.测试RedisTemplate与stringRedisTemplate存的数据相互独立
     * 2.redisTemplate默认使用key序列化方式和value的序列化方式都使用的是jdk serializer序列化
     * 	 所以存对象会乱码
     *
     * */
    @Test
    public 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+
     * */
    @Test
    public void stringRedisTemplate() {
        //1.key相关
        Set<String> keys = stringRedisTemplate.keys("*");
        for (String key:keys){
            System.out.println(key);
        }
        //2.各种类型支持
        stringRedisTemplate.opsForValue();//String
        stringRedisTemplate.opsForList();//List
        stringRedisTemplate.opsForHash();//hash
        stringRedisTemplate.opsForSet();//set
        stringRedisTemplate.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 {

    @Bean
    public 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,自定义序列化策略
     *
     * */
    @Test
    public 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类型转为List
        List<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文件的周期,整体过程不可控

比较: 

 

 

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

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

相关文章

【学习笔记】Matlab和python双语言的学习(最小生成树——Kruskal算法、Prim算法)

文章目录 前言一、最小生成树树的一些概念关键特性最小生成树和最短路径的主要区别常用算法1. Kruskal算法(适合点多边少的图)2. Prim算法(适合边多点少的图) 二、示例三、代码实现----Matlab四、代码实现----python1. Kruskal算法2. Prim算法 总结 前言 通过模型算法&#xf…

硬件模拟的基本原理是什么?

具体来说&#xff0c;这种设计方法减少了集成电路 (IC) 设计和开发的设计迭代次数&#xff0c;并且广泛适用于所有电力电子设计。我详细介绍了我在快速上市 IC 开发方面的经验&#xff0c;并将该方法与其他旨在缩短产品开发时间的技术进行了对比。 产品开发流程 图 1&#xff…

三菱定位控制(三,步进电机与定位模块的接线详情)

相信大家对前面的学习已经对前面的内容有所了解&#xff0c;下面就来看看步进电机&#xff0c;步进电机驱动器还有定位模块之间是如何接线的吧&#xff01; 一&#xff0c;将定位模块转换为端子排 首先&#xff0c;我们肯定是无法之间再定位模块上直接进行接线的。所以我们需要…

基于Java中的SSM框架实现家政预约管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现家政预约管理系统演示 摘要 随着线上预约服务应用的不断普及&#xff0c;为了给用户提供更加便捷的服务&#xff0c;很多行业都实行了线上预约制&#xff0c;比如医疗行业的线上挂号以及交通行业预约购票等&#xff0c;预约服务可以帮助人们节约大量排…

Ubuntu 安装 mysql 与 远程连接配置

1、安装 mysql ubuntu 默认安装 8.0 版本&#xff1a; sudo apt install mysql-server安装过程中 提示 是否继续操作 y 即可 2、使用ubuntu 系统用户 root 直接进入 mysql 切换至 系统用户 su root 输入命令 可直接进入 mysql: mysql3、创建一个允许远程登录的用户 创建 …

使用国内镜像站点安装Qt6 for Mac

使用国内镜像站点安装Qt6 for Mac 从下列网址下载在线安装包 Index of /archive/online_installers (qt.io) 双击前述dmg文件&#xff0c;在终端执行语句 使用一句命令行语句&#xff1a; open qt-unified-macOS-x64-4.6.1-online/qt-unified-macOS-x64-4.6.1-online.app --…

【leetcode】回文链表-25-3

方法&#xff1a;快慢指针递归遍历 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) …

超吸睛!用AI绘画做沙雕图文号,有趣又解压!轻松吸粉变现!

大家好&#xff0c;我是画画的小强 小强可谓是小某书资深用户&#xff0c;最近突然刷到了某篇主打沙雕日常文案的 AI手绘插画图文号&#xff0c;不仅篇篇笔记上千点赞量&#xff0c;重点&#xff01;这类图文号植入的均是报价贼高的软广&#xff0c;我的老天鹅&#xff01;一搜…

基于vue框架的爱购电商平台256tr(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,商家,商品分类,商品信息 开题报告内容 基于Vue框架的爱购电商平台 开题报告 一、研究背景与意义 随着互联网技术的迅猛发展和消费者购物习惯的深刻变革&#xff0c;电子商务已成为推动全球经济增长的重要力量。然而&#xff0c;…

分销商城小程序系统渠道拓展

线上卖货渠道很多&#xff0c;想要不断提高营收和新客获取&#xff0c;除了自己和工具本身努力外&#xff0c;还需要其他人的帮助来提高商城店铺的整体销量。 搭建saas商城系统网站/小程序&#xff0c;后台上货&#xff0c;设置支付、配送、营销、精美模板商城装修等内容&…

网络研讨会 | Unlock your SAP Data:用新一代 SAP 集成方案加速释放企业核心数据价值

伴随着业务的快速发展&#xff0c;企业对 SAP 系统的使用逐渐深化。为了更好释放数据价值&#xff0c;有效驱动商业决策&#xff0c;将 SAP 数据与其他数据系统集成打通&#xff0c;已成为企业数字化发展的必然趋势。 然而&#xff0c;由于 SAP 系统的独特性&#xff0c;企业想…

Lesson 59 Is that all?

Lesson 59 Is that all? 词汇 envelope n. 信封 复数&#xff1a;envelopes 例句&#xff1a;在红色信封里有一封书信。 There is a letter in the red envelope. writing paper n. 信纸【不可数】 构成&#xff1a;write v. 写 writer n. 作家    相关&#xff1a;hand…

SQL SERVER 2008多表关联查询,关联条件用(*=、=*)无法使用,高版本数据库不兼容,报错“*=”附近有语法错误!

专业问题&#xff0c;已经习惯了先问AI 下图是百度AI的回复 下图是讯飞星火的回复 下面是SQL SERVER 2022数据库引擎&#xff0c;查询使用&#xff01; 报错&#xff1a;“*”附近有语法错误。 查询数据库版本语法 SELECT VERSION 得到数据库版本&#xff1a;SQL Server 202…

【CVE-2024-38077】修复Windows 远程桌面授权服务远程代码执行漏洞记录

官方漏洞指南&#xff1a;Security Update Guide - Microsoft Security Response Center 受影响版本&#xff1a; Windows Server 2012 R2 (Server Core installation) Windows Server 2012 R2 Windows Server 2012 (Server Core installation) Windows Server 2012 Windows …

AI时代来临,程序员歇业在家,如何利用AI来赚钱?

我没有团队&#xff0c;就一个人&#xff0c;能不能用AI来赚点小钱&#xff1f; 当然可以&#xff0c;单打独斗并非阻碍&#xff0c;AI技术完全可以助您拓展收入来源。接下来&#xff0c;我将为您详细介绍10种个体利用AI提升收入的有效途径。 首先&#xff0c;您可以通过以下…

PRVF-4037 : CRS is not installed on any of the nodes

描述&#xff1a;公司要求替换centos&#xff0c;重新安装ORACLE LINUX RAC的数据库做备库&#xff0c;到时候切换成主库&#xff0c;安装Linux7GRID 19C 11G Oracle&#xff0c;顺利安装grid 19c&#xff0c;安装11G数据库软件的时候检测报如题错误&#xff1a;**PRVF-4037 …

显卡刷坏BIOS黑屏怎么办_万能救砖恢复方法来了!

电脑显卡刷bios黑屏不开机无显示无信号&#xff0c;是因为显卡vbios刷错文件了&#xff0c;找到正确的显卡BIOS文件刷回去就行了。但是黑屏进不去系统如何刷显卡BIOS呢。给大家推荐个万能刷显卡BIOS工具&#xff0c;名字是《离线刷bios设备》&#xff0c;用免拆夹子直接连接显卡…

49-DRC的设置及检查

1. DRC设置入口 2.如下设置 3.运行DRC

IDEA 解决创建新项目Maven配置变化问题

我们发现&#xff0c;每次创建新项目&#xff0c;配置好的maven路径就变了&#xff0c;总是恢复成IDEA自带的maven配置&#xff0c;我们想永久使用我们的Maven配置&#xff0c;该如何修改呢&#xff1f; 配置好要重启IDEA&#xff01;&#xff01;&#xff01;

kubernetes k8s Daemonset 控制器 原理 讲解 配置

目录 1 DaemonSet控制器&#xff1a;概念、原理解读 1.1 DaemonSet概述 1.2 DaemonSet工作原理&#xff1a;如何管理Pod&#xff1f; 1.3 Daemonset典型的应用场景 1.4 DaemonSet 与 Deployment 的区别Deployment 部署的副本 Pod 会分布在各个 Node 上&#xff0c;每个…