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

Windows打开redis以及Springboot整合redis

目录

    • 前言
    • Windows系统打开redis
    • Springboot整合redis
      • 依赖
      • 实体类
      • yml配置文件
      • config配置
      • 各个数据存储类型分别说明记录
        • string
          • 数据写入redis,并查询
          • 通过命令行查询
        • list
          • 插入数据到redis中
          • 从redis中读取
          • 命令读取数据
        • hash
          • 向redis中逐个添加map键值对
          • 获取key对应的map中所有的键
          • 获取key对应的所有map键值对
          • 获取key对应的map中,key为username的map的对应的值
          • 获取key对应的map中所有的值
          • 判断key对应的map中是否有指定的键
          • 如果key对应的map不存在,则新增到map中,存在则不新增也不覆盖
          • 将一个完成的键值对直接放入redis
          • 命令读取数据
        • set
          • 向key中批量添加值
          • 获取key中的所有值
          • 获取key对应集合的长度
          • 随机获取key对应的集合中的元素
          • 随机获取key对应集合中指定个数的元素
          • 随机获取key对应集合中指定个数的元素,并且去重
          • 将key1对应集合中的值v1,转移到key2集合中
          • 随机删除集合中的一个元素
          • 随机删除集合中的指定数量的元素
          • 批量移除key对应集合中指定的元素
          • 获取key与另一个otherKey集合之间的差值
          • 获取key与另一个otherKey所对应的集合之间的差值,并将结果存入指定的destKey中
          • 获取两个集合中的交集元素
          • 获取两个集合的合集,并且去重
          • 命令读取数据
        • zset
          • 向指定key中添加元素,按照score值由小到大进行排列
          • 获取key对应集合中o元素的score值
          • 获取集合大小
          • 获取指定下标之间的值
          • 获取指定score区间的值
          • 获取指定元素在集合中的索引,索引从0开始
          • 获取倒序排列的索引值,索引从0开始
          • 移除集合中指定的值
          • 移除指定下标的值
          • 命令读取数据
        • 注意

前言

       在springboot框架中,通过RedisTemplate中封装好的方法去操作redis中的各种数据类型,完成增删改查操作。
       本项目将数据序列化为json格式,分别以set、zset、hash的结构存入数据库中,完成查询所有数据、通过id查询单个数据,新增数据的操作。

redis有五种常用的数据结构:string hash list set zset
key-string:一个key对应一个值。
key-hash:一个key对应一个Map。
key-list:一个key对应一个列表。
key-set:一个key对应一个集合。
key-zset:一个key对应一个有序的集合。

在这里插入图片描述

Windows系统打开redis

我从网上下载来的redis包,里面有这些内容。
在这里插入图片描述
但是启动redis的服务端时,不会去直接双击“redis-server.exe”文件,因为这样启动不会去读取配置文件,需要通过命令行启动。如果需要远程访问redis,则需要在配置文件中配置ip等信息。

bind 0.0.0.0 
监听地址,默认是127.0.0.1,会导致只能在本地访问,修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0protected-mode no
将保护模式改为no

使用cmd命令行启动服务端

redis-server redis.conf

在这里插入图片描述
双击启动客户端
在这里插入图片描述
redis的存储查询数据命令,会在演示springboot使用redis中说明。

Springboot整合redis

依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.0.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency></dependencies>

实体类

public class User {private Integer id = 0;private String username = "";private String remark = "";
}

yml配置文件

用于配置redis的ip、端口、数据库、连接池等

spring:redis:port: 6379host: 127.0.0.1database: 1password: 123456jedis:pool:max-active: 8max-idle: 8max-wait: 1mstimeout: 5000ms

config配置

将实体类数据序列化为json格式

