当前位置: 首页 > article >正文

Java阶段四06

第4章-第6节

一、知识点

geospatial、hyperloglog、bitmap、事务、Jedis、SpringBoot集成Redis

二、目标

  • 了解三种特殊数据类型的使用

  • 理解什么是Redis事务

  • 学会使用Redis事务

  • 掌握使用JAVA代码操作Redis

三、内容分析

  • 重点

    • 理解什么是Redis事务

    • 学会使用Redis事务

    • 掌握使用JAVA代码操作Redis

  • 难点

    • 理解什么是Redis事务

    • 掌握使用JAVA代码操作Redis

四、内容

1、三种特殊数据类型

1.1 geospatial 地理位置

用来记录地理位置信息,两地之间的距离,范围等

  • GEOADD

    将指定的地理空间位置(纬度、经度、名称)添加到指定的key

    经纬度不能错,错了就加不进去了

    GEOADD china:city 119.27345 26.04769 fuzhou # 添加地址
    GEOADD china:city 118.613 24.88946 quanzhou # 添加地址
    GEOADD china:city 118.03394 24.48405 xiamen 113.27324 23.15792 guangzhou # 添加多条

  • GEOPOS

    key里返回所有给定位置元素的位置(经度和纬度)。

    GEOPOS china:city fuzhou # 查询
    GEOPOS china:city fuzhou quanzhou # 查询多条

  • GEODIST

    返回两个给定位置之间的距离。

    如果两个位置之间的其中一个不存在, 那么命令返回空值。

    指定单位的参数 unit 必须是以下单位的其中一个:

    • m 表示单位为米。

    • km 表示单位为千米。

    • mi 表示单位为英里。

    • ft 表示单位为英尺。

    GEODIST china:city fuzhou guangzhou # 查询两地的直线距离
    GEODIST china:city fuzhou guangzhou km # 自定义单位

  • GEOHASH

    该命令将返回11个字符的Geohash字符串,所以没有精度Geohash,损失相比,使用内部52位表示。返回的geohashes具有以下特性:

    1. 他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。

    2. 它可以在 geohash.org 网站使用,网址 http://geohash.org/<geohash-string>。查询例子:Geohash - geohash.org/sqdtr74hyu0.

    3. 与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。

    GEODIST china:city fuzhou guangzhou # 查询两地的直线距离
    GEODIST china:city fuzhou guangzhou km # 自定义单位

  • GEORADIUS

    以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。

    范围可以使用以下其中一个单位:

    • m 表示单位为米。

    • km 表示单位为千米。

    • mi 表示单位为英里。

    • ft 表示单位为英尺。

    GEORADIUS china:city 119 26 500 km # 119 26这个经纬度为中心,方圆500KM的城市
    GEORADIUS china:city 119 26 500 km WITHDIST # 显示到中心的距离
    GEORADIUS china:city 119 26 500 km WITHDIST WITHCOORD # 显示自身的经纬度
    GEORADIUS china:city 119 26 500 km WITHDIST WITHCOORD COUNT 2 # 查询指定数量

  • GEORADIUSBYMEMBER

    这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点

    指定成员的位置被用作查询的中心。

    GEORADIUSBYMEMBER china:city fuzhou 500 km # 查询福州附近500km的城市

  • 其他使用

    ZRANGE china:city 0 -1 # 查看所有数据
    ZREM china:city fuzhou # 删除

1.2 hyperloglog

HyperLogLog是一种概率数据结构,用于计数唯一的东西(技术上这指的是估计集合的基数)。通常计数唯一项需要使用与您想要计数的项数量成比例的内存,因为您需要记住过去已经见过的元素,以避免多次计数。然而,有一组算法是用内存来换取精度的:在Redis实现的情况下,你以一个标准误差的估计度量结束,这个误差小于1%。这个算法的神奇之处在于,您不再需要使用与计算项数量成比例的内存量,而是可以使用固定数量的内存量!在最坏的情况下是12k字节,或者如果你的HyperLogLog(从现在开始我们就叫它HLL)包含很少的元素,那么就会少得多。

基数

A(1,2,3,4,5)

B(1,2,3,4,5,1)

这个时候 基数 = 5

应用场景

