Redis的Java客户端学习总结

—————————<<

Jedis

以 Redis 命令作为方法名称,学习成本低,简单实用。
但是 Jedis 实例是线程不安全的,多线程环境下需要基于连接池来使用。

  1. 依赖
<!--jedis-->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>
  1. 简单案例
import redis.clients.jedis.Jedis;/*** * @author chengjiang*/
public class DemoJedis {public static void main(String[] args) {// 1、建立连接Jedis jedis = new Jedis("127.0.0.1", 6379);// 2、设置密码
//        jedis.auth("密码");// 3、选择库jedis.select(0);// 存入数据String result = jedis.set("name", "张三");System.out.println("result = " + result);// result = OK// 获取数据String name = jedis.get("name");System.out.println(name);// 张三}
}

—————————<<

Lettuce

Lettuce 是基于 Netty 实现的,支持同步、异步和响应式编程方式,并且是线程安全的。
支持 Redis 的哨兵模式、集群模式和管道模式。
它是一种可扩展的、线程安全的 Redis 高级客户端。
从 Spring Boot 2.x 开始, Lettuce 已取代 Jedis 成为SpringBoot 默认的 Redis 客户端。

  1. 依赖
<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>5.1.8.RELEASE</version>
</dependency>
  1. 简单案例
import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.SetArgs;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;
import java.time.Duration;
import java.time.temporal.ChronoUnit;/*** @author chengjiang*/
public class DemoLettuce {public static void main(String[] args) {// <1> 创建单机连接的连接信息RedisURI redisUri = RedisURI.builder().withHost("localhost").withPort(6379).withTimeout(Duration.of(10, ChronoUnit.SECONDS)).build();// <2> 创建客户端RedisClient redisClient = RedisClient.create(redisUri);// <3> 创建线程安全的连接StatefulRedisConnection<String, String> connection = redisClient.connect();// <4> 创建同步命令RedisCommands<String, String> redisCommands = connection.sync();SetArgs setArgs = SetArgs.Builder.nx().ex(5);String result = redisCommands.set("name33", "李四", setArgs);System.out.println("result = " + result);// result = OKString result2 = redisCommands.get("name33");System.out.println("result2 = " + result2);// result2 = 李四// <5> 关闭连接connection.close();// <6> 关闭客户端redisClient.shutdown();}
}

—————————<<

SpringDataRedis

SpringDataRedis 是 Spring中数据操作模块 SpringData 中的一员,它提供了对不同Redis客户端的整合(Lettuce和Jedis)
,提供了 RedisTemplate 统一的API来操作Redis。

  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化与反序列化
  • 支持基于Redis的JDKCollection实现
  1. 依赖
<!--Redis依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 案例
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;/*** spring redis 工具类** @author chengjiang*/
@Component
public class RedisService {@Resourcepublic RedisTemplate redisTemplate;/*** 缓存基本的对象,Integer、String、实体类等** @param key   缓存的键值* @param value 缓存的值*/public <T> void setCacheObject(final String key, final T value) {redisTemplate.opsForValue().set(key, value);}/*** 缓存基本的对象,Integer、String、实体类等** @param key      缓存的键值* @param value    缓存的值* @param timeout  时间* @param timeUnit 时间颗粒度*/public <T> void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit) {redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}/*** 自增缓存* key在Redis中不存在,redis中会创建这个key,并生成一个值,值为1* key在Redis中存在,那么就会在当前数值的基础上再加1后保存** @param key      缓存的键值* @param timeout  时间* @param timeUnit 时间颗粒度*/public Long increment(final String key, final Long timeout, final TimeUnit timeUnit) {Long increment = increment(key);expire(key, timeout, timeUnit);return increment;}/*** 自减缓存** @param key      缓存的键值* @param timeout  时间* @param timeUnit 时间颗粒度*/public Long decrement(final String key, final Long timeout, final TimeUnit timeUnit) {Long increment = decrement(key);expire(key, timeout, timeUnit);return increment;}/*** 自增缓存* key在Redis中不存在,redis中会创建这个key,并生成一个值,值为1* key在Redis中存在,那么就会在当前数值的基础上再加1后保存** @param key      缓存的键值* @param timeout  时间* @param timeUnit 时间颗粒度*/public Long increment(final String key, long delta, final Long timeout, final TimeUnit timeUnit) {Long increment = increment(key, delta);expire(key, timeout, timeUnit);return increment;}/*** 自增缓存* key在Redis中不存在,redis中会创建这个key,并生成一个值,值为1* key在Redis中存在,那么就会在当前数值的基础上再加1后保存** @param key 缓存的键值*/public Long increment(final String key) {return redisTemplate.boundValueOps(key).increment();}/*** 自增缓存* key在Redis中不存在,redis中会创建这个key,并生成一个值,值为1* key在Redis中存在,那么就会在当前数值的基础上再加1后保存** @param key 缓存的键值*/public Long increment(final String key, long delta) {return redisTemplate.boundValueOps(key).increment(delta);}/*** 自减缓存** @param key 缓存的键值*/public Long decrement(final String key, long delta) {return redisTemplate.boundValueOps(key).decrement(delta);}/*** 自减缓存** @param key 缓存的键值*/public Long decrement(final String key) {return redisTemplate.boundValueOps(key).decrement();}/*** 设置有效时间** @param key     Redis键* @param timeout 超时时间* @return true=设置成功;false=设置失败*/public boolean expire(final String key, final long timeout) {return expire(key, timeout, TimeUnit.SECONDS);}/*** 设置有效时间** @param key     Redis键* @param timeout 超时时间* @param unit    时间单位* @return true=设置成功;false=设置失败*/public boolean expire(final String key, final long timeout, final TimeUnit unit) {return redisTemplate.expire(key, timeout, unit);}/*** 定时设置有效时间** @param key  Redis键* @param date 超时时间* @return true=设置成功;false=设置失败*/public boolean expireAt(final String key, final Date date) {return redisTemplate.expireAt(key, date);}/*** 获取有效时间** @param key Redis键* @return 有效时间*/public long getExpire(final String key) {return redisTemplate.getExpire(key);}/*** 获取有效时间** @param key Redis键* @return 有效时间*/public long getExpire(final String key, final TimeUnit timeUnit) {return redisTemplate.getExpire(key, timeUnit);}/*** 判断 key是否存在** @param key 键* @return true 存在 false不存在*/public Boolean hasKey(String key) {return redisTemplate.hasKey(key);}/*** 获得缓存的基本对象。** @param key 缓存键值* @return 缓存键值对应的数据*/public <T> T getCacheObject(final String key) {ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);}/*** 删除单个对象** @param key*/public boolean deleteObject(final String key) {return redisTemplate.delete(key);}/*** 删除Region** @param region*/public long deleteRegion(final String region) {Set keys = redisTemplate.keys(region + "*");return redisTemplate.delete(keys);}/*** 删除集合对象** @param collection 多个对象* @return*/public long deleteObject(final Collection collection) {return redisTemplate.delete(collection);}/*** 缓存List数据** @param key      缓存的键值* @param dataList 待缓存的List数据* @return 缓存的对象*/public <T> long setCacheList(final String key, final List<T> dataList) {Long count = redisTemplate.opsForList().rightPushAll(key, dataList);return count == null ? 0 : count;}/*** 缓存List数据** @param key      缓存的键值* @param dataList 待缓存的List数据* @return 缓存的对象*/public <T> long setCacheList(final String key, final List<T> dataList, final long timeout, final TimeUnit unit) {Long count = redisTemplate.opsForList().rightPushAll(key, dataList);redisTemplate.expire(key, timeout, unit);return count == null ? 0 : count;}/*** 获得缓存的list对象** @param key 缓存的键值* @return 缓存键值对应的数据*/public <T> List<T> getCacheList(final String key) {return redisTemplate.opsForList().range(key, 0, -1);}/*** 缓存Set** @param key     缓存键值* @param dataSet 缓存的数据* @return 缓存数据的对象*/public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) {BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);Iterator<T> it = dataSet.iterator();while (it.hasNext()) {setOperation.add(it.next());}return setOperation;}/*** 缓存Set** @param key     缓存键值* @param dataSet 缓存的数据* @return 缓存数据的对象*/public <T> BoundSetOperations<String, T> setCacheSet(final String key, final T... dataSet) {BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);setOperation.add(dataSet);return setOperation;}/*** set中移除指定元素** @param key* @param dataSet* @return*/public <T> Long removeSet(final String key, final Set<T> dataSet) {return redisTemplate.opsForSet().remove(key, dataSet);}public <T> Long removeSet(final String key, T... dataSet) {return redisTemplate.opsForSet().remove(key, dataSet);}/*** set 出栈** @param key* @param <T>* @return*/public <T> T popSet(final String key) {return (T) redisTemplate.opsForSet().pop(key);}/*** 向key对应的value值中批量添加值,可以是集合、数组、多参数** @param key* @param <T>* @return*/public <T> T addSet(final String key, final T value) {return (T) redisTemplate.opsForSet().add(key, value);}/*** 获取key对应的值的长度** @param key* @return*/public Long countBySet(final String key) {return redisTemplate.opsForSet().size(key);}/*** set 出栈** @param key* @return*/public Long countByList(final String key) {return redisTemplate.opsForList().size(key);}/*** 检查给定的元素是否在Set变量中** @param key* @param value* @return*/public Boolean isMember(final String key, Object value) {return redisTemplate.opsForSet().isMember(key, value);}/*** 获得缓存的set** @param key* @return*/public <T> Set<T> getCacheSet(final String key) {return redisTemplate.opsForSet().members(key);}/*** 缓存Map** @param key* @param dataMap*/public <T> void setCacheMap(final String key, final Map<String, T> dataMap) {if (dataMap != null) {redisTemplate.opsForHash().putAll(key, dataMap);}}/*** 获得缓存的Map** @param key* @return*/public <T> Map<String, T> getCacheMap(final String key) {return redisTemplate.opsForHash().entries(key);}/*** 往Hash中存入数据** @param key   Redis键* @param hKey  Hash键* @param value 值*/public <T> void setCacheMapValue(final String key, final String hKey, final T value) {redisTemplate.opsForHash().put(key, hKey, value);}/*** 获取Hash中的数据** @param key  Redis键* @param hKey Hash键* @return Hash中的对象*/public <T> T getCacheMapValue(final String key, final String hKey) {HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();return opsForHash.get(key, hKey);}/*** 获取多个Hash中的数据** @param key   Redis键* @param hKeys Hash键集合* @return Hash对象集合*/public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) {return redisTemplate.opsForHash().multiGet(key, hKeys);}/*** 获得缓存的基本对象列表** @param pattern 字符串前缀* @return 对象列表*/public Collection<String> keys(final String pattern) {return redisTemplate.keys(pattern);}}

