Redis Java 开发简单示例

文章目录

    • 一、概述
    • 二、Jedis 开发示例
      • 2.1 导入 maven 依赖
      • 2.2 使用连接池读写
      • 2.3 使用集群读写
      • 2.4 完整示例代码
      • 2.5 测试集群的搭建
    • 三、Lettuce 开发示例
      • 3.1 导入 maven 依赖
      • 3.2 读写数据
    • 四、Spring Boot Redis 开发示例
      • 4.1 导入 maven 依赖
      • 4.2 配置Redis服务地址
      • 4.3 基于 RedisTemplate 的读写全类型数据
      • 4.4 基于 StringRedisTemplate 的读写字符串类型数据
      • 4.5 基于 RedisConnection 的读写字节数据
      • 4.6 读写 Hash 数据类型
      • 4.7 订阅发布
      • 4.8 基于SpringBoot的完整测试代码
      • 4.9 注意问题

如果您对Redis的了解不够深入请关注本栏目,本栏目包括Redis安装,Redis配置文件说明,Redis命令和数据类型说明,Redis持久化配置,Redis主从复制和哨兵机制,Redis Cluster(集群)配置,Redis Predixy 集群,Redis Twemproxy 集群,Redis Codis 集群,Redis 集群对比,RedisBloom 布隆过滤器。

一、概述

  • Redis(Remote Dictionary Server)是一种高性能的开源内存数据库,它具有多种用途和功能,可以充当缓存、消息队列、数据库、实时分析和数据处理平台等多种角色。具体功能如下:

    1. 数据缓存: Redis 可以用作应用程序的缓存层,帮助减少对后端数据库的频繁访问。通过将经常使用的数据存储在内存中,可以显著提高读取速度,降低数据库负担,从而提高应用程序性能。
    2. 会话存储: Redis 可以用于存储用户会话数据,特别是在分布式环境中。这使得用户会话可以跨多个服务器实例进行共享,提高了应用程序的伸缩性和可用性。
    3. 消息队列: Redis 支持发布/订阅(Pub/Sub)模式,使其成为一个优秀的消息队列平台。应用程序可以使用 Redis 来发送和接收消息,实现异步通信、事件驱动和消息分发。
    4. 计数器和统计信息: Redis 提供了递增和递减操作,因此它非常适合存储计数器数据。这对于跟踪应用程序中的用户行为、实时统计信息和监视任务非常有用。
    5. 地理空间数据: Redis 支持地理空间数据(Geospatial Data),因此它可以用于存储位置信息、地图数据和地理位置查询。
    6. 分布式锁: Redis 可以用于实现分布式锁,确保在分布式系统中的互斥操作。这对于避免竞态条件和数据一致性非常重要。
    7. 缓存击穿保护: Redis 可以用于缓存击穿保护,通过设置适当的过期时间或使用布隆过滤器来避免某个数据的同时大量请求导致的数据库请求。
    8. 实时数据传输: Redis 可以用于构建实时数据传输和协作应用程序,如聊天应用、协同编辑和游戏。
    9. 数据持久性: Redis 提供不同级别的数据持久性选项,以确保数据在服务器重启后不会丢失。
  • 下面分别使用 Jedis 、Lettuce 访问Redis 和 在 Spring Boot 使用访问 Redis 的简单示例。

二、Jedis 开发示例

  • 开源地址:jedis

2.1 导入 maven 依赖

  • 在 pom.xml 添加 jedis

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

2.2 使用连接池读写

  • 使用连接池对单个Redis实例进行读写

            JedisPool pool = new JedisPool("192.168.8.60", 6379);Jedis resource = pool.getResource();resource.set("aaa", "111");System.out.println("read redis 1="+resource.get("aaa"));
    

2.3 使用集群读写

  • 使用集群对Redis集群进行读写

            Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30001));jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30002));jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30003));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30004));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30005));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30006));JedisCluster jedis = new JedisCluster(jedisClusterNodes);jedis.set("ddd", "1111");System.out.println("read redis 2="+ jedis.get("aaa"));
    

在这里插入图片描述