QQ空间访问量(一个人访问十次,还是算一个访问量)

  • 传统模式:使用set保存用户的id,利用set的去重特性,当用户量很大的时候会比较麻烦,而且占用内存比较大
  • Hyperlolos:内存固定,只需要用12KB的内存就可以进行实现(有错误率,但是是在允许范围内的)
PFADD mykey 1 2 3 4 5 # 添加数据
PFCOUNT mykey # 5
PFADD mykey2 1 2 3 1 2 3 1 2 3 # 添加数据
PFCOUNT mykey2 # 3
PFMERGE mykey3 mykey mykey2 # 合并mykey和mykey2为mykey3
PFCOUNT mykey3 # 5
1.3 bitmap

位图不是实际的数据类型,而是在String类型上定义的一组面向位的操作。因为字符串是二进制安全blob,它们的最大长度是512 MB,所以它们适合设置2^32个不同的位。

位图的最大优点之一是,在存储信息时,它们通常可以极大地节省空间。例如,在一个用增量用户id表示不同用户的系统中,仅使用512 MB内存就可以记住40亿用户的单个比特信息(例如,知道用户是否想要接收新闻通讯)。

位存储

主要用于存储用的状态 登录/未登录 打卡/未打卡 两个状态都可以使用Bitmaps

一个用户 365天打卡 = 365bit 差不多46B

SETBIT sign 0 1 # 设置用户sign的第一天 为1
GETBIT sign 0 # 获取第一天是否打卡
BITCOUNT sign # 统计打卡记录,统计为1的总数

2、事务

2.1 什么是Redis事务

一组命令的集合。事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

  • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

Redis的单条命令是原子性的,但是事务不保证原子性

所有的命令在事务中,没有执行,只有发起执行命令以后才会执行

2.2 使用流程
2.2.1 开启事务(MULTI)
127.0.0.1:6379> MULTI # 开启事务
OK
2.2.2 命令入队(写命令)
# 命令入队
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
2.2.3 执行事务(EXEC)
127.0.0.1:6379(TX)> EXEC # 执行事务
1) OK
2) OK
3) "v1"
4) OK
2.2.4 放弃事务
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> get k4
QUEUED
127.0.0.1:6379(TX)> DISCARD # 放弃事务,这个时候事务不会执行
OK
2.2.5 编译型异常

代码写错了,所有命令都不执行

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k5 v5
QUEUED
127.0.0.1:6379(TX)> set k6 v6
QUEUED
127.0.0.1:6379(TX)> get k5 v5
(error) ERR wrong number of arguments for 'get' command
127.0.0.1:6379(TX)> EXEC # 异常,所有命令都不会执行
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k5
(nil)
2.2.6 运行时异常

其他命令正常运行,错误命令抛出错误

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k7 v7
QUEUED
127.0.0.1:6379(TX)> set k8 v8
QUEUED
127.0.0.1:6379(TX)> incr k7
QUEUED
127.0.0.1:6379(TX)> EXEC # 运行的时候异常,其他命令可以正常执行
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get k8
"v8"
127.0.0.1:6379>

3、Jedis

Redis官方推荐的JAVA连接开发工具

3.1 依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version>
</dependency>
3.2 使用
@Test
void redisTest01() {// 创建Jedis连接对象Jedis jedis = new Jedis("127.0.0.1", 6379);// 直接调用相关语法即可// 检测是否连接成功System.out.println(jedis.ping());System.out.println(jedis.get("k1"));jedis.set("k1", "V1");// 关闭连接jedis.close();
}
3.3 事务
@Test
void redisTest02() {Jedis jedis = new Jedis("127.0.0.1", 6379);// 获取一个Redis事务对象Transaction multi = jedis.multi();try {// 往事务中插入语句multi.set("k2", "v2");multi.set("k3", "v3");// 执行事务multi.exec();} catch (Exception e) {e.printStackTrace();// 回滚事务multi.discard();}jedis.close();
}

4、 SpringBoot整合Redis

创建的时候选择NoSql的Redis或者手动导入依赖

