当前位置: 首页 > 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;这是能让孩子们满足胃口的饼干的最小尺…...

Blender渲染通道完全指南:如何像电影后期一样,分离出深度、阴影与反射图

Blender渲染通道完全指南&#xff1a;影视级后期制作的深度解析在数字内容创作领域&#xff0c;Blender已经从一个简单的3D建模工具成长为能够处理复杂视觉特效的全流程解决方案。对于追求影视级质量的中高级用户而言&#xff0c;掌握渲染通道技术是提升作品专业度的关键一步。…...

【CP-05】RTE运行时环境 - SWC的操作系统接口

CP-05_RTE运行时环境【CP-05】RTE运行时环境 - SWC的“操作系统接口”前言在AUTOSAR架构中&#xff0c;RTE&#xff08;Runtime Environment&#xff0c;运行时环境&#xff09;是一个常被提及却难以理解的概念。它像是应用层软件组件&#xff08;SW-C&#xff09;与底层基础软…...

Unity Visual Scripting不是拖拽玩具:中阶开发者的编程范式重构指南

1. 为什么Unity官方Visual Scripting不是“拖拽完就能跑”的玩具&#xff0c;而是一套需要重新理解的编程范式很多人第一次点开Unity的Visual Scripting&#xff08;VS&#xff09;面板时&#xff0c;看到那些五颜六色的节点和丝滑的连线&#xff0c;下意识觉得&#xff1a;“这…...

基于ESP8266与MQTT的家庭水压自动控制系统设计与实现

1. 项目概述与核心需求解析家里水压不稳、供水时断时续&#xff0c;这大概是很多朋友都遇到过的烦心事。我所在的城市供水情况就很不理想&#xff0c;为了解决这个问题&#xff0c;我不得不自己动手&#xff0c;搭建了一套基于ESP8266微控制器的家庭水压增压与储水自动控制系统…...

Ubuntu经常安装软件

1、垃圾清理工具stacer sudo apt updatesudo apt install stacer apt cleanapt autocleanapt autoremove 2、类似与everything的工具Fsearcch 1sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-stable 2sudo apt update 3sudo apt install fsearch (注&#xf…...

风控系统如何全维度识别爬虫:IP、账号与行为的协同决策机制

1. 这不是“反爬失败”&#xff0c;而是风控系统在对你做全维度画像你写完一段 requests BeautifulSoup 的代码&#xff0c;本地跑通了&#xff0c;开开心心部署到服务器&#xff0c;结果第二天早上发现&#xff1a;所有请求返回 403&#xff0c;日志里全是空响应&#xff1b;…...

基于STM32与LoRa的低功耗物联网气象站DIY全攻略

1. 项目概述&#xff1a;打造一个低功耗的家庭气象站前阵子想给家里的智能家居系统加点“环境感知”能力&#xff0c;琢磨着搞个能实时监测室外温湿度、风速风向的小玩意儿。市面上成品气象站要么数据出不来&#xff0c;要么功耗感人&#xff0c;不适合长期户外部署。于是&…...

微信聊天图片丢了别慌!保姆级教程:找回并解密DAT文件(支持新旧版微信路径)

微信DAT图片恢复实战&#xff1a;从文件定位到批量解密的完整指南 微信聊天记录中的图片突然消失&#xff1f;别急着放弃&#xff01;那些看似无法打开的DAT文件里&#xff0c;可能藏着您的重要回忆或工作资料。本文将带您深入微信存储机制&#xff0c;手把手完成从文件定位到…...

CANN runtime:昇腾NPU 运行时的职责边界

个人主页&#xff1a;ujainu 文章目录前言为什么需要运行时这一层runtime管什么&#xff0c;不管什么Stream&#xff1a;并行的基本调度单位Event&#xff1a;跨Stream的同步锚点内存池化&#xff1a;少一次malloc就少一次卡顿任务队列&#xff1a;从计算图到硬件指令的最后一跳…...

DeTikZify:基于AI的TikZ图形程序自动生成技术深度解析

DeTikZify&#xff1a;基于AI的TikZ图形程序自动生成技术深度解析 【免费下载链接】DeTikZify Synthesizing Graphics Programs for Scientific Figures and Sketches with TikZ. 项目地址: https://gitcode.com/gh_mirrors/de/DeTikZify DeTikZify是一款革命性的多模态…...