springboot3整合redis
来源于https://www.bilibili.com/video/BV1UC41187PR/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=865f32e12aef524afb83863069b036aa
一、整合redis
1.创建项目文件
2.添加依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version></dependency><!-- mybatis-plus会自动调用mybatis,但mybatis-spring版本和springboot3+版本的spring会不匹配,所以要升版本--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version></dependency></dependencies>
3.配置文件
后缀名改为yml
配置redis、mysql数据源、日志
server:port: 9999spring:data:redis:port: 6379host: localhostdatasource:username: rootpassword: *****url: jdbc:mysql:///testdblogging:level:com.qqcn: debug
4.创建redis配置类
@EnableCaching该注解为启动缓存管理
redisTemplate对象用来操作redis
redisCacheManager缓存管理器
其中setKey(Serializer)序列化 存到redis中的数据更加直观
package com.qqcn.config;import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@EnableCaching
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(factory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));return redisTemplate;}@Beanpublic RedisCacheManager redisCacheManager(RedisTemplate<String, Object> redisTemplate) { // 明确指定参数化类型if (redisTemplate == null || redisTemplate.getConnectionFactory() == null) {// 处理错误情况,例如抛出异常或采取默认行为throw new RuntimeException("RedisTemplate or its connection factory is null");}RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);}
}
二、RedisTemplate操作-String
创建测试类演示
1.假如现在有一个登录的token想要存在redis里面
设置了有效期
package com.qqcn;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.UUID;
import java.util.concurrent.TimeUnit;@SpringBootTest
public class RedisTest {@Autowiredprivate RedisTemplate<String,Object> redisTemplate;@Testpublic void testString(){String key = "user:token:0001";
// 实际当中可以用jwtredisTemplate.opsForValue().set(key, UUID.randomUUID().toString(),30, TimeUnit.MINUTES);System.out.println(redisTemplate.opsForValue().get(key));}
}
启动redis
启动成功
token已存入
2.假如我们要对一篇文章进行访问数的统计
每查看一次都进行计数
@Testpublic void testString2(){String key = "article:A00001:viewsCount";redisTemplate.opsForValue().increment(key);System.out.println(redisTemplate.opsForValue().get(key));}
第一次执行是1,第二次就是2了
3.假如想要存储一个对象
如果一个对象无需修改而是仅查询作用,那么存String也是一个很好的选择
在配置类中做了一个json的序列化处理,所以存储对象进去最终会被转换成json字符串
@Testpublic void testString3(){Map<String,Object> user = new HashMap<>();user.put("id","0001");user.put("name","张三丰");user.put("age",28);String key = "user:0001";redisTemplate.opsForValue().set(key,user);System.out.println(redisTemplate.opsForValue().get(key));}
可以看到被存储为json格式
三、RedisTemplate操作-Hash
比如说在做一个电商类项目的时候,会有一个购物车对象
Hash是kv键值类型,值类型类似map结构,更适合用来保存对象
如果用opsForHash().put(Object key, Object hashkey, Object value)其中hashkey表示右边的k,value表示右边的v,如果一个一个存比较繁琐
所以我们这里用opsForHash().putAll(Object key,Map m)
测试取出购物车有哪些商品
@Testpublic void testHash(){String key = "user:0001:cart";Map<String, Object> shoppingCart = new HashMap<>();shoppingCart.put("cartId", "123456789");shoppingCart.put("userId", "987654321");List<Map<String, Object>> items = List.of(Map.of("itemId", "1", "itemName", "手机", "price", 999.99, "quantity", 1),Map.of("itemId", "2", "itemName", "笔记本电脑", "price", 1499.99, "quantity",2),Map.of("itemId", "3", "itemName", "耳机", "price", 49.99, "quantity", 3));shoppingCart.put("items", items);shoppingCart.put("totalAmount", 3149.92);shoppingCart.put("creationTime", "2046-03-07T10:00:00");shoppingCart.put("lastUpdateTime", "2046-03-07T12:30:00");shoppingCart.put("status", "未结账");redisTemplate.opsForHash().putAll(key, shoppingCart);System.out.println(redisTemplate.opsForHash().get(key, "items"));}
四、RedisTemplate操作-Set
是数据库中一种无序的、不重复的数据结构,用于存储一组唯一的元素
比如想去存储某个用户的粉丝有哪些人
redis中统计是非常的快的
添加了三个粉丝add进去
@Testpublic void testSet(){String key = "author:0001:fans";redisTemplate.opsForSet().add(key,"张三","李四","王五");System.out.println("粉丝量:" + redisTemplate.opsForSet().size(key));}
结果为粉丝量为3
五、RedisTemplate操作-ZSet
是一个有序且唯一的集合,每个元素都与一个浮点数分数相关联,使得集合中的元素可以根据分数进行排序,默认按照分数进行升序排序。
若要降序查询:
redisTemplate.opsForZSet().reverseRange(key,0,-1)
添加成员的时候有一个分数值,通过分数值进行排序处理
比如我们想存储某个用户的好友列表
除了添加用户的信息,还可以添加时间,可以根据时间获取好友的列表
@Testpublic void testZSet(){String key = "user:0001:friends";//取添加好友的时间的毫秒值redisTemplate.opsForZSet().add(key,"张三",System.currentTimeMillis());redisTemplate.opsForZSet().add(key,"李四",System.currentTimeMillis());redisTemplate.opsForZSet().add(key,"王五",System.currentTimeMillis());//倒序Set<Object> set = redisTemplate.opsForZSet().reverseRange(key, 0, -1);System.out.println(set);}
最后存入的在最前面(按时间的降序来处理)
六、RedisTemplate操作-List
一种简单的字符串列表,按照插入顺序排序
在redis中可以把List想象成通道,两边都是开放的,可以左进右出,也可以右进左出,或者左进左出也可以
可以用List实现队列的功能,比如现有一个订单的请求处理,在买商品的时候很可能因为并发的问题引发别的问题,可以利用队列让订单做一个排队
存入数据:
redisTemplate.opsForList().leftPush(key,order1);
获取并移除数据:
redisTemplate.opsForList().rightPop(key)
@Testpublic void testList(){String key = "order:queue";//订单1Map<String, Object> order1 = new HashMap<>();order1.put("orderId", "1001");order1.put("userId", "2001");order1.put("status", "已完成");order1.put("amount", 500.75);order1.put("creationTime", "2024-08-09T09:30:00");order1.put("lastUpdateTime", "2024-08-9T10:45:00");order1.put("paymentMethod", "在线支付");order1.put("shoppingMethod", "自提");order1.put("remarks", "尽快处理");//订单2Map<String, Object> order2 = new HashMap<>();order2.put("orderId", "1002");order2.put("userId", "2002");order2.put("status", "待处理");order2.put("amount", 280.99);order2.put("creationTime", "2024-08-09T11:00:00");order2.put("lastUpdateTime", "2024-08-09T11:00:00");order2.put("paymentMethod", "货到付款");order2.put("shoppingMethod", "快递配送");order2.put("remarks", "注意保鲜");// A程序接收订单请求并将其加入队列redisTemplate.opsForList().leftPush(key,order1);redisTemplate.opsForList().leftPush(key,order2);// B程序从订单队列中获取订单数据并处理System.out.println("处理订单:" + redisTemplate.opsForList().rightPop(key));}
从右边取出的数据:订单1
还剩订单2
七、@RedisHash注解
除了用RedisTemplate来操作hash数据,还提供了@RedisHash注解
用于将java对象直接映射到redis的hash数据当中
java对象的存储和检索变得更加简单
关键步骤:
1.@RedisHash注解标注在实体类上
2.创建接口并继承CrudRepository
1.创建一个实体类
@Id表示id为主键
package com.qqcn.entity;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;@RedisHash
@Data
public class user {@Idprivate Integer id;private String name;private Integer age;private String phone;
}
2.创建一个接口
想要用此注解还需要创建一个接口
继承CrudRepository(增删改查)设定泛型第一个是操作的实体,第二个是主键的类型
定义完了接口之后就具备了对对象的基于redis的增删改查的能力
package com.qqcn.repository;import com.qqcn.entity.User;
import org.springframework.data.repository.CrudRepository;public interface UserRedisRepository extends CrudRepository<User,Integer> {
}
3.测试类进行测试
注入UserRedisRepository,进行测试类测试
@Autowiredprivate UserRedisRepository userRedisRepository;@Testpublic void testRedisHash(){User user = new User();user.setId(100);user.setName("张三丰");user.setAge(18);user.setPhone("18899998888");//保存到redis里面userRedisRepository.save(user);//读取Optional<User> redisUser = userRedisRepository.findById(100);System.out.println(redisUser);//更新user.setPhone("18899998866");//看数据是否存在,存在就修改,不存在就保存userRedisRepository.save(user);//再打印一次Optional<User> redisUser2 = userRedisRepository.findById(100);System.out.println(redisUser2);//删除//userRedisRepository.deleteById(100);//查看id是否存在boolean exists = userRedisRepository.existsById(100);System.out.println(exists);}
测试结果
因为没有指定key,key默认是 路径:id
八、缓存管理注解
redis最常见的用途就是用作缓存
而springboot的缓存管理功能旨在帮助开发人员轻松地在应用程序中使用缓存,以提高性能和响应速度,它提供了一套注解和配置,使得开发人员可以在方法级别上进行缓存控制,并且支持多种缓存存储提供程序
@Cacheable一般被用于查询方法,先在redis看看有无数据,如果有就直接在缓存里面拿,如果没有就查询数据库,并且会将查询到的数据放入缓存
@CachePut主要被用于更新缓存,一般可能用在新增和修改的方法上面
@CacheEvict主要用于清除缓存,一般会用在删除方法的上面
1.准备表
CREATE TABLE product (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,description TEXT,price DECIMAL(10, 2) NOT NULL,stock INT NOT NULL
);
INSERT INTO product (name, description, price, stock) VALUES
('iPhone 15', '最新的iPhone型号', 8999.99, 100),
('三星Galaxy S24', '旗舰安卓手机', 7899.99, 150),
('MacBook Pro', '专业人士的强大笔记本电脑', 15999.99, 50),
('iPad Air', '性能强劲的便携式平板电脑', 5599.99, 200),
('索尼PlayStation 6', '下一代游戏机', 4499.99, 75);
2.根据表创建实体类
package com.qqcn.entity;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName
public class Product {@TableIdprivate Integer id;private String name;private String description;private Double price;private Integer stock;
}
3.创建一个mapper接口
到数据库当中查数据,必须要有数据库操作的存在
前面创建项目的时候是添加了mybatis-plus的依赖
所以创建一个mapper来简化数据库的操作
在mybatis-plus里面想要实现增删改查需要在接口上面继承BaseMapper,泛型里面指定实体是谁
package com.qqcn.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qqcn.entity.Product;public interface ProductMapper extends BaseMapper<Product> {
}
注意:要在启动类上加一个注解@MapperScan扫描一下
4.创建一个service
在此创建增删改查的几个方法
package com.qqcn.service;import com.qqcn.entity.Product;public interface ProductService {//查询public Product getProductById(Integer id);//新增 还是要写一个返回值//因为我们要用注解@CachePut缓存数据是只能缓存方法的返回值public Product addProduct(Product product);//修改public Product updateProduct(Product product);//删除public void deleteProductById(Integer id);
}
5.创建相应的实现类
package com.qqcn.service.impl;import com.qqcn.entity.Product;
import com.qqcn.mapper.ProductMapper;
import com.qqcn.service.ProductService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;@Service
public class ProductServiceImpl implements ProductService {@Resourceprivate ProductMapper productMapper;@Overridepublic Product getProductById(Integer id) {return productMapper.selectById(id);}@Overridepublic Product addProduct(Product product) {productMapper.insert(product);return product;}@Overridepublic Product updateProduct(Product product) {productMapper.updateById(product);return product;}@Overridepublic void deleteProductById(Integer id) {productMapper.deleteById(id);}
}
6.添加缓存存储的注解
我们希望看到的是
首先查找是先从redis里面找数据,如果有的话sql就不执行,如果sql执行了的话,日志里面会显示
value指定缓存的名称,key是保存在redis中的键(需要拼接id用单引号)
设置之后增删改查的同时会作缓存同步的处理,作高频访问的时候,可以提高效率,同时降低mysql压力
package com.qqcn.service.impl;import com.qqcn.entity.Product;
import com.qqcn.mapper.ProductMapper;
import com.qqcn.service.ProductService;
import jakarta.annotation.Resource;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;@Service
public class ProductServiceImpl implements ProductService {@Resourceprivate ProductMapper productMapper;@Cacheable(value = "product", key = "'product:' + #id")@Overridepublic Product getProductById(Integer id) {return productMapper.selectById(id);}@CachePut(value = "product", key = "'product:'+ #product.id")@Overridepublic Product addProduct(Product product) {productMapper.insert(product);return product;}@CachePut(value = "product", key = "'product:'+ #product.id")@Overridepublic Product updateProduct(Product product) {productMapper.updateById(product);return product;}@CacheEvict(value = "product", key = "'product:' + #id")@Overridepublic void deleteProductById(Integer id) {productMapper.deleteById(id);}
}
7.测试类进行测试
(1)测试查询
@Autowiredprivate ProductService productService;@Testpublic void testQuery(){Product product = productService.getProductById(1);System.out.println(product);}
这里在执行时发生了一个错误java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘
出错在于mysql的密码是数字同时用的是.yml文件 所以我们需要把密码用双引号引起来
spring:data:redis:port: 6379host: localhostdatasource:username: rootpassword: "*****"url: jdbc:mysql://localhost:3306/testdb
更改之后测试成功,测试结果如下
redis中已缓存
重新测第二次
没有sql语句,因为我们可以在缓存中读取了
(2)测试更新(和新增同理,这里只演示更新)
@Testpublic void testUpdate(){//将刚刚查询到的名字修改一下Product product = productService.getProductById(1);product.setName("苹果15");//这里更新表一定会有sql日志,更新了缓存productService.updateProduct(product);//修改之后再一次查询,这里就没有sql日志了Product product2 = productService.getProductById(1);System.out.println(product2);}
测试结果,只有中间更新的时候有sql日志,查询走的都是缓存
redis已同步更改
(3)测试删除
删完的同时,缓存中的数据也会不存在
@Testpublic void testDelete(){productService.deleteProductById(1);}
测试结果,会打印一个删除的sql日志
mysql数据表中该数据被删除
redis中的缓存也没有了
相关文章:

springboot3整合redis
来源于https://www.bilibili.com/video/BV1UC41187PR/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source865f32e12aef524afb83863069b036aa 一、整合redis 1.创建项目文件 2.添加依赖 <dependencies><dependency><groupId>…...

VUE基础快速入门
VUE 和 VUE-Cli VUE 是一种流行的渐进式JavaScript框架,用于构建Web用户界面它具有易学、轻量级、灵活性强、高效率等特点,并且可以与其他库和项目集成是目前最流行的前端框架之一VUE-Cli 称为“VUE脚手架”,它是由VUE官方提供的客户端,专门为…...
用Python实现特征工程之特征提取——数值特征提取、类别特征提取、文本特征提取、时间特征提取
特征提取是特征工程中的关键步骤,它从原始数据中提取有意义的特征,以便机器学习模型能够更好地理解和学习数据。根据数据类型,特征提取可以分为数值特征提取、类别特征提取、文本特征提取和时间特征提取。下面详细讲解每种特征提取方法&#…...

按图搜索新体验:阿里巴巴拍立淘API返回值详解
阿里巴巴拍立淘API是一项基于图片搜索的商品搜索服务,它允许用户通过上传商品图片,系统自动识别图片中的商品信息,并返回与之相关的搜索结果。以下是对阿里巴巴拍立淘API返回值的详细解析: 一、主要返回值内容 商品信息 商品列表…...
vue跨域问题
本地调试 可以通过在vue.config.js中配置devServer来实现跨域请求。 module.exports {publicPath: ./,productionSourceMap: false, // 生产环境是否生成 sourceMap 文件devServer: {proxy: {/bi: {target: http://1.11.113.20:1234/bi, // 后台接口域名ws: false, //…...

【NLP】文本处理的基本方法【jieba分词、命名实体、词性标注】
文章目录 1、本章目标2、什么是分词3、jieba的使用3.1、精确模式分词3.2、全模式分词3.3、搜索引擎模式分词3.4、中文繁体分词3.5、使用用户自定义词典 4、什么是命名实体识别5、什么是词性标注6、小结7、jieba词性对照表⭐ 🍃作者介绍:双非本科大三网络…...

unity 本地使用Json(全套)
提示:文章有错误的地方,还望诸位大神不吝指教! 文章目录 前言一、Json是什么?二、创建Json文件1.在线编辑并转实体类(C#)2.Json文件 三、解析Json并使用四、报错:JsonError:JsonExce…...

java消息队列ActiveMQ
安装 前置条件 activemq的运行依赖于jdk,需要提前安装jdk如果已经安装了jdk,需要根据jdk的版本来选择对应的版本进行安装activemq版本对应在官网上,使用java -version 看jdk的版本注意:jdk和mq的版本不一致会报错,电脑…...
Android SurfaceFlinger——信号同步原理(五十一)
经过前面系列文章的学习,我们的已经理解了 SurfaceFlinger 运行机制以及同步机制,但是SurfaceFlinger 又是以什么方法是把需要刷新的信号发送给 App 进程的。 一、VSync简介 垂直同步(Vertical Synchronization,简称 VSync)是一种用于同步视频信号和显示设备刷新率的技术…...

html+css网页制作 博云丝网5个页面 无js ui还原度100%
htmlcss网页制作 博云丝网5个页面 无js ui还原度100% 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取…...

Docker Hub 镜像代理加速
因为未知原因,docker hub 已经不能正常拉取镜像,可以使用以下代理服务来进行: "https://docker.m.daocloud.io", "https://noohub.ru", "https://huecker.io", "https://dockerhub.timeweb.cloud"…...
矩阵:消除冗余
矩阵 基本概念 矩阵(Matrix)是一个按照行和列排列的元素的二维数组。具体来说,一个 ( m \times n ) 的矩阵有 ( m ) 行和 ( n ) 列,表示为: A ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯…...

【AWS账号解绑关联】Linker账号解绑重新关联注意事项
文章目录 一、来自客户疑问二、提交工单获取帮助三、最佳操作说明四、最佳操作步骤五、参考资料活动上新 一、来自客户疑问 将Linker账号,从一个组织中退出,重新关联到新的组织中,这解绑到重新完成新的关联绑定期间会在Linker账号中的账单中…...

入门学习使用overleaf和latex
文章目录 1.下载对应的latex论文模板2.overleaf平台的使用2.1overleaf平台的介绍2.2overleaf平台模板文件的上传2.3latex语法的学习2.3.2 分段(如下图显示)2.3.3 其他2.3.4简单latex实操2.3.5 换行符和换页符2.3.6左右居中对齐2.3.7 字体设置2.3.8插入固定位置图片2.3.9文字包围…...

后端调优——分布式锁选型——入门
文章目录 引言正文分布式锁的定义分布式锁的具体应用场景如何实现分布式锁主动轮询型分布式锁实现思路一、MySQL分布式锁二、Redis分布式锁 监听回调型分布式锁Etcd分布式锁Zookeeper分布式锁 锁的对比 总结 引言 最近面试,一直被问到分布式锁,然后仅仅…...

k8s集群管理 Pod管理命令
k8s集群管理命令 信息查询命令 子命令说明help用于查看命令及子命令的帮助信息cluster-info显示集群的相关配置信息api-resources查看当前服务器上所有的资源对象api-versions查看当前服务器上所有资源对象的版本config管理当前节点上的认证信息 资源对象概述 Pod概述 Pod 管…...

Java 并发(二)—— AQS原理
AQS,全名AbstractQueuedSynchronizer。 抽象队列同步器定义多线程访问共享资源的同步模板,解决了实现自定义同步器时涉及的大量细节问题,简化开发两种同步状态:独占、共享核心组件:State变量、CLH变体队列、获取 / 释…...

Maven插件:exec-maven-plugin-代码执行或者直接输出内置变量信息
文章目录 概述使用应用自行实现记录项目打包插件 概述 官网: https://www.mojohaus.org/exec-maven-plugin/usage.html 依赖: https://mvnrepository.com/artifact/org.codehaus.mojo/exec-maven-plugin 使用 <plugin><groupId>org.codeh…...

https://ffmpeg.org/
https://ffmpeg.org/ https://www.gyan.dev/ffmpeg/builds/ https://github.com/BtbN/FFmpeg-Builds/releases F:\Document_ffmpeg F:\Document_ffmpeg\ffmpeg-master-latest-win64-gpl-shared\bin...

linux 源码部署polardb-x 错误汇总
前言 在linux 源码部署polardb-x 遇到不少错误,特在此做个汇总。 问题列表 CN 启动报错 Failed to init new TCP 详细错误如下 Caused by: Failed to init new TCP. XClientPool to my_polarx#267b21d8127.0.0.1:33660 now 0 TCP(0 aging), 0 sessions(0 runni…...

mariadb5.5.56在centos7.6环境安装
mariadb5.5.56在centos7.6环境安装 1 下载安装包 https://mariadb.org/mariadb/all-releases/#5-5 2 上传安装包的服务器 mariadb-5.5.56-linux-systemd-x86_64.tar.gz 3 解压安装包 tar -zxvf mariadb-5.5.56-linux-systemd-x86_64.tar.gz mv mariadb-5.5.56-linux-syst…...
信息最大化(Information Maximization)
信息最大化在目标域无标签的域自适应任务中,它迫使模型在没有真实标签的情况下,对未标记数据产生高置信度且类别均衡的预测。此外,这些预测也可以作为伪标签用于自训练。 例如,在目标域没有标签时,信息最大化损失可以…...

前端文件下载常用方式详解
在前端开发中,实现文件下载是常见的需求。根据不同的场景,我们可以选择不同的方法来实现文件流的下载。本文介绍三种常用的文件下载方式: 使用 axios 发送 JSON 请求下载文件流使用 axios 发送 FormData 请求下载文件流使用原生 form 表单提…...

[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
Linux 内核作为一个多任务操作系统,其进程管理子系统是核心组成部分之一。无论是用户应用的运行、驱动行为的触发,还是系统调度决策,几乎所有操作都离不开进程的创建、调度与销毁。本文将从进程的概念出发,深入探讨 Linux 内核中进…...
Playwright自动化测试全栈指南:从基础到企业级实践(2025终极版)
引言 在Web应用复杂度指数级增长的今天,传统自动化测试工具面临动态渲染适配难、多浏览器兼容差、测试稳定性低三大挑战。微软开源的Playwright凭借跨浏览器支持、自动等待机制和原生异步架构,成为新一代自动化测试的事实标…...
n8n 自动化平台 Docker 部署教程(附 PostgreSQL 与更新指南)
n8n 自动化平台 Docker 部署教程(附 PostgreSQL 与更新指南) n8n 是一个强大的可视化工作流自动化工具,支持无代码或低代码地集成各种服务。本文将手把手教你如何通过 Docker 快速部署 n8n,并介绍如何使用 PostgreSQL、设置时区以…...

C语言中的数据类型(二)--结构体
在之前我们已经探讨了C语言中的自定义数据类型和数组,链接如下:C语言中的数据类型(上)_c语言数据类型-CSDN博客 目录 一、结构体的声明 二、结构体变量的定义和初始化 三、结构体成员的访问 3.1 结构体成员的直接访问 3.2 结…...
AI编程提示词
你是 IDE 的 AI 编程助手,遵循核心工作流(研究 -> 构思 -> 计划 -> 执行 -> 评审)用中文协助用户,面向专业程序员,交互应简洁专业,避免不必要解释。[沟通守则] 1. 响应以模式标签 [模式&#…...

【前端】es6相关,柯里化
0. 严格模式 严格模式的概念从ES6引进。通过严格模式,可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时…...

CICD实战(二)-----gitlab的安装与配置
1、安装gitlab所需要的依赖包与工具 sudo yum install wget net-tools sudo yum install curl policycoreutils openssh-server openssh-clients postfix -y 2、配置清华源 vim /etc/yum.repo.d/gitlab-ce.repo[gitlab-ce] namegitlab-ce baseurlhttp://mirrors.tuna.tsin…...