4.1 依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
4.2 配置Redis
spring:redis:host: 127.0.0.1port: 6379
4.3 使用
  • 使用默认配置
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User implements Serializable {private String id;private String username;private String password;private String name;
    }
    ​
    @Resource
    RedisTemplate<String, Object> redisTemplate;
    ​
    @Test
    void redisTest03() throws JsonProcessingException {// RedisTemplate用来操作不同的数据类型ValueOperations<String, Object> opsForValue = redisTemplate.opsForValue();// opsForValue操作字符串opsForValue.set("t1", "t1");// 操作对象User user = new User("1", "admin", "admin", "管理员");ObjectMapper mapper = new ObjectMapper();// 转成字符串opsForValue.set("user:" + user.getId(), mapper.writeValueAsString(user));System.out.println(opsForValue.get("user:" + user.getId()));
    }

  • 自己修改(推荐)

    发现存在Redis中的数据长这样 \xac\xed\x00\x05t\x00\x06user:1

    需要自定义一个Template

    添加依赖

    <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.5</version>
    </dependency>
    @Configuration
    public class RedisConfig {// 定义了一个RedisTemplate@Bean@SuppressWarnings("all")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {// RedisTemplate 为了自己方便一般直接使用<String,Object>RedisTemplate<String, Object> template = new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);// 序列化配置Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper om = new ObjectMapper();// 设置可见度om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 启动默认的类型om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);// 序列化类,对象映射设置jackson2JsonRedisSerializer.setObjectMapper(om);// String的序列化StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(stringRedisSerializer);// hash的key采用String的学历恶化template.setHashKeySerializer(stringRedisSerializer);// value采用jackson的序列化template.setValueSerializer(jackson2JsonRedisSerializer);// hash的value采用jackson的序列化template.setHashValueSerializer(jackson2JsonRedisSerializer);return template;}
    }

  • 工具类
    /*** spring redis 工具类** @author ruoyi**/
    @SuppressWarnings(value = {"unchecked", "rawtypes"})
    @Component
    public class RedisUtil {@Autowiredpublic 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 Integer timeout, final TimeUnit timeUnit) {redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}
    ​/*** 设置有效时间** @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 缓存键值* @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);}
    ​/*** 删除集合对象** @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 缓存的键值* @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* @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* @param hKey*/public void delCacheMapValue(final String key, final String hKey) {HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.delete(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);}
    }

  • 使用
    @Autowired
    RedisUtil redisUtil;
    @Test
    void redisTest04() throws JsonProcessingException {User user = new User("1", "admin", "admin", "管理员");redisUtil.setCacheObject("user:"+user.getId(),user);System.out.println(redisUtil.getCacheObject("user:"+user.getId()).toString());
    }

5、小结

本章节中我们学习了三种特殊数据类型的使用、理解了什么是Redis事务、学会使用Redis事务、在JAVA中使用了Redis依赖来操作Redis数据 ,同时使用了SpringBoot和工具类对Redis进行整合。

下一节中我们将会学习Redis的持久化、主从赋值等操作,加深对Redis的使用的理解。

相关文章:

Java阶段四06

第4章-第6节 一、知识点 geospatial、hyperloglog、bitmap、事务、Jedis、SpringBoot集成Redis 二、目标 了解三种特殊数据类型的使用 理解什么是Redis事务 学会使用Redis事务 掌握使用JAVA代码操作Redis 三、内容分析 重点 理解什么是Redis事务 学会使用Redis事务 掌…...

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...

题2025年春节 — 五言绝句一首,Hip-Hop一首

题 2025年春节 (五言绝句) 朔 气 寒 千 古&#xff0c;萧 萧 冷 地 空。 千 门 坐 暖 室&#xff0c;看 雪 一 清 冬。 题 2025年春节 (HipHop) 这寒风都吹了几十亿年&#xff0c;没什么新奇的&#xff1b; 那黄叶萧瑟遍布了地球&#xff0c;每年都一样的。 小年过了是大年&…...

WPF常见面试题解答

以下是WPF&#xff08;Windows Presentation Foundation&#xff09;面试中常见的问题及解答&#xff0c;涵盖基础概念、高级功能和实际应用&#xff0c;帮助你更好地准备面试&#xff1a; 基础概念 什么是WPF&#xff1f; WPF是微软开发的用于构建桌面应用程序的UI框架&#x…...

使用Vue3实现可拖拽的九点导航面板

开篇 本文使用Vue3实现了一个可拖拽的九宫导航面板。这个面板在我这里的应用场景是我个人网站的首页的位置&#xff0c;九宫导航对应的是用户最后使用或者最多使用的九个功能&#xff0c;正常应该是由后端接口返回的&#xff0c;不过这里为了简化&#xff0c;写的是固定的数组数…...