2.4 完整示例代码

  • 以下是完整的测试代码

    package top.yiqifu.study.p121;import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisPool;import java.util.HashSet;
    import java.util.Set;public class Test01_Redis {public static void main(String[] args) {// 通过连接池直接读写数据testResource();//通过Redis集群(Cluster)读写数据testCluster();}private static void testResource(){JedisPool pool = new JedisPool("192.168.8.60", 6379);Jedis resource = pool.getResource();resource.set("aaa", "111");System.out.println("read redis 1="+resource.get("aaa"));}private static void testCluster(){Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30001));jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30002));jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30003));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30004));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30005));
    //        jedisClusterNodes.add(new HostAndPort("192.168.8.60", 30006));JedisCluster jedis = new JedisCluster(jedisClusterNodes);jedis.set("ddd", "1111");System.out.println("read redis 2="+ jedis.get("aaa"));}
    }
    

2.5 测试集群的搭建

  • 以下给出测试集群搭建的核心命令,具体请参考Redis Cluster(集群)配置。

    cd /redis-6.0.6/utils/create-cluster
    vi create-clusterCLUSTER_HOST=192.168.8.60PROTECTED_MODE=no
    ./create-cluster start
    ./create-cluster createfirewall-cmd  --permanent  --add-port=30001/tcp
    firewall-cmd  --permanent  --add-port=30002/tcp
    firewall-cmd  --permanent  --add-port=30003/tcp
    firewall-cmd  --permanent  --add-port=30004/tcp
    firewall-cmd  --permanent  --add-port=30005/tcp
    firewall-cmd  --permanent  --add-port=30006/tcp
    firewall-cmd  --reload
    

三、Lettuce 开发示例

3.1 导入 maven 依赖

  • 开源地址:lettuce-core

  • 在 pom.xml 添加 lettuce-core

            <dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.1.10.RELEASE</version></dependency>
    

3.2 读写数据

  • 以下使用 lettuce 来读写Redis,lettuce 最大的特点是支持响应式编程(Reactive API)。

    package top.yiqifu.study.p121;import io.lettuce.core.RedisClient;
    import io.lettuce.core.api.StatefulRedisConnection;
    import io.lettuce.core.api.async.RedisAsyncCommands;
    import io.lettuce.core.api.sync.RedisStringCommands;public class Test02_LettuceRedis {public static void main(String[] args) {// 同步/异步方式读写数据testSync();}private static void testSync(){RedisClient client = RedisClient.create("redis://192.168.8.60:6379");StatefulRedisConnection<String, String> connection = client.connect();RedisStringCommands sync = connection.sync();sync.set("aaa", "111");System.out.println("read redis 1="+sync.get("aaa"));RedisAsyncCommands<String, String> async = connection.async();async.set("bbb", "222");System.out.println("read redis 2="+async.get("bbb"));}
    }

四、Spring Boot Redis 开发示例

4.1 导入 maven 依赖

  • 这里 spring-boot-starter-data-redis 是 Redis 的依赖,而 spring-boot-starter-json 是用于数据序列化的 json 依赖。
		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.7.15</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-json</artifactId><version>2.7.15</version></dependency>

4.2 配置Redis服务地址

  • 在 application.yaml 文件中添加配置
spring:redis:host: 192.168.8.60port: 6379

4.3 基于 RedisTemplate 的读写全类型数据

    @AutowiredRedisTemplate redisTemplate;private void  testObject(){redisTemplate.opsForValue().set("aaa", "111");System.out.println("reda redis 1 = "+redisTemplate.opsForValue().get("aaa"));}

4.4 基于 StringRedisTemplate 的读写字符串类型数据

    @AutowiredStringRedisTemplate stringRedisTemplate;private void testString(){stringRedisTemplate.opsForValue().set("bbb", "222");System.out.println("read redis 2 = "+stringRedisTemplate.opsForValue().get("bbb"));}

4.5 基于 RedisConnection 的读写字节数据

    @AutowiredRedisTemplate redisTemplate;private void  testObject(){redisTemplate.opsForValue().set("aaa", "111");System.out.println("reda redis 1 = "+redisTemplate.opsForValue().get("aaa"));}

4.6 读写 Hash 数据类型

    @AutowiredRedisTemplate redisTemplate;@AutowiredStringRedisTemplate stringRedisTemplate;@Autowired@Qualifier("serializerRedisTemplate")StringRedisTemplate serializerRedisTemplate;private void testHash(){// 方法一:使用 StringRedisTemplate 直接读写hashHashOperations<String, Object, Object> hash = stringRedisTemplate.opsForHash();hash.put("someInfo", "name" , "qifu");hash.put("someInfo", "age" , "30");System.out.println("read redis 4 = "+hash.entries("someInfo"));//hincrby someInfo age 1// 创建对象Person person = new Person();person.setName("zhang san");person.setAge(20);Jackson2HashMapper hashMapper = new Jackson2HashMapper(objectMapper, false);// 方法二:使用 RedisTemplate 读写 hash 对象redisTemplate.opsForHash().putAll("person1", hashMapper.toHash(person));Map personMap1 = redisTemplate.opsForHash().entries("person1");Person value6 = objectMapper.convertValue(personMap1, Person.class);System.out.println("read redis 6 = "+value6.getName());// 方法三:使用 StringRedisTemplate 读写 hash 对象// stringRedisTemplate 需设置 ValueSerializer ,因为age是Integer类型stringRedisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));stringRedisTemplate.opsForHash().putAll("person2", hashMapper.toHash(person));Map personMap2 = stringRedisTemplate.opsForHash().entries("person2");Person value7 = objectMapper.convertValue(personMap2, Person.class);System.out.println("read redis 7 = "+value7.getName());// 方法四:使用自定义 serializerRedisTemplate  读写 hash 对象serializerRedisTemplate.opsForHash().putAll("person3", hashMapper.toHash(person));Map personMap3 = serializerRedisTemplate.opsForHash().entries("person3");Person value8 = objectMapper.convertValue(personMap3, Person.class);System.out.println("read redis 8 = "+value8.getName());}

4.7 订阅发布

    @AutowiredStringRedisTemplate stringRedisTemplate;private void  testPubsub(){//pub/substringRedisTemplate.getConnectionFactory().getConnection().subscribe(new MessageListener() {@Overridepublic void onMessage(Message message, byte[] pattern) {System.out.println("sub redis = "+new String(message.getBody()));}}, "xxx".getBytes());stringRedisTemplate.convertAndSend("xxx","yyy");}

4.8 基于SpringBoot的完整测试代码

  • TestRedis.java

    package top.yiqifu.study.p211_redis;import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.data.redis.connection.Message;
    import org.springframework.data.redis.connection.MessageListener;
    import org.springframework.data.redis.connection.RedisConnection;
    import org.springframework.data.redis.core.HashOperations;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.hash.Jackson2HashMapper;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    import org.springframework.stereotype.Component;import java.util.Map;@Component
    public class TestRedis {@AutowiredRedisTemplate redisTemplate;@AutowiredStringRedisTemplate stringRedisTemplate;@Autowired@Qualifier("serializerRedisTemplate")StringRedisTemplate serializerRedisTemplate;@AutowiredObjectMapper objectMapper;public void  test(){// 基于 RedisTemplate 测试Redis全类型的读写,如 objectthis.testObject();// 基于 StringRedisTemplate 测试Redis字符串类型的读写,如 stringthis.testString();// 基于 RedisConnection 测试Redis更底层的字节类型的读写,如 byte[]this.testBytes();// 基于 StringRedisTemplate 测试Redis的Hash类型的读写,如 hashthis.testHash();// 基于 StringRedisTemplate 测试Redis的发布、订阅this.testPubsub();}private void  testObject(){redisTemplate.opsForValue().set("aaa", "111");System.out.println("reda redis 1 = "+redisTemplate.opsForValue().get("aaa"));}private void testString(){stringRedisTemplate.opsForValue().set("bbb", "222");System.out.println("read redis 2 = "+stringRedisTemplate.opsForValue().get("bbb"));}private void testBytes(){RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();connection.set("ccc".getBytes(), "333".getBytes());System.out.println("read redis 3 = "+new String(connection.get("ccc".getBytes())));}private void testHash(){// 方法一:使用 StringRedisTemplate 直接读写hashHashOperations<String, Object, Object> hash = stringRedisTemplate.opsForHash();hash.put("someInfo", "name" , "qifu");hash.put("someInfo", "age" , "30");System.out.println("read redis 4 = "+hash.entries("someInfo"));//hincrby someInfo age 1// 创建对象Person person = new Person();person.setName("zhang san");person.setAge(20);Jackson2HashMapper hashMapper = new Jackson2HashMapper(objectMapper, false);// 方法二:使用 RedisTemplate 读写 hash 对象redisTemplate.opsForHash().putAll("person1", hashMapper.toHash(person));Map personMap1 = redisTemplate.opsForHash().entries("person1");Person value6 = objectMapper.convertValue(personMap1, Person.class);System.out.println("read redis 6 = "+value6.getName());// 方法三:使用 StringRedisTemplate 读写 hash 对象// stringRedisTemplate 需设置 ValueSerializer ,因为age是Integer类型stringRedisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));stringRedisTemplate.opsForHash().putAll("person2", hashMapper.toHash(person));Map personMap2 = stringRedisTemplate.opsForHash().entries("person2");Person value7 = objectMapper.convertValue(personMap2, Person.class);System.out.println("read redis 7 = "+value7.getName());// 方法四:使用自定义 serializerRedisTemplate  读写 hash 对象serializerRedisTemplate.opsForHash().putAll("person3", hashMapper.toHash(person));Map personMap3 = serializerRedisTemplate.opsForHash().entries("person3");Person value8 = objectMapper.convertValue(personMap3, Person.class);System.out.println("read redis 8 = "+value8.getName());}private void  testPubsub(){//pub/substringRedisTemplate.getConnectionFactory().getConnection().subscribe(new MessageListener() {@Overridepublic void onMessage(Message message, byte[] pattern) {System.out.println("sub redis = "+new String(message.getBody()));}}, "xxx".getBytes());stringRedisTemplate.convertAndSend("xxx","yyy");}
    }
    
  • Config.java

    package top.yiqifu.study.p211_redis;import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import javax.annotation.Resource;@Configuration
    public class Config {@ResourceRedisConnectionFactory factory;@Bean("serializerRedisTemplate")public StringRedisTemplate getRedisTemplate(){StringRedisTemplate template = new StringRedisTemplate(factory);template.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));return template;}
    }
    
  • RedisSpringBootApplication.java

    package top.yiqifu.study.p211_redis;import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
    public class RedisSpringBootApplication {public static void main(String[] args){ConfigurableApplicationContext context = SpringApplication.run(RedisSpringBootApplication.class, args);TestRedis bean = context.getBean(TestRedis.class);bean.test();}
    }
    

4.9 注意问题

  • 在新版本(版本大于2.7)的SpringBoot中,以下写法会报错“Could not autowire. No beans of ‘RedisConnectionFactory’ type found”,如下写法:

    @Configuration
    public class Config {@Bean("serializerRedisTemplate")public StringRedisTemplate getRedisTemplate(RedisConnectionFactory factory){StringRedisTemplate template = new StringRedisTemplate(factory);template.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));return template;}
    }
    
  • 要使用@Resource注解的属性注入,修改后的代码为

    @Configuration
    public class Config {@ResourceRedisConnectionFactory factory;@Bean("serializerRedisTemplate")public StringRedisTemplate getRedisTemplate(){StringRedisTemplate template = new StringRedisTemplate(factory);template.setHashValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));return template;}
    }
    

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

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

