Redis基础知识
Redis基础知识
一、Redis简介
1.1 什么是Redis?
Redis是一个开源的、基于内存的数据结构存储系统,可以用作:
- 数据库
- 缓存
- 消息中间件
- 分布式锁
1.2 Redis特点
- 高性能:基于内存操作
- 支持多种数据结构
- 支持数据持久化
- 支持主从复制
- 支持事务
- 支持Lua脚本
1.3 应用场景
- 缓存
- 计数器
- 排行榜
- 消息队列
- 分布式锁
- 会话管理
二、Redis安装与配置
2.1 安装Redis
# Windows安装
# 1. 下载Redis for Windows
# 2. 运行安装程序
# 3. 配置环境变量# Linux安装
sudo apt-get update
sudo apt-get install redis-server# Mac安装
brew install redis
2.2 启动Redis
# Windows启动
redis-server# Linux启动
sudo systemctl start redis-server# Mac启动
brew services start redis
2.3 连接Redis
# 命令行连接
redis-cli# 指定主机和端口连接
redis-cli -h localhost -p 6379# 使用密码连接
redis-cli -a password
三、Redis数据类型
3.1 字符串(String)
# 设置值
SET key value# 获取值
GET key# 设置过期时间
SETEX key seconds value# 批量设置
MSET key1 value1 key2 value2# 批量获取
MGET key1 key2# 递增
INCR key# 递减
DECR key
3.2 哈希(Hash)
# 设置字段值
HSET key field value# 获取字段值
HGET key field# 获取所有字段
HGETALL key# 删除字段
HDEL key field# 判断字段是否存在
HEXISTS key field
3.3 列表(List)
# 左侧插入
LPUSH key value# 右侧插入
RPUSH key value# 左侧弹出
LPOP key# 右侧弹出
RPOP key# 获取列表范围
LRANGE key start stop# 获取列表长度
LLEN key
3.4 集合(Set)
# 添加元素
SADD key member# 删除元素
SREM key member# 获取所有元素
SMEMBERS key# 判断元素是否存在
SISMEMBER key member# 获取集合大小
SCARD key
3.5 有序集合(Sorted Set)
# 添加元素
ZADD key score member# 删除元素
ZREM key member# 获取分数范围内的元素
ZRANGEBYSCORE key min max# 获取排名
ZRANK key member# 获取分数
ZSCORE key member
四、Redis高级特性
4.1 事务
# 开始事务
MULTI# 执行命令
SET key1 value1
SET key2 value2# 提交事务
EXEC# 取消事务
DISCARD
4.2 发布订阅
# 订阅频道
SUBSCRIBE channel# 发布消息
PUBLISH channel message# 取消订阅
UNSUBSCRIBE channel
4.3 持久化
# RDB持久化配置
save 900 1
save 300 10
save 60 10000# AOF持久化配置
appendonly yes
appendfsync everysec
五、Redis集群
5.1 主从复制
# 配置从节点
SLAVEOF master_ip master_port# 查看复制状态
INFO replication
5.2 哨兵模式
# 启动哨兵
redis-sentinel sentinel.conf# 哨兵配置
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
5.3 集群模式
# 创建集群
redis-cli --cluster create node1:6379 node2:6379 node3:6379# 添加节点
redis-cli --cluster add-node new_node:6379 existing_node:6379
六、Redis性能优化
6.1 内存优化
- 使用适当的数据类型
- 设置过期时间
- 使用压缩
- 定期清理
6.2 配置优化
# redis.conf
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync everysec
6.3 监控
# 查看内存使用
INFO memory# 查看客户端连接
INFO clients# 查看命令统计
INFO commandstats
七、Redis安全
7.1 访问控制
# 设置密码
CONFIG SET requirepass password# 修改密码
AUTH old_password new_password
7.2 网络安全
# redis.conf
bind 127.0.0.1
protected-mode yes
八、Redis最佳实践
8.1 开发规范
-
键名设计
- 使用有意义的名称
- 使用冒号分隔
- 控制键名长度
-
数据设计
- 合理使用数据类型
- 避免大key
- 设置过期时间
-
性能优化
- 使用pipeline
- 使用连接池
- 避免频繁操作
8.2 运维规范
-
监控
- 监控内存使用
- 监控连接数
- 监控命令执行
-
备份
- 定期备份数据
- 测试恢复流程
- 保存备份记录
-
安全
- 启用密码认证
- 限制网络访问
- 定期更新密码
九、Redis与Java集成
9.1 Jedis客户端
// 添加Jedis依赖
// Maven
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version>
</dependency>// Gradle
implementation 'redis.clients:jedis:4.3.1'
9.2 基本操作示例
// 创建Jedis客户端
Jedis jedis = new Jedis("localhost", 6379);// 设置密码(如果有)
jedis.auth("password");// 字符串操作
jedis.set("key", "value");
String value = jedis.get("key");// 哈希操作
jedis.hset("user:1", "name", "张三");
jedis.hset("user:1", "age", "25");
Map<String, String> user = jedis.hgetAll("user:1");// 列表操作
jedis.lpush("messages", "消息1");
jedis.lpush("messages", "消息2");
List<String> messages = jedis.lrange("messages", 0, -1);// 集合操作
jedis.sadd("tags", "Java", "Redis", "Spring");
Set<String> tags = jedis.smembers("tags");// 有序集合操作
jedis.zadd("scores", 89.5, "张三");
jedis.zadd("scores", 92.0, "李四");
Set<String> topScores = jedis.zrevrange("scores", 0, 1);// 关闭连接
jedis.close();
9.3 使用连接池
// 创建连接池配置
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(8);
poolConfig.setMaxIdle(8);
poolConfig.setMinIdle(0);
poolConfig.setTestOnBorrow(true);
poolConfig.setTestOnReturn(true);
poolConfig.setTestWhileIdle(true);
poolConfig.setMinEvictableIdleTimeMillis(60000);
poolConfig.setTimeBetweenEvictionRunsMillis(30000);
poolConfig.setNumTestsPerEvictionRun(3);
poolConfig.setBlockWhenExhausted(true);// 创建连接池
JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379, 2000, "password");// 从连接池获取连接
try (Jedis jedis = jedisPool.getResource()) {// 使用Jedis进行操作jedis.set("key", "value");String value = jedis.get("key");
}// 关闭连接池
jedisPool.close();
9.4 使用Pipeline批量操作
Jedis jedis = new Jedis("localhost", 6379);
Pipeline pipeline = jedis.pipelined();// 批量设置
for (int i = 0; i < 1000; i++) {pipeline.set("key:" + i, "value:" + i);
}// 执行Pipeline
pipeline.sync();// 关闭连接
jedis.close();
十、Redis与Spring Boot集成
10.1 添加Spring Data Redis依赖
<!-- Maven -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><!-- Gradle -->
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
10.2 配置Redis连接
# application.yml
spring:redis:host: localhostport: 6379password: passworddatabase: 0timeout: 10000lettuce:pool:max-active: 8max-wait: -1max-idle: 8min-idle: 0
10.3 创建Redis配置类
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);// 使用Jackson2JsonRedisSerializer序列化值Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper mapper = new ObjectMapper();mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);serializer.setObjectMapper(mapper);// 设置key和value的序列化规则template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}
}
10.4 使用RedisTemplate
@Service
public class UserService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 存储用户信息public void saveUser(String id, User user) {redisTemplate.opsForValue().set("user:" + id, user);}// 获取用户信息public User getUser(String id) {return (User) redisTemplate.opsForValue().get("user:" + id);}// 删除用户信息public void deleteUser(String id) {redisTemplate.delete("user:" + id);}// 设置过期时间public void setExpire(String key, long timeout, TimeUnit unit) {redisTemplate.expire(key, timeout, unit);}
}
10.5 使用RedisRepository
@RedisHash("users")
public class User {@Idprivate String id;private String name;private int age;// 构造函数、getter和setter方法
}@Repository
public interface UserRepository extends CrudRepository<User, String> {List<User> findByAge(int age);List<User> findByNameStartingWith(String prefix);
}
十一、Redis与Docker部署
11.1 使用Docker运行Redis
# 拉取Redis镜像
docker pull redis:latest# 运行Redis容器
docker run -d --name redis -p 6379:6379 redis:latest# 运行Redis容器(带数据持久化)
docker run -d --name redis -p 6379:6379 -v /data/redis:/data redis:latest# 运行Redis容器(带密码)
docker run -d --name redis -p 6379:6379 redis:latest redis-server --requirepass password
11.2 使用Docker Compose部署Redis
# docker-compose.yml
version: '3'
services:redis:image: redis:latestcontainer_name: redisports:- "6379:6379"volumes:- ./data:/datacommand: redis-server --requirepass passwordnetworks:- redis-networkredis-commander:image: rediscommander/redis-commander:latestcontainer_name: redis-commanderports:- "8081:8081"environment:- REDIS_HOSTS=local:redis:6379:0:passworddepends_on:- redisnetworks:- redis-networknetworks:redis-network:driver: bridge
11.3 使用Docker部署Redis集群
# docker-compose-cluster.yml
version: '3'
services:redis1:image: redis:latestcontainer_name: redis1command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yesports:- "6371:6379"volumes:- ./data1:/datanetworks:- redis-cluster-networkredis2:image: redis:latestcontainer_name: redis2command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yesports:- "6372:6379"volumes:- ./data2:/datanetworks:- redis-cluster-networkredis3:image: redis:latestcontainer_name: redis3command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yesports:- "6373:6379"volumes:- ./data3:/datanetworks:- redis-cluster-networkredis4:image: redis:latestcontainer_name: redis4command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yesports:- "6374:6379"volumes:- ./data4:/datanetworks:- redis-cluster-networkredis5:image: redis:latestcontainer_name: redis5command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yesports:- "6375:6379"volumes:- ./data5:/datanetworks:- redis-cluster-networkredis6:image: redis:latestcontainer_name: redis6command: redis-server --port 6379 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yesports:- "6376:6379"volumes:- ./data6:/datanetworks:- redis-cluster-networknetworks:redis-cluster-network:driver: bridge
# 创建Redis集群
docker exec -it redis1 redis-cli --cluster create \redis1:6379 redis2:6379 redis3:6379 redis4:6379 redis5:6379 redis6:6379 \--cluster-replicas 1
十二、Redis常见问题解答
12.1 内存问题
问题: Redis内存占用过高
解决方案:
- 设置最大内存限制:
CONFIG SET maxmemory 2gb
- 配置内存淘汰策略:
CONFIG SET maxmemory-policy allkeys-lru
- 使用适当的数据类型,避免大key
- 设置过期时间,让不常用的数据自动过期
- 使用压缩算法减少内存占用
12.2 性能问题
问题: Redis响应慢
解决方案:
- 检查是否有慢查询:
SLOWLOG GET 10
- 优化数据结构,避免使用大key
- 使用Pipeline批量操作
- 增加Redis实例,使用集群分散负载
- 检查网络延迟和带宽
12.3 连接问题
问题: 客户端连接Redis失败
解决方案:
- 检查Redis服务是否正在运行
- 检查防火墙设置,确保端口6379开放
- 检查Redis配置文件中的bind设置
- 如果使用密码,确保密码正确
- 检查客户端连接池配置
12.4 数据一致性问题
问题: 主从复制数据不一致
解决方案:
- 检查主从复制状态:
INFO replication
- 检查网络连接是否稳定
- 如果从节点落后太多,考虑重新同步
- 使用哨兵模式自动处理故障转移
- 考虑使用Redis集群提高可用性
12.5 持久化问题
问题: Redis重启后数据丢失
解决方案:
- 启用RDB持久化:
CONFIG SET save "900 1 300 10 60 10000"
- 启用AOF持久化:
CONFIG SET appendonly yes
- 配置AOF同步策略:
CONFIG SET appendfsync everysec
- 定期备份数据文件
- 测试恢复流程确保数据可以正确恢复
十三、Redis高级应用场景
13.1 分布式锁
// 使用Redis实现分布式锁
public class RedisLock {private RedisTemplate<String, String> redisTemplate;private String lockKey;public RedisLock(RedisTemplate<String, String> redisTemplate, String lockKey) {this.redisTemplate = redisTemplate;this.lockKey = lockKey;}public boolean tryLock(String requestId, long expireTime) {return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, requestId, expireTime, TimeUnit.MILLISECONDS));}public boolean releaseLock(String requestId) {String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +"return redis.call('del', KEYS[1]) else return 0 end";return Boolean.TRUE.equals(redisTemplate.execute(new DefaultRedisScript<>(script, Boolean.class), Collections.singletonList(lockKey), requestId));}
}// 使用示例
String requestId = UUID.randomUUID().toString();
RedisLock lock = new RedisLock(redisTemplate, "lock:resource");
try {if (lock.tryLock(requestId, 30000)) {// 获取锁成功,执行业务逻辑// ...} else {// 获取锁失败}
} finally {// 释放锁lock.releaseLock(requestId);
}
13.2 限流器
// 使用Redis实现限流器
public class RedisRateLimiter {private RedisTemplate<String, String> redisTemplate;private String key;private int limit;private int period;public RedisRateLimiter(RedisTemplate<String, String> redisTemplate, String key, int limit, int period) {this.redisTemplate = redisTemplate;this.key = key;this.limit = limit;this.period = period;}public boolean tryAcquire() {String script = "local current = redis.call('incr', KEYS[1]) " +"if current == 1 then " +"redis.call('expire', KEYS[1], ARGV[1]) " +"end " +"return current <= tonumber(ARGV[2])";return Boolean.TRUE.equals(redisTemplate.execute(new DefaultRedisScript<>(script, Boolean.class), Collections.singletonList(key), String.valueOf(period), String.valueOf(limit)));}
}// 使用示例
RedisRateLimiter limiter = new RedisRateLimiter(redisTemplate, "rate:api", 100, 60);
if (limiter.tryAcquire()) {// 允许请求通过// ...
} else {// 请求被限流
}
13.3 排行榜
// 使用Redis实现排行榜
public class RedisLeaderboard {private RedisTemplate<String, String> redisTemplate;private String key;public RedisLeaderboard(RedisTemplate<String, String> redisTemplate, String key) {this.redisTemplate = redisTemplate;this.key = key;}public void addScore(String member, double score) {redisTemplate.opsForZSet().add(key, member, score);}public List<String> getTopMembers(int count) {return new ArrayList<>(redisTemplate.opsForZSet().reverseRange(key, 0, count - 1));}public List<String> getTopMembersWithScores(int count) {Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().reverseRangeWithScores(key, 0, count - 1);List<String> result = new ArrayList<>();for (ZSetOperations.TypedTuple<String> tuple : tuples) {result.add(tuple.getValue() + ":" + tuple.getScore());}return result;}public Long getRank(String member) {return redisTemplate.opsForZSet().reverseRank(key, member);}
}// 使用示例
RedisLeaderboard leaderboard = new RedisLeaderboard(redisTemplate, "leaderboard:game");
leaderboard.addScore("player1", 100);
leaderboard.addScore("player2", 200);
leaderboard.addScore("player3", 150);
List<String> topPlayers = leaderboard.getTopMembers(3);
// 结果: [player2, player3, player1]
13.4 消息队列
// 使用Redis实现消息队列
public class RedisMessageQueue {private RedisTemplate<String, String> redisTemplate;private String queueKey;public RedisMessageQueue(RedisTemplate<String, String> redisTemplate, String queueKey) {this.redisTemplate = redisTemplate;this.queueKey = queueKey;}public void push(String message) {redisTemplate.opsForList().rightPush(queueKey, message);}public String pop() {return redisTemplate.opsForList().leftPop(queueKey);}public String popWithTimeout(long timeout, TimeUnit unit) {return redisTemplate.opsForList().leftPop(queueKey, timeout, unit);}public long size() {return redisTemplate.opsForList().size(queueKey);}
}// 生产者
RedisMessageQueue queue = new RedisMessageQueue(redisTemplate, "queue:messages");
queue.push("消息1");
queue.push("消息2");// 消费者
while (true) {String message = queue.popWithTimeout(1, TimeUnit.SECONDS);if (message != null) {// 处理消息// ...}
}
13.5 缓存策略
// 使用Redis实现缓存策略
public class RedisCache {private RedisTemplate<String, Object> redisTemplate;private long defaultExpire;public RedisCache(RedisTemplate<String, Object> redisTemplate, long defaultExpire) {this.redisTemplate = redisTemplate;this.defaultExpire = defaultExpire;}public <T> T get(String key, Class<T> clazz) {return (T) redisTemplate.opsForValue().get(key);}public void set(String key, Object value) {set(key, value, defaultExpire);}public void set(String key, Object value, long expire) {redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);}public void delete(String key) {redisTemplate.delete(key);}public <T> T getOrSet(String key, Supplier<T> supplier, Class<T> clazz) {return getOrSet(key, supplier, defaultExpire, clazz);}public <T> T getOrSet(String key, Supplier<T> supplier, long expire, Class<T> clazz) {T value = get(key, clazz);if (value == null) {value = supplier.get();set(key, value, expire);}return value;}
}// 使用示例
RedisCache cache = new RedisCache(redisTemplate, 3600);
User user = cache.getOrSet("user:1", () -> userService.findById(1), User.class);
十四、Redis最佳实践总结
14.1 键名设计最佳实践
-
命名规范
- 使用冒号分隔不同部分:
业务:类型:ID
- 使用小写字母
- 避免使用特殊字符
- 控制键名长度
- 使用冒号分隔不同部分:
-
常见模式
- 用户信息:
user:1
- 用户会话:
session:abc123
- 计数器:
counter:pageviews
- 排行榜:
leaderboard:game
- 缓存:
cache:product:1
- 用户信息:
14.2 数据类型选择最佳实践
-
字符串(String)
- 适用于简单数据:计数器、缓存、会话ID
- 可以存储序列化的对象(JSON、二进制)
-
哈希(Hash)
- 适用于对象属性:用户信息、产品详情
- 可以部分更新,节省内存
-
列表(List)
- 适用于有序集合:消息队列、最新动态
- 可以实现分页
-
集合(Set)
- 适用于无序唯一集合:标签、关注者
- 支持集合运算:交集、并集、差集
-
有序集合(Sorted Set)
- 适用于排序集合:排行榜、权重队列
- 支持范围查询和排序
14.3 性能优化最佳实践
-
内存优化
- 使用适当的数据类型
- 避免大key(超过10KB)
- 设置过期时间
- 使用压缩算法
-
查询优化
- 使用Pipeline批量操作
- 使用连接池
- 避免频繁操作
- 使用适当的命令(如HGETALL替代多次HGET)
-
配置优化
- 调整内存限制和淘汰策略
- 配置持久化策略
- 调整连接池大小
- 启用慢查询日志
14.4 高可用最佳实践
-
主从复制
- 至少配置一个从节点
- 监控复制状态
- 定期备份数据
-
哨兵模式
- 至少配置三个哨兵节点
- 配置合理的故障检测参数
- 测试故障转移流程
-
集群模式
- 至少配置三个主节点和三个从节点
- 合理分配槽位
- 监控集群状态
14.5 安全最佳实践
-
访问控制
- 设置强密码
- 限制命令执行权限
- 定期更新密码
-
网络安全
- 限制IP访问
- 使用SSL/TLS加密
- 禁用危险命令
-
数据安全
- 定期备份数据
- 加密敏感数据
- 实施数据访问控制
相关文章:
Redis基础知识
Redis基础知识 一、Redis简介 1.1 什么是Redis? Redis是一个开源的、基于内存的数据结构存储系统,可以用作: 数据库缓存消息中间件分布式锁 1.2 Redis特点 高性能:基于内存操作支持多种数据结构支持数据持久化支持主从复制支…...
每日c/c++题 备战蓝桥杯(求解三个数的最大公约数与最小公倍数)
求解三个数的最大公约数与最小公倍数(C/C实现) 引言 在数学计算和编程问题中,求多个数的**最大公约数(GCD)和最小公倍数(LCM)**是常见需求。本文将探讨如何高效求解三个数的GCD和LCMÿ…...
解决Win11耳机没有声音的问题
方法一:更新驱动程序(有效) 进入 “设置”(快捷键:WinX),点击 “Windows 更新” → “高级选项” 点击 “可选更新” ,然后点击 “驱动程序更新” 【注】:更新后可能会出…...
滤波电容的正负极线宽需要一致吗?
今天看到一个项目的滤波电容的正端采用铺铜处理增大过流能力,但是负极却仅仅打了两个地过孔,不仅产生疑问,这样做是否合理,滤波电容的正负极线宽需要一致吗? 搜寻资料的时候看到这样一个类似的问题: 这些人…...
使用 `pandas` 库来读取 Excel 文件,并实现六种算法的遍历计算
以下是一个满足你需求的 Python 程序示例。在这个示例中,我们假设已经有了处理数据的函数,并且生成的 Excel 文件中包含了观测数据和推算数据。我们将使用 pandas 库来读取 Excel 文件,并实现六种算法的遍历计算。 import pandas as pd# 模拟…...
【Linux】文件描述符访问Open、Read、Write
每个运行的程序被称为进程(process),它有一些与之关联的文件描述符。我们可以通过这些文件描述符来访问打开的文件或者设备。 一、文件描述符 什么是文件描述符? 概念:文件描述符(File Descriptor&#x…...
在 VS2022 中修复 Linux CMake 项目构建失败:从 Ninja 迁移到 Makefile
问题背景 在使用 Visual Studio 2022 开发跨平台 C 项目时,许多开发者会选择通过 WSL (Windows Subsystem for Linux) 直接在本地调试 Linux 环境下的程序。然而,近期在配置一个 CMake 项目时,遇到了以下报错࿱…...
ctf-show-mics2
下载文件用zip解压,将文件修改为flp文件 新建虚拟机,把文件添加到软盘 再次打开虚拟机会显示flag flag:flag{ctfshow}...
STM32_USB
概述 本文是使用HAL库的USB驱动 因为官方cubeMX生成的hal库做组合设备时过于繁琐 所以这里使用某大神的插件,可以集成在cubeMX里自动生成组合设备 有小bug会覆盖生成文件里自己写的内容,所以生成一次后注意保存 插件安装 下载地址 https://github.com/alambe94/I-CUBE-USBD-Com…...
Java 基础-32-枚举-枚举的应用场景
在Java编程中,枚举(Enum)提供了一种强大的方式来定义一组固定的常量。它们不仅限于简单的用途,还可以包含构造函数、方法和字段等高级功能,使其适用于多种不同的应用场景。本文将探讨几种常见的使用枚举的场景…...
新潮透明液体水珠水滴失真故障扭曲折射特效海报字体标题设计ps样机动作素材 Bubble Photoshop Templates
只需单击几下即可创建引人注目的视觉效果!您需要做的就是将您的文本或图像放入智能对象中并应用作。 包中包含: 15 个静态 Photoshop 模板(PS 2019 及更高版本) 01-05 垂直布局 (22504000)06-10 水平布局…...
学透Spring Boot — 017. 魔术师—Http消息转换器
本文是我的专栏《学透Spring Boot》的第17篇文章,了解更多请移步我的专栏: 学透 Spring Boot_postnull咖啡的博客-CSDN博客 目录 HTTP请求和响应 需求—新的Media Type 实现—新的Media Type 定义转换器 注册转换器 编写Controller 测试新的medi…...
stable diffusion 量化加速点
文章目录 一、导出为dynamic shape1)函数讲解(函数导出、输出检查)2)代码展示二、导出为static shape1)函数讲解(略)2)代码展示三、序列化为FP32测速1)测速2)代码四、序列化为FP16测速1)测速2)代码同上五、发现并解决解决CLIP FP16溢出,并测速1)如何找到溢出的算子…...
Xorg内存管理机制深度解析
Xorg内存管理机制深度解析 一、客户端资源生命周期管理 Xorg 采用 客户端绑定型资源管理 机制,所有资源(窗口、像素图、字体等)的生命周期与客户端连接状态强关联。 资源 ID 分配机制: • 每个资源由 32位标识符 表示,格式:0xBBCCDDEE ◦ BB:客户端 ID(ClientIndex)…...
第五期:深入理解 Spring Web MVC [特殊字符]( 前后端交互的综合性练习)
✨ 前言:从理解到实战,彻底掌握 Spring MVC 前后端交互 当我们学习了 Spring MVC 中的各种注解、参数绑定、请求方式、编码处理以及 Cookie/Session 操作之后,下一步就是 —— 动手实践! 理论再多,不如亲自敲一次代码…...
ansible可视化自动化平台-semaphore
1、简介 Semaphore UI 是一个开源的CI/CD工具,专注于简化和自动化软件交付流程,可轻松管理和运行 Ansible playbook,提供了一个直观的 Web 用户界面(UI),帮助DevOps团队轻松管理任务、部署和流水线。 官网…...
手撕LLM(二):从源码出发,探索LoRA加载、推理全流程
接上回接着说,前面我们通过分析源码,了解了大模型推理的详细流程,包括提示词从输入,到对话模版包装,到tokenID转换,到Embedding词向量转换;通过大模型推理,再将大模型输出进行最后一…...
数据库连接JDBC
概述 ✅概念 JDBC(JavaDataBaseConnectivityjava数据库连接)是⼀种⽤于执⾏SQL语句的JavaAPI,可以为多种关系型数据库提供 统⼀访问,它是由⼀组⽤Java语⾔编写的类和接⼝组成的。 本质 其实就是java官⽅提供的⼀套规范(接⼝)。⽤于帮助开发⼈员快速实现…...
VectorBT:使用PyTorch+Transformer训练和回测股票模型 进阶五
VectorBT:使用PyTorchTransformer训练和回测股票模型 进阶五 本方案基于PyTorch框架与Transformer模型,结合VectorBT回测引擎构建多股票量化交易系统,采用滑动窗口技术构建时序特征,通过自注意力机制捕捉市场规律预测收益率&#…...
DP Alt Mode 与 USB 的关系
DP Alt Mode 与 USB 的关系 1. 物理接口的统一:USB-C 是“万能插座” [USB-C接口物理结构] |-----------------------------------------------| | USB 3.0数据引脚 | DP Alt Mode视频引脚 | 电源引脚 | |-------------------------------------…...
C#“与AI的奇妙结合”
原文:C# 使用通义灵码 - AI 助力 Visual Studio 开发_w3cschool (注意:本文章中并不存在任何广告,也不存在任何盈利内容) C# 使用通义灵码 C# 作为一种功能强大且灵活多变的编程语言,被广泛应用于各个领…...
企业ITR流程设计与执行详细介绍【附全文阅读】
该方案聚焦企业 ITR 流程,适用于企业的服务管理人员、流程优化负责人、技术支持团队以及中高层管理者等。 ITR 流程的重要性:企业服务面临客户不满、管理者焦虑、服务人员无奈等挑战,缺乏完善的 ITR 流程会影响品牌形象、客户满意度和产品竞争力。ITR 流程能够保障客户满意,…...
Ubuntu 无密码热点(Soft AP)完整配置方案
适用于 Jetson、嵌入式 Linux、RDK 平台。目标:配置一个无密码热点(Soft AP),供手机等设备直接连接。实现开机自动启动热点,也支持后续一键切换回 WiFi 客户端模式。 平台:Yahboom RDK X3(Jetso…...
【力扣hot100题】(063)搜索二维矩阵
看到这题我就想到之前被我当作这题做的【力扣hot100题】(020)搜索二维矩阵Ⅱ 其实是完全不一样的两题,个人觉得这道题更简单也更考验基础,那道题思路更难想到但代码更好写。 两个二分查找结束,要注意的是第一个二分查…...
瑞萨RA4M2使用心得-KEIL5的第一次编译
目录 前言 环境: 开发板:RA-Eco-RA4M2-100PIN-V1.0 IDE:keil5.35 一、软件的下载 编辑瑞萨的芯片,除了keil5 外还需要一个软件:RASC 路径:Releases renesas/fsp (github.com) 向下找到: …...
玄机-apache日志分析
靶场任务 1、提交当天访问次数最多的IP,即黑客IP: 查看apache日志 apache访问日志的位置是:/var/log/apache2/access.log.1 匹配正则算法 首先先cat看看 发现地址都在第一行,直接匹配计算输出 cat access.log.1 |grep -Eo &…...
[C++]洛谷B2119 删除单词后缀
题目与解析 题干题目描述输入格式输出格式样例样例输入样例输出 答案解析食用提示AC代码AC代码详细解析头文件部分主程序8~12行代码 12行以后的代码 题干 题目描述 给定一个单词,如果该单词以 er、ly 或者 ing 后缀结尾,则删除该后缀(题目保…...
Ubuntu远程连接Mysql数据库(图文详解)
Ubuntu远程连接Mysql数据库 1、版本2、检查有没有Mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.3 查看Mysql运行状态 3、卸载Mysql4、安装4.1 更新4.2 开始安装4.3 安装完后查看状态 5、登录5.1、使用5.2、查看数据库权限5.3 更新权限5.4 再次查看数据库权限5.5 添加新用…...
回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测
回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测 目录 回归预测 | Matlab实现NRBO-Transformer-GRU多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【JCR一区级】Matlab实现NRBO-Transformer-GRU多变量回归预测,牛顿-拉夫逊算法优…...
leetcode122-买卖股票的最佳时机II
leetcode 122 思路 方法一的核心思想是简单的贪心策略。我们每天都看当前价格和下一个价格的差值。如果下一个价格高于当前价格(即diff > 0),那么就认为当天可以买入并在第二天卖出,赚取利润。因此,方法一把所有…...
from PIL import Image 安装失败
正确安装 Pillow (PIL) # 通过 Conda 安装 conda install pillow -c conda-forge# 或通过 Pip 安装 pip install pillow验证安装 在 Python 中测试是否成功: from PIL import Image print(Image.__version__) # 应输出类似 "9.5.0" 的版本号常见问题说…...
DPFunc蛋白质功能预测模型复现报告
模型简介 模型的具体介绍见蛋白质功能预测论文阅读记录2025(DPFunc、ProtCLIP)_protein functions-CSDN博客 复现流程 仓库:CSUBioGroup/DPFunc 时间:2025.4.5 环境配置 python 3.9.21 & CUDA 11.6 Pytorch: 1.12.0 DG…...
在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重构二开的开源项目 Dify-Plus
一、安装环境信息说明 硬件资源(GB 和 GiB 的主要区别在于它们的换算基数不同,GB 使用十进制,GiB 使用二进制,导致相同数值下 GiB 表示的容量略大于 GB;换算关系:1 GiB ≈ 1.07374 GB ;1 GB ≈ …...
双系统ubuntu20.04不能外接显示器的解决办法
一,更换驱动 首先确定是不是英伟达显卡驱动,如果不是的话,设置里找到附加驱动,更改为NVIdia类型的驱动,更改完成之后重启 这里大部分电脑都可以了,如果不行 二、更改启动方式 重启之后进入BIOS设置&…...
高并发内存池:原理、设计与多线程性能优化实践
高并发内存池是一种专门为多线程环境设计的内存管理机制,其核心目标是通过优化内存分配和释放过程,解决传统内存分配器(如malloc/free)在高并发场景下的性能瓶颈,显著提升多线程程序的内存访问效率。 目录 一、核心设计…...
03.31-04.06 论文速递 聚焦具身智能、复杂场景渲染、电影级对话生成等五大前沿领域
🌟 论文速递 | 2025.03.31-04.06 📢 聚焦具身智能、复杂场景渲染、电影级对话生成等前沿领域 1️⃣ 具身智能体:从脑启发到安全协作系统 论文标题: Advances and Challenges in Foundation Agents: From Brain-Inspired Intellige…...
Django和Celery实现的异步任务案例
推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 先决条件步骤1:安装依赖项步骤2:配置Celery2.1 创建`celery.py`2.2 更新 `__init__.py`步骤3:配置Django设置步骤4:定义Celery任务…...
DAY 38 leetcode 15--哈希表.三数之和
题号15 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 未去重版本 整体思路:先排序再双指针遍…...
Java项目之基于ssm的个性化旅游攻略定制系统(源码+文档)
项目简介 个性化旅游攻略定制系统实现了以下功能: 个性化旅游攻略定制系统能够实现对用户上传信息,旅游路线信息,景点项目信息,景点信息,标签分类信息等信息的管理。 💕💕作者:落落…...
链表和数组的效率
访问元素 • 数组:通过索引直接访问元素,时间复杂度为O(1),速度很快。例如arr[5]可以立即访问到数组arr中索引为5的元素。 • 链表:需要从链表头开始逐个遍历节点,直到找到目标元素,平均时间复杂度为O(n)…...
经典回溯问题———组合的输出
题目如下 思路 代码如下...
WPS宏开发手册——附录
目录 系列文章7、附录 系列文章 使用、工程、模块介绍 JSA语法 JSA语法练习题 Excel常用Api Excel实战 常见问题 附录 7、附录 颜色序列:在excel中设置颜色,只能设置颜色序号,不能直接设置rgb颜色 1、黑色 (Black)…...
【leetcode100】买卖股票的最佳时机
1、题目描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如果你…...
uniapp小程序登录失效后操作失灵问题
一开始我在请求返回失效验证时做了登录失效处理然后用uni.switchTab跳转主页的逻辑,结果发现在一天后重新打开小程序或者其他登录挤掉登录验证时有概率导致整个页面失灵无法操作。 经过排查发现,在小程序跳转新页面的时候如果遇到**(过快还是过多&#…...
找树左下角的值(DFS 深度优先搜索)| LeetCode 513
✨ 题目描述 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 提示: 二叉树中至少有一个节点。 📄 示例 示例 1 输入: root [2,1,3] 输出: 1示例 2 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7ǵ…...
【力扣hot100题】(060)分割回文串
每次需要判断回文串,这点比之前几题回溯题目复杂一些。 还有我怎么又多写了循环…… class Solution { public:vector<vector<string>> result;string s;bool palindromic(string s){for(int i0;i<s.size()/2;i) if(s[i]!s[s.size()-1-i]) return …...
中国钧瓷收藏市场现状和风险警示
一、数据权威性与综合维度 本榜单由钧瓷联合体、钧瓷频道及钧瓷数据库三方协同制作,通过10项规则综合评估匠人影响力,涵盖知名度、用户评价、平台指数等多元维度,避免单一指标(如拍卖价格)的片面性。榜单每月更新&…...
forms实现任务文档功能
说明: forms实现任务文档功能 效果图: step1:C:\Users\wangrusheng\RiderProjects\WinFormsApp26\WinFormsApp26\Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; u…...
字符串的replace、replaceAll、split()方法
参考 字符串的replace、replaceAll、split()方法_字符串replace-CSDN博客...
Kotlin语言进阶:协程、Flow、Channel详解(二)
Kotlin语言进阶:协程、Flow、Channel详解(二) 一、Flow基础 1.1 什么是Flow Flow是Kotlin提供的用于处理异步数据流的解决方案,它建立在协程之上,具有以下特点: 冷流特性:只有在收集时才会开始发射数据背压处理:自动处理生产者和消费者速度不匹配的问题组合操作:提…...