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具有以下特性:
-
他们可以缩短从右边的字符。它将失去精度,但仍将指向同一地区。
-
它可以在
geohash.org网站使用,网址http://geohash.org/<geohash-string>。查询例子:Geohash - geohash.org/sqdtr74hyu0. -
与类似的前缀字符串是附近,但相反的是不正确的,这是可能的,用不同的前缀字符串附近。
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题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...
题2025年春节 — 五言绝句一首,Hip-Hop一首
题 2025年春节 (五言绝句) 朔 气 寒 千 古,萧 萧 冷 地 空。 千 门 坐 暖 室,看 雪 一 清 冬。 题 2025年春节 (HipHop) 这寒风都吹了几十亿年,没什么新奇的; 那黄叶萧瑟遍布了地球,每年都一样的。 小年过了是大年&…...
WPF常见面试题解答
以下是WPF(Windows Presentation Foundation)面试中常见的问题及解答,涵盖基础概念、高级功能和实际应用,帮助你更好地准备面试: 基础概念 什么是WPF? WPF是微软开发的用于构建桌面应用程序的UI框架&#x…...
使用Vue3实现可拖拽的九点导航面板
开篇 本文使用Vue3实现了一个可拖拽的九宫导航面板。这个面板在我这里的应用场景是我个人网站的首页的位置,九宫导航对应的是用户最后使用或者最多使用的九个功能,正常应该是由后端接口返回的,不过这里为了简化,写的是固定的数组数…...
68-《贝壳花》
贝壳花 贝壳花(学名:Moluccella laevis Linn.)是属于唇形科,贝壳花是一、二年的草本。植株高5至60cm,茎四棱,不分枝。叶对生,心脏状圆形,边缘疏生齿牙;叶柄和叶近等长。花…...
C++ Lambda 表达式的本质及原理分析
目录 1.引言 2.Lambda 的本质 3.Lambda 的捕获机制的本质 4.捕获方式的实现与底层原理 5.默认捕获的实现原理 6.捕获 this 的机制 7.捕获的限制与注意事项 8.总结 1.引言 C 中的 Lambda 表达式是一种匿名函数,最早在 C11 引入,用于简化函数对象的…...
深入理解三高架构:高可用性、高性能、高扩展性的最佳实践
引言 在现代互联网环境下,随着用户规模和业务需求的快速增长,系统架构的设计变得尤为重要。为了确保系统能够在高负载和复杂场景下稳定运行,"三高架构"(高可用性、高性能、高扩展性)成为技术架构设计中的核…...
【自然语言处理(NLP)】深度循环神经网络(Deep Recurrent Neural Network,DRNN)原理和实现
文章目录 介绍深度循环神经网络(DRNN)原理和实现结构特点工作原理符号含义公式含义 应用领域优势与挑战DRNN 代码实现 个人主页:道友老李 欢迎加入社区:道友老李的学习社区 介绍 **自然语言处理(Natural Language Pr…...
2025数学建模美赛|F题成品论文
国家安全政策与网络安全 摘要 随着互联网技术的迅猛发展,网络犯罪问题已成为全球网络安全中的重要研究课题,且网络犯罪的形式和影响日益复杂和严重。本文针对网络犯罪中的问题,基于多元回归分析和差异中的差异(DiD)思…...
自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
代码: import torch import numpy as np import torch.nn as nn# 定义数据:x_data 是特征,y_data 是标签(目标值) 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做了集群部署 主从模式 类型:同步复制、异步复制 主节点返回消息给客户端的时候是否需要同步从节点 Dledger:要求至少消息复制到半数以上的节点之后,才给客户端返回写入成功 slave定时从master同步数据…...
本地大模型编程实战(04)给文本自动打标签
文章目录 准备实例化本地大模型情感分析更精细的控制总结代码 使用本地大模型可以根据需要给文本打标签,本文介绍了如何基于 langchain 和本地部署的大模型给文本打标签。 本文使用 llama3.1 作为本地大模型,它的性能比非开源大模型要查一下,…...
关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法
本来是看到一位好友的自己建站,所以突发奇想,在本地装个WordPress玩玩吧,就尝试着装了一下,因为之前电脑上就有MySQL,所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题,也就是启动过…...
【蓝桥杯】43694.正则问题
题目描述 考虑一种简单的正则表达式: 只由 x ( ) | 组成的正则表达式。 小明想求出这个正则表达式能接受的最长字符串的长度。 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是: xxxxxx,长度是 6。 输入描述 一个由 x()| 组成的正则表达式。…...
服务器虚拟化技术详解与实战:架构、部署与优化
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在现代 IT 基础架构中,服务器虚拟化已成为提高资源利用率、降低运维成本、提升系统灵活性的重要手段。通过服务…...
git困扰的问题
.gitignore中添加的某个忽略文件并不生效 把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效, gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。 解决方…...
jvm--类的生命周期
学习类的生命周期之前,需要了解一下jvm的几个重要的内存区域: (1)方法区:存放已经加载的类信息、常量、静态变量以及方法代码的内存区域 (2)常量池:常量池是方法区的一部分&#x…...
定制Centos镜像(一)
环境准备: 一台最小化安装的干净的系统,这里使用Centos7.9,一个Centos镜像,镜像也使用Centos7.9的。 [rootlocalhost ~]# cat /etc/system-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# rpm -qa | wc -l 306 [rootloca…...
C语言------数组思维导图
...
TensorFlow实现逻辑回归模型
逻辑回归是一种经典的分类算法,广泛应用于二分类问题。本文将介绍如何使用TensorFlow框架实现逻辑回归模型,并通过动态绘制决策边界和损失曲线来直观地观察模型的训练过程。 数据准备 首先,我们准备两类数据点,分别表示两个不同…...
《十七》浏览器基础
浏览器:是安装在电脑里面的一个软件,能够将页面内容渲染出来呈现给用户查看,并让用户与网页进行交互。 常见的主流浏览器: 常见的主流浏览器有:Chrome、Safari、Firefox、Opera、Edge 等。 输入 URL,浏览…...
Windows 靶机常见服务、端口及枚举工具与方法全解析:SMB、LDAP、NFS、RDP、WinRM、DNS
在渗透测试中,Windows 靶机通常会运行多种服务,每种服务都有其默认端口和常见的枚举工具及方法。以下是 Windows 靶机常见的服务、端口、枚举工具和方法的详细说明: 1. SMB(Server Message Block) 端口 445/TCP&…...
IME关于输入法横屏全屏显示问题-Android14
IME关于输入法横屏全屏显示问题-Android14 1、输入法全屏模式updateFullscreenMode1.1 全屏模式判断1.2 全屏模式布局设置 2、应用侧关闭输入法全屏模式2.1 调用输入法的应用设置flag2.2 继承InputMethodService.java的输入法应用覆盖onEvaluateFullscreenMode方法 InputMethod…...
网络安全 | F5-Attack Signatures-Set详解
关注:CodingTechWork 创建和分配攻击签名集 可以通过两种方式创建攻击签名集:使用过滤器或手动选择要包含的签名。 基于过滤器的签名集仅基于在签名过滤器中定义的标准。基于过滤器的签名集的优点在于,可以专注于定义用户感兴趣的攻击签名…...
STranslate 中文绿色版即时翻译/ OCR 工具 v1.3.1.120
STranslate 是一款功能强大且用户友好的翻译工具,它支持多种语言的即时翻译,提供丰富的翻译功能和便捷的使用体验。STranslate 特别适合需要频繁进行多语言交流的个人用户、商务人士和翻译工作者。 软件功能 1. 即时翻译: 文本翻译ÿ…...
基于微信小程序的助农扶贫系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
我谈区域偏心率
偏心率的数学定义 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P312 区域的拟合椭圆看这里。 Rafael Gonzalez的二阶中心矩的表达不说人话。 我认为半长轴和半短轴不等于特征值,而是特征值的根号。…...
关于低代码技术架构的思考
我们经常会看到很多低代码系统的技术架构图,而且经常看不懂。是因为技术架构图没有画好,还是因为技术不够先进,有时候往往都不是。 比如下图: 一个开发者,看到的视角往往都是技术层面,你给用户讲React18、M…...
若依路由配置教程
1. 路由配置文件 2. 配置内容介绍 { path: "/tool/gen-edit", component: Layout, //在路由下,引用组件的名称,在页面中包括这个组件的内容(页面框架内容) hidden: true, //此页面的内容,在左边的菜单中不用显示。 …...