相关文章

Android平台上执行C/C++可执行程序,linux系统编程开发,NDK开发前奏。

Android平台上执行C/C可执行程序&#xff0c;linux系统编程开发&#xff0c;NDK开发前奏准备。 1.下载NDK&#xff0c;搭建NDK开发环境 下载地址 https://developer.android.com/ndk/downloads 下载过程中点击下面箭头的地方&#xff0c;点击鼠标右键&#xff0c;复制好下载…

【React-Native开发3D应用】React Native加载GLB格式3D模型并打包至Android手机端

【React-Native开发3D应用】React Native加载GLB格式3D模型并打包至Android手机端 【加载3D模型】**React Native上如何加载glb格式的模型**第零步&#xff0c;选择相关模型第一步&#xff0c;导入相关模型加载库第二步&#xff0c;自定义GLB模型加载钩子第三步&#xff0c;借助…

现一个智能的SQL编辑器

补给资料 管注公众号&#xff1a;码农补给站 前言 目前我司的多个产品中都支持在线编辑 SQL 来生成对应的任务。为了优化用户体验&#xff0c;在使用 MonacoEditor 为编辑器的基础上&#xff0c;我们还支持了如下几个重要功能&#xff1a; 多种 SQL 的语法高亮多种 S…

React路由与导航