68-《贝壳花》

贝壳花 贝壳花&#xff08;学名&#xff1a;Moluccella laevis Linn.&#xff09;是属于唇形科&#xff0c;贝壳花是一、二年的草本。植株高5至60cm&#xff0c;茎四棱&#xff0c;不分枝。叶对生&#xff0c;心脏状圆形&#xff0c;边缘疏生齿牙&#xff1b;叶柄和叶近等长。花…...

C++ Lambda 表达式的本质及原理分析

目录 1.引言 2.Lambda 的本质 3.Lambda 的捕获机制的本质 4.捕获方式的实现与底层原理 5.默认捕获的实现原理 6.捕获 this 的机制 7.捕获的限制与注意事项 8.总结 1.引言 C 中的 Lambda 表达式是一种匿名函数&#xff0c;最早在 C11 引入&#xff0c;用于简化函数对象的…...

深入理解三高架构:高可用性、高性能、高扩展性的最佳实践

引言 在现代互联网环境下&#xff0c;随着用户规模和业务需求的快速增长&#xff0c;系统架构的设计变得尤为重要。为了确保系统能够在高负载和复杂场景下稳定运行&#xff0c;"三高架构"&#xff08;高可用性、高性能、高扩展性&#xff09;成为技术架构设计中的核…...

【自然语言处理(NLP)】深度循环神经网络(Deep Recurrent Neural Network,DRNN)原理和实现

文章目录 介绍深度循环神经网络&#xff08;DRNN&#xff09;原理和实现结构特点工作原理符号含义公式含义 应用领域优势与挑战DRNN 代码实现 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 介绍 **自然语言处理&#xff08;Natural Language Pr…...

2025数学建模美赛|F题成品论文

国家安全政策与网络安全 摘要 随着互联网技术的迅猛发展&#xff0c;网络犯罪问题已成为全球网络安全中的重要研究课题&#xff0c;且网络犯罪的形式和影响日益复杂和严重。本文针对网络犯罪中的问题&#xff0c;基于多元回归分析和差异中的差异&#xff08;DiD&#xff09;思…...

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

代码&#xff1a; import torch import numpy as np import torch.nn as nn# 定义数据&#xff1a;x_data 是特征&#xff0c;y_data 是标签&#xff08;目标值&#xff09; data [[-0.5, 7.7],[1.8, 98.5],[0.9, 57.8],[0.4, 39.2],[-1.4, -15.7],[-1.4, -37.3],[-1.8, -49.…...

【MQ】如何保证消息队列的高可用?

RocketMQ NameServer集群部署 Broker做了集群部署 主从模式 类型&#xff1a;同步复制、异步复制 主节点返回消息给客户端的时候是否需要同步从节点 Dledger&#xff1a;要求至少消息复制到半数以上的节点之后&#xff0c;才给客户端返回写入成功 slave定时从master同步数据…...

本地大模型编程实战(04)给文本自动打标签

文章目录 准备实例化本地大模型情感分析更精细的控制总结代码 使用本地大模型可以根据需要给文本打标签&#xff0c;本文介绍了如何基于 langchain 和本地部署的大模型给文本打标签。 本文使用 llama3.1 作为本地大模型&#xff0c;它的性能比非开源大模型要查一下&#xff0c;…...

关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法

本来是看到一位好友的自己建站&#xff0c;所以突发奇想&#xff0c;在本地装个WordPress玩玩吧&#xff0c;就尝试着装了一下&#xff0c;因为之前电脑上就有MySQL&#xff0c;所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题&#xff0c;也就是启动过…...

【蓝桥杯】43694.正则问题

题目描述 考虑一种简单的正则表达式&#xff1a; 只由 x ( ) | 组成的正则表达式。 小明想求出这个正则表达式能接受的最长字符串的长度。 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是&#xff1a; xxxxxx&#xff0c;长度是 6。 输入描述 一个由 x()| 组成的正则表达式。…...

服务器虚拟化技术详解与实战:架构、部署与优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在现代 IT 基础架构中&#xff0c;服务器虚拟化已成为提高资源利用率、降低运维成本、提升系统灵活性的重要手段。通过服务…...

git困扰的问题