import java.text.SimpleDateFormat;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.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;import com.fasterxml.jackson.databind.ObjectMapper;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<Object, Object> template = new RedisTemplate<>();//ObjectMapper 指定在转成json的时候的一些转换规则ObjectMapper objectMapper = new ObjectMapper();objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));template.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);// 把自定义的objectMapper设置到jackson2JsonRedisSerializerjackson2JsonRedisSerializer.setObjectMapper(objectMapper);// RedisTemplate默认的序列化方式使用的是jdk的序列化// 设置了key的序列化方式template.setKeySerializer(new StringRedisSerializer());template.setHashKeySerializer(jackson2JsonRedisSerializer); // 配置hash格式// 设置了value序列化方式template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer); // 配置hash格式return template;}
}

在启动类中需要使用@ComponentScan()注解扫描配置文件

各个数据存储类型分别说明记录

专门编写一个测试类

import com.alibaba.fastjson.JSON;
import com.redis.StartApplication;
import com.redis.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.ArrayList;
import java.util.List;@SpringBootTest(classes = StartApplication.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class TestRedis {@Autowiredprivate RedisTemplate redisTemplate;
}
string

初始化数据

    private String initUserJson() {return JSON.toJSON(new User(1,"hzx1","This is a test user")).toString();}
数据写入redis,并查询
    @Testpublic void saveDataInRedisString() {redisTemplate.opsForValue().set("user", initUserJson());// 输出存入redis的数据System.out.println(redisTemplate.opsForValue().get("user"));}

在这里插入图片描述

通过命令行查询
#1.  添加值
set key value#2. 取值
get key

在这里插入图片描述

list

初始化数据

    private List initUserList(int num) {List<User> resUserList = new ArrayList<>();for (int i = 1; i <= num; i++) {resUserList.add(new User(i, "hzx" + i, "This is the " + i + "th user"));}return resUserList;}
插入数据到redis中

list通过链表实现,插入数据时需要区分左插入和右插入。可以逐条数据插入也可以批量数据插入

    @Testpublic void saveDataInRedisList() {List list = initUserList(10);// 逐条插入for (Object user : list) {redisTemplate.opsForList().leftPush("userListLeft", user);redisTemplate.opsForList().rightPush("userListRight",user);}// 批量插入redisTemplate.opsForList().leftPushAll("userListLeft",list);redisTemplate.opsForList().rightPushAll("userListRight",list);}
从redis中读取
    @Testpublic void queryDataFromRedisList(){List userList;System.out.println("左插入List");userList = redisTemplate.opsForList().range("userListLeft", 0, 10);for (Object o : userList) {System.out.println(o.toString());}System.out.println("右插入List");userList = redisTemplate.opsForList().range("userListRight", 0, 10);for (Object o : userList) {System.out.println(o.toString());}}

两种插入方式,最终顺序也不同
在这里插入图片描述

命令读取数据
#1. 存储数据(从左侧插入数据,从右侧插入数据)
lpush key value [value ...]
rpush key value [value ...]#2. 存储数据(如果key不存在,什么事都不做,如果key存在,但是不是list结构,什么都不做)
lpushx key value
rpushx key value#3. 修改数据(在存储数据时,指定好你的索引位置,覆盖之前索引位置的数据,index超出整个列表的长度,也会失败)
lset key index value#4. 弹栈方式获取数据(左侧弹出数据,从右侧弹出数据)
lpop key
rpop key#5. 获取指定索引范围的数据(start从0开始,stop输入-1,代表最后一个,-2代表倒数第二个)
lrange key start stop#6. 获取指定索引位置的数据
lindex key index#7. 获取整个列表的长度
llen key#8. 删除列表中的数据(他是删除当前列表中的count个value值,count > 0从左侧向右侧删除,count < 0从右侧向左侧删除,count == 0删除列表中全部的value)
lrem key count value#9. 保留列表中的数据(保留你指定索引范围内的数据,超过整个索引范围被移除掉)
ltrim key start stop#10. 将一个列表中最后的一个数据,插入到另外一个列表的头部位置
rpoplpush list1 list2
hash
向redis中逐个添加map键值对
redisTemplate.opsForHash().put("map1","id",1);
redisTemplate.opsForHash().put("map1","username","hzx1");
redisTemplate.opsForHash().put("map1","remark","This is the No.1 user");
获取key对应的map中所有的键
redisTemplate.opsForHash().keys("map1")

在这里插入图片描述

获取key对应的所有map键值对
redisTemplate.opsForHash().entries("map1")

在这里插入图片描述

获取key对应的map中,key为username的map的对应的值
redisTemplate.opsForHash().get("map1", "username")

在这里插入图片描述

获取key对应的map中所有的值
redisTemplate.opsForHash().values("map1")

在这里插入图片描述

判断key对应的map中是否有指定的键
redisTemplate.opsForHash().hasKey("map1","username")
如果key对应的map不存在,则新增到map中,存在则不新增也不覆盖
 redisTemplate.opsForHash().putIfAbsent("map2","username","hzx2");redisTemplate.opsForHash().putIfAbsent("map2","username","hzx02abcd");

在这里插入图片描述

将一个完成的键值对直接放入redis
 Map<Object,Object> map3 = new HashMap<>();
map3.put("id",3);
map3.put("username","hzx03");
redisTemplate.opsForHash().putAll("map3",map3);

在这里插入图片描述

命令读取数据
#1. 存储数据
hset key field value#2. 获取数据
hget key field#3. 批量操作
hmset key field value [field value ...]
hmget key field [field ...]#4. 自增(指定自增的值)
hincrby key field increment#5. 设置值(如果key-field不存在,那么就正常添加,如果存在,什么事都不做)
hsetnx key field value#6. 检查field是否存在
hexists key field #7. 删除key对应的field,可以删除多个
hdel key field [field ...]#8. 获取当前hash结构中的全部field和value
hgetall key#9. 获取当前hash结构中的全部field
hkeys key#10. 获取当前hash结构中的全部value
hvals key#11. 获取当前hash结构中field的数量
hlen key
set
向key中批量添加值
redisTemplate.opsForSet().add("set1","hzx1","hzx2");
redisTemplate.opsForSet().add("set1","hzx3");
获取key中的所有值
redisTemplate.opsForSet().members("set1")

在这里插入图片描述

获取key对应集合的长度
redisTemplate.opsForSet().size("set1")

在这里插入图片描述

随机获取key对应的集合中的元素
redisTemplate.opsForSet().randomMember("set1")

在这里插入图片描述

随机获取key对应集合中指定个数的元素

set本身是不会有重复的值
随机获取可能获取到一样的,所以返回的list集合中可能会有重复的值

redisTemplate.opsForSet().randomMembers("set1",2)

在这里插入图片描述

随机获取key对应集合中指定个数的元素,并且去重
redisTemplate.opsForSet().distinctRandomMembers("set1",2)

在这里插入图片描述

将key1对应集合中的值v1,转移到key2集合中

key2不存在直接新增
v1不存在,转移失败返回false

redisTemplate.opsForSet().add("set2","hzx4");
redisTemplate.opsForSet().move("set2","hzx4","set1");
随机删除集合中的一个元素
redisTemplate.opsForSet().pop("set1");
随机删除集合中的指定数量的元素
// 随件删除两个元素
redisTemplate.opsForSet().pop("set1",2);
批量移除key对应集合中指定的元素
redisTemplate.opsForSet().remove("set1","hzx1","hzx2");
获取key与另一个otherKey集合之间的差值

difference(K key, K otherKey)
key中有,otherKeys中没有的

redisTemplate.opsForSet().add("set1","hzx1","hzx2","hzx3");
redisTemplate.opsForSet().add("set2","hzx1","hzx4","hzx5");
redisTemplate.opsForSet().difference("set1","set2")
获取key与另一个otherKey所对应的集合之间的差值,并将结果存入指定的destKey中

differenceAndStore(K key, K otherKey, K destKey)

redisTemplate.opsForSet().differenceAndStore("set1","set2","set2");
获取两个集合中的交集元素

intersect(K key, K otherKey)

redisTemplate.opsForSet().add("set1","hzx1","hzx2");
redisTemplate.opsForSet().add("set2","hzx2","hzx3","hzx4");
System.out.println(redisTemplate.opsForSet().intersect("set1","set2"));

在这里插入图片描述

获取两个集合的合集,并且去重

union(K key, K otherKey)

redisTemplate.opsForSet().add("set1","hzx1","hzx2");
redisTemplate.opsForSet().add("set2","hzx2","hzx3","hzx4");
System.out.println(redisTemplate.opsForSet().union("set1","set2"));

在这里插入图片描述

命令读取数据
#1. 存储数据
sadd key member [member ...]#2. 获取数据(获取全部数据)
smembers key#3. 随机获取一个数据(获取的同时,移除数据,count默认为1,代表弹出数据的数量)
spop key [count]#4. 交集(取多个set集合交集)
sinter set1 set2 ...#5. 并集(获取全部集合中的数据)
sunion set1 set2 ...#6. 差集(获取多个集合中不一样的数据)
sdiff set1 set2 ...# 7. 删除数据
srem key member [member ...]# 8. 查看当前的set集合中是否包含这个值
sismember key member
zset
向指定key中添加元素,按照score值由小到大进行排列

add(K key, V value, double score)

redisTemplate.opsForZSet().add("zSet1","hzx1",1);
redisTemplate.opsForZSet().add("zSet1","hzx2",2);
redisTemplate.opsForZSet().add("zSet1","hzx3",3);
System.out.println(redisTemplate.opsForZSet().range("zSet1",0,3));

在这里插入图片描述

获取key对应集合中o元素的score值

score(K key, Object o)

System.out.println(redisTemplate.opsForZSet().score("zSet1","hzx2"));

在这里插入图片描述

获取集合大小

zCard(K key)

System.out.println(redisTemplate.opsForZSet().zCard("zSet1"));

在这里插入图片描述

获取指定下标之间的值

range(K key, long start, long end)
(0,-1)就是获取全部

System.out.println(redisTemplate.opsForZSet().range("zSet1",0,-1));

在这里插入图片描述

获取指定score区间的值

rangeByScore(K key, double min, double max)

System.out.println(redisTemplate.opsForZSet().rangeByScore("zSet1",1.0,2.0));

在这里插入图片描述

获取指定元素在集合中的索引,索引从0开始

rank(K key, Object o)

System.out.println(redisTemplate.opsForZSet().rank("zSet1","hzx3"));

在这里插入图片描述

获取倒序排列的索引值,索引从0开始

reverseRank(K key, Object o)

System.out.println(redisTemplate.opsForZSet().reverseRank("zSet1","hzx3"));

在这里插入图片描述

移除集合中指定的值

remove(K key, Object… values)

redisTemplate.opsForZSet().remove("zSet1","hzx2");
System.out.println(redisTemplate.opsForZSet().range("zSet1",0,-1));

在这里插入图片描述

移除指定下标的值

removeRange(K key, long start, long end)

System.out.println("移出前: "+redisTemplate.opsForZSet().range("zSet1",0,-1));
redisTemplate.opsForZSet().removeRange("zSet1",0,1);
System.out.println("移出后: "+redisTemplate.opsForZSet().range("zSet1",0,-1));

在这里插入图片描述

命令读取数据
#1. 添加数据(score必须是数值。member不允许重复的。)
zadd key score member [score member ...]#2. 修改member的分数(如果member是存在于key中的,正常增加分数,如果memeber不存在,这个命令就相当于zadd)
zincrby key increment member#3. 查看指定的member的分数
zscore key member#4. 获取zset中数据的数量
zcard key#5. 根据score的范围查询member数量
zcount key min max#6. 删除zset中的成员
zrem key member [member...]#7. 根据分数从小到大排序,获取指定范围内的数据(withscores如果添加这个参数,那么会返回member对应的分数)
zrange key start stop [withscores]#8. 根据分数从大到小排序,获取指定范围内的数据(withscores如果添加这个参数,那么会返回member对应的分数)
zrevrange key start stop [withscores]#9. 根据分数的返回去获取member(withscores代表同时返回score,添加limit,就和MySQL中一样,如果不希望等于min或者max的值被查询出来可以采用 ‘(分数’ 相当于 < 但是不等于的方式,最大值和最小值使用+inf和-inf来标识)
zrangebyscore key min max [withscores] [limit offset count]#10. 根据分数的返回去获取member,从大到小获取(withscores代表同时返回score,添加limit,就和MySQL中一样)
zrevrangebyscore key max min [withscores] [limit offset count]
# zrevrangebyscore zset2004 +inf 10 limit 0 2  #获取>=10的元素,并从中获取一页数据(0 2)
注意

执行添加操作时要注意,当sqlserver数据库添加成功而redis添加失败的情况。

在hash、set、zset中,zset既要排序又要查重,对内存的消耗是最大的,所以一般不使用。

相关文章:

Windows打开redis以及Springboot整合redis

目录 前言Windows系统打开redisSpringboot整合redis依赖实体类yml配置文件config配置各个数据存储类型分别说明记录string数据写入redis&#xff0c;并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所…...

MySQL使用LIKE索引是否失效的验证

1、简单的示例展示 在MySQL中&#xff0c;LIKE查询可以通过一些方法来使得LIKE查询能够使用索引。以下是一些可以使用的方法&#xff1a; 使用前导通配符&#xff08;%&#xff09;&#xff0c;但确保它紧跟着一个固定的字符。 避免使用后置通配符&#xff08;%&#xff09;&…...

封装日历uniapp,只显示年月不显示日

默认展示最新日期 子组件 <template><view class"date-picker"><picker mode"date" fields"month" change"onDateChange" :value"selectedDate"><view class"picker">{{ selectedDate…...

golang线程池ants-实现架构

1、总体架构 ants协程池&#xff0c;在使用上有多种方式(使用方式参考这篇文章&#xff1a;golang线程池ants-四种使用方法)&#xff0c;但是在实现的核心就一个&#xff0c;如下架构图&#xff1a; 总的来说&#xff0c;就是三个数据结构&#xff1a; Pool、WorkerStack、goW…...

Mysql面试合集

概念 是一个开源的关系型数据库。 数据库事务及其特性 事务&#xff1a;是一系列的数据库操作&#xff0c;是数据库应用的基本逻辑单位。 事务特性&#xff1a; &#xff08;1&#xff09;原子性&#xff1a;即不可分割性&#xff0c;事务要么全部被执行&#xff0c;要么就…...

Android Gradle 开发与应用 (五): 构建变体与自定义任务

目录 1. 概述 2. 构建变体 2.1 构建变体的概念 2.2 构建类型 2.3 产品风味 2.4 构建变体的使用 3. 自定义任务 3.1 自定义任务的概念 3.2 创建自定义任务 3.3 配置任务依赖 3.4 任务类型 3.5 动态任务 3.6 自定义任务执行顺序 4. 案例 4.1 多渠道打包 4.2 自动…...

Django学习第六天

启动项目命令 python manage.py runserver 取消模态框功能 js实现列表数据删除 第二种实现思路 使用jquery修改模态框标题 编辑页面拿到数据库数据显示默认数据功能实现 想要去数据库中获取数据时&#xff1a;对象/字典 三种不同的数据类型 使用Ajax传入数据实现表单编辑&…...

docker部署mycat,连接上面一篇的一主二从mysql

一、docker下载mycat镜像 查看安装结果 这个名称太长&#xff0c;在安装容器时不方便操作&#xff0c;设置标签为mycat docker tag longhronshens/mycat-docker mycat 二、安装容器 先安装一个&#xff0c;主要目的是获得配置文件 docker run -it -d --name mycat -p 8066:…...

VUE2拖拽组件:vue-draggable-resizable-gorkys

vue-draggable-resizable-gorkys组件基于vue-draggable-resizable进行二次开发, 用于可调整大小和可拖动元素的组件并支持冲突检测、元素吸附、元素对齐、辅助线 安装: npm install --save vue-draggable-resizable-gorkys 全局引用: import Vue from vue import vdr fro…...

容器:stack

以下是关于stack容器的一些总结&#xff1a; stack容器比较简单&#xff0c;主要包括&#xff1a; 1、构造函数&#xff1a;stack [staName] 2、添加、删除元素: push() 、pop() 3、获取栈顶元素&#xff1a;top() 4、获取栈的大小&#xff1a;size() 5、判断栈是否为空&#x…...

跨平台Ribbon UI组件QtitanRibbon全新发布v6.7.0——支持Qt 6.6.3

没有Microsoft在其办公解决方案中提供的界面&#xff0c;就无法想象现代应用程序&#xff0c;这个概念称为Ribbon UI&#xff0c;目前它是使应用程序与时俱进的主要属性。QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件&#xff0c;QtitanRibb…...

(6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析

目录 前言1. DataFrame 简介2. DataFrame的特点3. DataFrame的创建3.1 使用字典创建DataFrame3.2 使用列表的列表&#xff08;或元组&#xff09;创建DataFrame3.3 使用NumPy数组创建DataFrame3.4 使用Series构成的字典创建DataFrame3.5 使用字典构成的字典创建DataFrame 4. 从…...

在 Azure 云中开始使用适用于 Ubuntu 的 Grafana

介绍 Grafana 是一款开源工具&#xff0c;可用于可视化和分析数据。它特别适合跟踪计算机系统的运行情况。在构建微服务或其他类型的应用程序时&#xff0c;您可能需要分析日志数据、轻松可视化数据或设置特殊警报以接收有关系统中发生的某些事件的通知。 这就是为什么你可能…...

1.Python学习笔记

一、环境配置 1.Python解释器 把程序员用编程语言编写的程序&#xff0c;翻译成计算机可以执行的机器语言 安装&#xff1a; 双击Python3.7.0-选择自定义安装【Customize installation】-勾选配置环境变量 如果没有勾选配置环境变量&#xff0c;输入python就会提示找不到命令…...

中英双语介绍百老汇著名歌剧:《猫》(Cats)和《剧院魅影》(The Phantom of the Opera)

中文版 百老汇著名歌剧 百老汇&#xff08;Broadway&#xff09;是世界著名的剧院区&#xff0c;位于美国纽约市曼哈顿。这里汇集了许多著名的音乐剧和歌剧&#xff0c;吸引了全球各地的观众。以下是两部百老汇的经典音乐剧&#xff1a;《猫》和《剧院魅影》的详细介绍。 1.…...

RpcChannel的调用过程

目录 1. RPC调用方&#xff08;caller&#xff09;的调用(消费)过程 2.在caller下创建文件&#xff1a;calluserservice.cc 3.在src的include下创建文件&#xff1a;mprpcchannel.h 4.在src下创建mprpcchannel.cc 1. RPC调用方&#xff08;caller&#xff09;的调用(消费)过…...

东芝TB6560AHQ/AFG步进电机驱动IC:解锁卓越的电机控制性能

作为一名工程师&#xff0c;一直在寻找可靠且高效的组件来应用于你的项目中。东芝的TB6560AHQ/AFG步进电机驱动IC能够提供精准且多功能的电机控制&#xff0c;完全符合现代应用的高要求&#xff0c;保证高性能和易用性。在这篇文章中&#xff0c;我们将探讨TB6560AHQ/AFG的主要…...

免杀笔记 ----> DLL注入

这段时间我们暂时没什么事情干的话我们就继续更新我们的免杀笔记力&#xff01;&#xff01;&#xff01; &#xff1a;今天我们讲DLL注入 目录 1.DLL注入 2.直接加载DLL&#xff1f; 3.远程线程注入 获取Handle 远程申请内存空间 将我们的CS的DLL加载入内存 创建远程线…...

奇迹MU 骷髅战士在哪

BOSS分布图介绍 我为大家带来各地区怪物分布图。在游戏前期&#xff0c;很多玩家可能会不知道该去哪里寻找怪物&#xff0c;也不知道哪些怪物值得打。如果选择了太强的怪物&#xff0c;弱小的玩家可能会无法抵御攻击。如果选择了低等级的boss&#xff0c;收益可能并不理想。所…...

leetcode力扣_贪心思想

455.分发饼干&#xff08;easy-自己想得出来并写好&#xff09; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...