目录 前言&#xff1a; 什么是React路由&#xff1f; 导航和页面切换 路由参数和动态路由 路由守卫和权限控制 总结 前言&#xff1a; React是一个流行的JavaScript库&#xff0c;用于构建用户界面。在使用React开发Web应用程序时&#xff0c;路由和导航是必不可少的功能…

【MATLAB源码-第69期】基于matlab的LDPC码,turbo码,卷积码误码率对比,码率均为1/3,BPSK调制。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 本文章介绍了卷积码、Turbo码和LDPC码。以相同的码率仿真这三种编码&#xff0c;并对比其误码率性能 信源输出的数据符号&#xff08;二进制&#xff09;是相互独立和等概率的&#xff1b; 信道是加性白高斯噪声信道&#…

qframework 架构 (作者:凉鞋)使用笔记

一些准则&#xff1a; 根据VIEW->SYSTEM->MODEL的分层架构 初始架构&#xff1a; app. using FrameworkDesign;namespace ShootingEditor2D&#xff08;项目的命名空间&#xff09; {public class ShootingEditor2D &#xff08;游戏名称&#xff09;: Architecture&l…

LinuxMySql

结构化查询语言 DDL&#xff08;数据定义语言&#xff09; 删除数据库drop database DbName; 创建数据库create database DbName; 使用数据库use DbName; 查看创建数据库语句以及字符编码show create database 43th; 修改数据库属性&#xff08;字符编码改为gbk&#xff09;…