.gitignore中添加的某个忽略文件并不生效 把某些目录或文件加入忽略规则&#xff0c;按照上述方法定义后发现并未生效&#xff0c; gitignore只能忽略那些原来没有被追踪的文件&#xff0c;如果某些文件已经被纳入了版本管理中&#xff0c;则修改.gitignore是无效的。 解决方…...

jvm--类的生命周期

学习类的生命周期之前&#xff0c;需要了解一下jvm的几个重要的内存区域&#xff1a; &#xff08;1&#xff09;方法区&#xff1a;存放已经加载的类信息、常量、静态变量以及方法代码的内存区域 &#xff08;2&#xff09;常量池&#xff1a;常量池是方法区的一部分&#x…...

定制Centos镜像(一)

环境准备&#xff1a; 一台最小化安装的干净的系统&#xff0c;这里使用Centos7.9,一个Centos镜像&#xff0c;镜像也使用Centos7.9的。 [rootlocalhost ~]# cat /etc/system-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# rpm -qa | wc -l 306 [rootloca…...

C语言------数组思维导图

...

TensorFlow实现逻辑回归模型

逻辑回归是一种经典的分类算法&#xff0c;广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型&#xff0c;并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先&#xff0c;我们准备两类数据点&#xff0c;分别表示两个不同…...

《十七》浏览器基础

浏览器&#xff1a;是安装在电脑里面的一个软件&#xff0c;能够将页面内容渲染出来呈现给用户查看&#xff0c;并让用户与网页进行交互。 常见的主流浏览器&#xff1a; 常见的主流浏览器有&#xff1a;Chrome、Safari、Firefox、Opera、Edge 等。 输入 URL&#xff0c;浏览…...

Windows 靶机常见服务、端口及枚举工具与方法全解析:SMB、LDAP、NFS、RDP、WinRM、DNS

在渗透测试中&#xff0c;Windows 靶机通常会运行多种服务&#xff0c;每种服务都有其默认端口和常见的枚举工具及方法。以下是 Windows 靶机常见的服务、端口、枚举工具和方法的详细说明&#xff1a; 1. SMB&#xff08;Server Message Block&#xff09; 端口 445/TCP&…...

IME关于输入法横屏全屏显示问题-Android14

IME关于输入法横屏全屏显示问题-Android14 1、输入法全屏模式updateFullscreenMode1.1 全屏模式判断1.2 全屏模式布局设置 2、应用侧关闭输入法全屏模式2.1 调用输入法的应用设置flag2.2 继承InputMethodService.java的输入法应用覆盖onEvaluateFullscreenMode方法 InputMethod…...

网络安全 | F5-Attack Signatures-Set详解

关注&#xff1a;CodingTechWork 创建和分配攻击签名集 可以通过两种方式创建攻击签名集&#xff1a;使用过滤器或手动选择要包含的签名。  基于过滤器的签名集仅基于在签名过滤器中定义的标准。基于过滤器的签名集的优点在于&#xff0c;可以专注于定义用户感兴趣的攻击签名…...

STranslate 中文绿色版即时翻译/ OCR 工具 v1.3.1.120

STranslate 是一款功能强大且用户友好的翻译工具&#xff0c;它支持多种语言的即时翻译&#xff0c;提供丰富的翻译功能和便捷的使用体验。STranslate 特别适合需要频繁进行多语言交流的个人用户、商务人士和翻译工作者。 软件功能 1. 即时翻译&#xff1a; 文本翻译&#xff…...

基于微信小程序的助农扶贫系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

我谈区域偏心率

偏心率的数学定义 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》P312 区域的拟合椭圆看这里。 Rafael Gonzalez的二阶中心矩的表达不说人话。 我认为半长轴和半短轴不等于特征值&#xff0c;而是特征值的根号。…...

关于低代码技术架构的思考

我们经常会看到很多低代码系统的技术架构图&#xff0c;而且经常看不懂。是因为技术架构图没有画好&#xff0c;还是因为技术不够先进&#xff0c;有时候往往都不是。 比如下图&#xff1a; 一个开发者&#xff0c;看到的视角往往都是技术层面&#xff0c;你给用户讲React18、M…...

若依路由配置教程

1. 路由配置文件 2. 配置内容介绍 { path: "/tool/gen-edit", component: Layout, //在路由下&#xff0c;引用组件的名称&#xff0c;在页面中包括这个组件的内容(页面框架内容) hidden: true, //此页面的内容&#xff0c;在左边的菜单中不用显示。 …...