—————————<<

Redisson

Redisson 是一个在 Redis 的功能基础上实现的 Java 驻内存数据网格客户端。实现了分布式和可扩展的 Java 数据结构,提供很多分布式相关操作服务,例如分布式锁,分布式集合,可通过 Redis 支持延迟队列。

依赖

<!--redisSon-->
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId>
</dependency>

yml配置

spring:redis:host: 127.0.0.1port: 6379password: 

案例:

import com.alibaba.fastjson2.JSON;
import org.junit.jupiter.api.Test;
import org.redisson.Redisson;
import org.redisson.api.*;
import org.redisson.codec.SerializationCodec;
import org.redisson.config.Config;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;/*** @author chengjiang*/
public class DemoRedisson {/*** 通用对象桶,可以用来存放任类型的对象*/@Testpublic void RedissonBucket() {// 创建Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作对象桶来存储对象(同步)RBucket<Object> bucket = redissonClient.getBucket("redisson-bucket");//设置值为victory,过期时间为3小时bucket.set("测试一下看看", 30, TimeUnit.HOURS);Object value = bucket.get();System.out.println("value----" + value);// value----测试一下看看//通过key取value值Object name = redissonClient.getBucket("name444").get();System.out.println("name----" + name);// name----测试一下看看// 关闭客户端redissonClient.shutdown();}/*** 二进制流* 提供了InputStream接口和OutputStream接口的实现*/@Testpublic void RedissonStream() throws IOException {// 创建Redisson客户端 Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作流来存储对象 RBinaryStream stream = redissonClient.getBinaryStream("redisson-stream");// 写入数据方式一stream.set("你好,".getBytes());// 写入数据方式一OutputStream outputStream = stream.getOutputStream();outputStream.write("测试一下看看".getBytes());// 读取数据InputStream inputStream = stream.getInputStream();ByteArrayOutputStream result = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int length;while ((length = inputStream.read(bytes)) != -1) {result.write(bytes, 0, length);}System.out.println(result.toString());// 关闭客户端 redissonClient.shutdown();}/*** Redisson操作list*/@Testpublic void list() {// 创建Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作list RList<String> list = redissonClient.getList("redisson-list");list.add("victory1");list.add("victory2");//取值List<String> list1 = list.readAll();System.out.println("list1----" + JSON.toJSONString(list1));// list1----["victory1","victory2"]//移除索引0位置元素list.remove(0);//取值List<String> list2 = list.readAll();System.out.println("list2----" + JSON.toJSONString(list2));// list2----["victory2"]// 关闭客户端 redissonClient.shutdown();}/*** set* Redisson操作set*/@Testpublic void set() {// 创建Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作list RSet<Object> set = redissonClient.getSet("redisson-set");set.add("victory1");set.add("victory2");//通过key取value值Set<Object> set1 = redissonClient.getSet("redisson-set");System.out.println("set1 -- " + set1);// set1 -- [victory2, victory1]// 关闭客户端 redissonClient.shutdown();}/*** map* Redisson操作map* Redisson将Redis中的字符串数据结构封装成了RMap,就是原本redis中的string类型*/@Testpublic void map() {// 创建Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作list RMap<Object, Object> map = redissonClient.getMap("redisson-map");map.put("name1", "victory1");map.put("name2", "victory2");//通过key取value值Object o = redissonClient.getMap("redisson-map").get("name1");System.out.println(o);// 关闭客户端 redissonClient.shutdown();}/*** 队列* Redisson操作queue*/@Testpublic void queue() {// 创建Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作queue RQueue<String> queue = redissonClient.getQueue("redisson-queue");//存值queue.add("victory1");queue.add("victory2");//取值String item = queue.poll();System.out.println(item);//RQueue<Object> queue1 = redissonClient.getQueue("redisson-queue");System.out.println(queue1);// 关闭客户端 redissonClient.shutdown();}/*** 阻塞队列* Redisson操作blockingDeque*/@Testpublic void blockingDeque() throws InterruptedException {// 创建Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);//阻塞队列RBlockingQueue<Object> blockingQueue = redissonClient.getBlockingQueue("redisson-blockingDeque");//延迟队列RDelayedQueue<Object> delayedQueue = redissonClient.getDelayedQueue(blockingQueue);delayedQueue.offer("阻塞消息阻塞消息阻塞消息阻塞消息", 30, TimeUnit.SECONDS);// 获取消息RBlockingDeque<Object> blockingDeque = redissonClient.getBlockingDeque("redisson-blockingDeque");Object msg = blockingDeque.take();System.out.println("msg = " + msg);}/*** 限流器* Redisson操作rateLimiter*/@Testpublic void rateLimiter() throws InterruptedException {// 创建Redisson客户端 Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作rateLimiter RRateLimiter rateLimiter = redissonClient.getRateLimiter("redisson-rateLimiter");// 创建限流器,最大流速:每1秒钟产生20个令牌rateLimiter.trySetRate(RateType.OVERALL, 20, 10, RateIntervalUnit.SECONDS);long l2 = System.currentTimeMillis();for (int i = 0; i < 22; i++) {rateLimiter.acquire(1);long l = System.currentTimeMillis();System.out.println("----------" + i + " = " + (l - l2));// ----------18 = 0// ----------19 = 1// ----------20 = 10008l2 = l;}// 等待执行完成,不设置等待可能出现还未执行完成客户端就关闭的情况Thread.sleep(2000);// 关闭客户端 redissonClient.shutdown();}/*** 可重入锁* Redisson操作RLock*/@Testpublic void lock() throws InterruptedException {// 创建Redisson客户端 Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作lock RLock lock = redissonClient.getLock("redisson-lock");for (int i = 0; i < 5; i++) {new Thread(() -> {lock.lock();try {System.out.println(Thread.currentThread().getName() + "---" + System.currentTimeMillis() + "---" + "获取了锁");Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}).start();}// 等待执行完成,不设置等待可能出现还未执行完成客户端就关闭的情况Thread.sleep(30000);// 关闭客户端 redissonClient.shutdown();}/*** 发布订阅操作* Redisson操作RTopic执行发布订阅操作**/@Testpublic void topicPublisherAndSubscriber() throws InterruptedException {// 创建Redisson客户端Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作topic执行发布操作RTopic topic1 = redissonClient.getTopic("redisson-topic", new SerializationCodec());
//        topic1.publish(new Message(1L, "victory", 18));topic1.publish("消息消息消息消息消息消息");// 操作topic执行订阅操作Thread.sleep(5000);RedissonClient redissonClient1 = Redisson.create(config);RTopic topic = redissonClient1.getTopic("redisson-topic", new SerializationCodec());topic.addListener(String.class, (channel, msg) -> {System.out.println("Redisson接收到消息" + msg);});Thread.sleep(10000);// 关闭客户端 redissonClient.shutdown();redissonClient1.shutdown();}/*** Redisson利用Redis实现了Java分布式布隆过滤器(Bloom Filter)* 作用:在缓存层前添加布隆过滤器,常用于高并发场景下应对缓存穿透问题* 布隆过滤器是一个非常长的二进制向量和一系列随机哈希函数的组合,可用于检索一个元素是否存在;*/@Testpublic void bloomFilter() {// 创建Redisson客户端 Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");RedissonClient redissonClient = Redisson.create(config);// 操作布隆过滤器RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("redisson-bloom-filter");// 初始化布隆过滤器,初始化预期插入的数据量为200,期望误差率为0.01bloomFilter.tryInit(200, 0.01);//插入数据bloomFilter.add("qwe");bloomFilter.add("asd");bloomFilter.add("zxc");//判断是否包含boolean victory = bloomFilter.contains("qwe");boolean forward = bloomFilter.contains("cvb");System.out.println(victory);//trueSystem.out.println(forward);//false// 关闭客户端 redissonClient.shutdown();}}

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

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

相关文章

SpringBoot中从HikariCP迁移到Oracle UCP指南

本博客文章的目标是作为从 HikariCP 和Oracle UCP&#xff08;通用连接池&#xff09;迁移的指南&#xff0c;因为它是连接到Oracle 数据库时的推荐方法。 HikariCP 简介 HikariCP是与 Spring Boot 应用程序一起使用的 JDBC 连接池。 简而言之&#xff0c;从 Java 开发人员的…

Python学习笔记--创建最简单的自定义异常类

在Python中&#xff0c;当创建一个函数时&#xff0c;它应该执行一些操作或返回一些值。如果函数为空&#xff0c;则没有实际的操作或返回值&#xff0c;这是不符合函数设计的初衷的。因此&#xff0c;在Python中&#xff0c;函数体不能为空&#xff0c;必须至少包含一个语句&a…

Unity UIBasePanel 简单的ui基类

简单的ui基类 UIBasePanel.cs using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections.Generic;namespace MYTOOL.UI {public class UIBasePanel : MonoBehaviour{//通过里式转换原则 来存储所有的控件private readonly Dictio…

HttpHeaders 源码中headers成员变量为什么声明为final

源码如下 public class HttpHeaders implements MultiValueMap<String, String>, Serializable {private final Map<String, List<String>> headers;public String getFirst(String headerName) {List<String> headerValues (List)this.headers.get(…

2024最新版Visual Studio Code安装使用指南

2024最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML Visual Studio Code最新版1.85已经于2023年11月由其官网 https://code.visualstudio.com正式发布&#xff0c;这是微软公司2024年发行的的最…

Android App开发基础(1)—— App的开发特点

本文介绍基于Android系统的App开发常识&#xff0c;包括以下几个方面&#xff1a;App开发与其他软件开发有什么不一样&#xff0c;App工程是怎样的组织结构又是怎样配置的&#xff0c;App开发的前后端分离设计是如何运作实现的&#xff0c;App的活动页面是如何创建又是如何跳转…

TensorFlow2实战-系列教程3:猫狗识别1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、项目介绍 基本流程&#xff1a; 数据预处理&#xff1a;图像数据处理&#xff0c…

Git 对文件名大小写不敏感的问题解决方案

目录 一、Git 对文件名大小写不敏感1.1 问题描述1.2 原因分析1.3 解决方案方式一&#xff1a;使用git命令进行修改方式二&#xff1a;关闭git 忽略大小写配置 &#xff08;可以当前项目设置&#xff0c;也可以全局设置 --global&#xff09; 二、新的问题&#xff08;重复的目录…

Web3:B站chainlink课程Lesson5遇到的小坑汇总

ethers代码 我用的ethers.js 6 &#xff0c;和视频里一样用的是5的不用看代码部分 ethers.providers.JsonRpcProvider("server") //无了 ethers.JsonRpcProvider("server") //现在的wallet.getTransactionCount() //无了 wallet.getNonce() //现在的Big…

已解决:安卓,怎么优雅接入科大讯飞语音评测功能?

写在前面&#xff1a; 网上关于讯飞接入的博客都很少&#xff0c;按说讯飞都是业界翘楚&#xff0c;不知为何&#xff0c;很少搜索到精品&#xff0c;一搜就是一个要求开会员的博客&#xff0c;我也是醉了。讯飞提供的文档也是不清晰&#xff0c;我是摸着石头过河&#xff0c;…

java集合ArrayList和HashSet的fail-fast与fail-safe以及ConcurrentModificationException

在 java 的集合工具类中&#xff0c;例如对 ArrayList 或者 HashSet 进行删除元素后再遍历元素时&#xff0c;会抛出 ConcurrentModificationException 异常。 fail-fast ArrayList public class TestList {public static void main(String[] args) {ArrayList<Integer>…

【iOS ARKit】BlendShapes

BlendShapes 基础介绍 利用前置摄像头采集到的用户面部表情特征&#xff0c;ARKit 提供了一种更加抽象的表示面部表情的方式&#xff0c;这种表示方式叫作 BlendShapes,BlendShapes 可以翻译成形状融合&#xff0c;在3ds Max 中也叫变形器&#xff0c;这个概念原本用于描述通过…

Ubuntu18编译jdk8源码

环境 系统 ubuntu18 Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux jdk源码openjdk-8u41-src-b04-14_jan_2020.zip bootJdk jdk-8u391-linux-x64.tar.gz ps -e|grep ssh sudo apt-get install ssh…

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法(LSBoost、Bag)含自动优化超参数和特征敏感性分析功能

【MATLAB第92期】基于MATLAB的集成聚合多输入单输出回归预测方法&#xff08;LSBoost、Bag&#xff09;含自动优化超参数和特征敏感性分析功能 本文展示多种非常用多输入单输出回归预测模型效果。 注&#xff1a;每次运行数据训练集测试集为随机&#xff0c;故对比不严谨&…

京东广告算法架构体系建设--在线模型系统分布式异构计算演变 | 京东零售广告技术团队

一、现状介绍 算法策略在广告行业中起着重要的作用&#xff0c;它可以帮助广告主和广告平台更好地理解用户行为和兴趣&#xff0c;从而优化广告投放策略&#xff0c;提高广告点击率和转化率。模型系统作为承载算法策略的载体&#xff0c;目前承载搜索、推荐、首焦、站外等众多广…

Linux 远程服务器与本地互传文件

本地传远程服务器: 你可以使用 scp 命令将整个文件夹复制到远程服务器上。以下是一个示例命令&#xff1a; scp -r /home/wanghaiyang/Documents/DockerServer/docker_compose_project/apollo apollo254.564.257.12:/home/apollo/code/docker_compose/ 请确保将 /home/wangh…

Word插入音乐视频文件快速方法 exe zip doc apk txt pdf bat等

需求&#xff1a; Word插入文件有哪些极限操作&#xff1f;如何快速插入音乐视频等文件 问题解决&#xff1a; 使用拖动进行文件快速插入&#xff08;PPT Excle 同理&#xff09; 操作 1.让文件和word界面处于同一屏幕&#xff0c;可以使用分屏 2.鼠标选中文件左键或者使用笔…

一些反序列化总结

1 反序列化漏洞原理 如果反序列化的内容就是那串字符串&#xff0c;是用户可以控制的&#xff08;即变量的值&#xff09;&#xff0c;且后台不正当的使用了PHP中的魔法函数&#xff0c;就会导致反序列化漏洞&#xff0c;可以执行任意命令。Java 序列化指 Java 对象转换为字节序…

面试经典 150 题 ---- 合并两个有序数组

面试经典 150 题 ---- 合并两个有序数组 合并两个有序数组方法一&#xff1a;直接合并后排序方法二&#xff1a;双指针方法三&#xff1a;逆向双指针 合并两个有序数组 方法一&#xff1a;直接合并后排序 这种方法最简单&#xff0c;直接将 nums2 的数组放到 nums1 数组的尾部…

Flink问题解决及性能调优-【Flink根据不同场景状态后端使用调优】

Flink 实时groupby聚合场景操作时&#xff0c;由于使用的是rocksdb状态后端&#xff0c;发现CPU的高负载卡在rocksdb的读写上&#xff0c;导致上游算子背压特别大。通过调优使用hashmap状态后端代替rocksdb状态后端&#xff0c;使吞吐量有了质的飞跃&#xff08;20倍的性能提升…