HR人才测评,采用线上测评做春招秋招

从人力资源管理的工作&#xff0c;已经有好些年了&#xff0c;我只想说这不是一个有创意和创造性的工作&#xff0c;因为大部分时间我都在从事数据方面的工作。关于公司内部的文案工作先且不说&#xff0c;这里分享下我做招聘工作的过程。 每年春秋两季的校招&#xff0c;算是…

基于单片机的多层电梯控制仿真系统

**单片机设计介绍&#xff0c; 基于单片机的多层电梯控制仿真系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的多层电梯控制仿真系统是一个复杂的系统&#xff0c;它需要结合单片机技术、控制理论、电子技术以及人…

RabbitMQ 系列教程

一、RabbitMQ 部署及配置详解(集群部署) 二、RabbitMQ 部署及配置详解 (单机) 三、RabbitMQ 详解及实例&#xff08;含错误信息处理&#xff09; 四、RabbitMq死信队列及其处理方案 五、RabbitMQ Java开发教程—官方原版 六、RabbitMQ Java开发教程&#xff08;二&#x…

虚拟机复制后,无法ping通问题解决

虚拟机复制后&#xff0c;无法ping通问题解决 可能出现的现象 ssh工具连接不上虚拟机&#xff1b;虚拟机ping不通外网或者ping不通内网其它虚拟机&#xff1b; 原因 原虚拟机和新复制出来的虚拟机的ip地址重复&#xff1b;原虚拟机和新复制出来的虚拟机的MAC地址重复&#…

Spring Boot中使用Spring Data JPA访问MySQL

Spring Data JPA是Spring框架提供的用于简化JPA&#xff08;Java Persistence API&#xff09;开发的数据访问层框架。它通过提供一组便捷的API和工具&#xff0c;简化了对JPA数据访问的操作&#xff0c;同时也提供了一些额外的功能&#xff0c;比如动态查询、分页、排序等。 …

坐标系转换(仅作记载)

一.极坐标转换为普通坐标系 参考&#xff1a;极坐标方程与直角坐标方程的互化 - 知乎 (zhihu.com) 公式&#xff1a;&#xff08;无需考虑象限引起的正负问题&#xff09; 普通坐标系转换为极坐标系 参考&#xff1a; 极坐标怎么与直角坐标系相互转化&#xff1f; - 知乎 (zh…

基于SSM的建筑装修图纸管理平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Spring Task定时任务框架

二十四、Spring Task 24.1 介绍 Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a;定时任务框架 作用&#xff1a;定时自动执行某段Java代码 为什么要在Java程序中使用Spring Task&#xff1f; 应用场景…

elementui-plus el-tree组件数据不显示问题解决

当前情况: 显示: 注意看右侧的树是没有文字的,数据已经渲染,个数是对的,但就是没有文字, 解决: 对比以后发现是template中的#default{data}没有写大括号导致的 所以写上大括号后: 正常显示

理解MySQL的日志 Redo、Undo

理解MySQL的Redo日志和Undo日志 1、MySQL 日志文件解决的问题2、redo 日志2.1、redo log 的组成2.2、redo log 刷盘策略2.3、MySQL 的 redo log解决了哪些问题 3、undo 日志3.1、undo 日志作用3.2、undo log 的类型3.3、undo log 的生命周期3.4、事务回滚相关的几个隐藏字段 1、…

垂直领域大模型落地思考

相比能做很多事&#xff0c;但每件事都马马虎虎的通用大模型&#xff1b;只能做一两件事&#xff0c;但这一两件事都能做好&#xff0c;可被信赖的垂直大模型会更有价值。这样的垂直大模型能帮助我们真正解决问题&#xff0c;提高生产效率。 本文将系统介绍如何做一个垂直领域…

【Linux精讲系列】——vim详解

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;c入门第一个程序和基本知识讲解 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;宁静是一片强大而治愈的神奇海洋&#xff01; 目录 目录 ​作者…