redis五种数据结构详解(java实现对应的案例)
一、简述
Redis是一款高性能的键值对存储数据库,它支持五种基本数据类型,分别是字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)。
二、五种基本数据类型
2.1 字符串(String)
String是Redis最基本的类型,一个key对应一个value,它是数据安全的,并且可以包含任何数据,一个Redis的字符串最多可以是512M(字符串长度小于1M的时候,每次扩容都是加倍现有空间,如果超过1M,扩容的时候只会扩容1M空间)
常用的应用场景:缓存用户信息、用户登录状态、配置文件等等
常用命令
set <key><value> 添加键值对
get <key> 查询对应键值
append <key><value>将给定的 追加到原值的末尾
strlen <key> 获得值的长度
setnx <key><value> 只有在 key 不存在时 设置 key 的值
incr <key> 将 key 中储存的数字值增1只能对数字值操作,如果为空,新增值为
decr <key> 将 key 中储存的数字值减1只能对数字值操作,如果为空,新增值为-1
mset <key1><value1><key2><value2> ..... 同时设置一个或多个 key-value对
mget <key1><key2><key3> .....同时获取一个或多个 value
msetnx <key1><value1><key2><value2> ..... 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
getrange <key><起始位置><结束位置> 获得值的范围,类似java中的substring,前包,后包
setrange <key><起始位置><value>用 <value> 覆写<key> 所储存的字符串值,从<起始位置>开始(索引从0开始)。
setex <key><过期时间><value> 设置键值的同时,设置过期时间,单位秒。
2.2 列表(List)
列表相当于是单个键对应多个值,它是一个有序的字符串元素集合,它按照插入的顺序来存储元素,可以在列表的头部或尾部进行插入和删除操作。它的底层实际是一个双向列表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
常用的应用场景:消息队列,任务队列,历史记录等
常用命令
lpush/rpush <key><value1><value2><value3> .... 从左边/右边插入一个或多个值。
lpop/rpop <key> 从左边/右边吐出一个值。值在键在,值光键亡。
rpoplpush <key1><key2>从<key1> 列表右边吐出一个值,插到<key2>列表左边。
lrange <key><start><stop> 按照索引下标获得元素(从左到右)
lrange key 0 -1 0左边第一个,-1右边第一个,(0-1表示获取所有)
lindex <key><index> 按照索引下标获得元素(从左到右)
llen <key> 获得列表长度
linsert <key> before <value><newvalue> 在<value>的后面插入<newvalue>插入值
lrem <key><n><value> 从左边删除n个value(从左到右)
lset<key><index><value> 将列表key下标为index的值替换成value
2.3 集合(Set)
无序的字符串元素集合,跟List有点相似,不一样的是集合中的元素是唯一的,不允许重复的
常用的应用场景:签到系统,好友关系,去重等功能
常用的命令
sadd <key><value1><value2> ..... 将一个或多个 member 元素加入到集合 key 中,已经存在的member 元素将被忽略
smembers <key>取出该集合的所有值。
sismember <key><value>判断集合<key>是否为含有该<value>值,有1,没有0
scard<key>返回该集合的元素个数。
srem <key><value1><value2> .... 删除集合中的某个元素。
spop <key>随机从该集合中吐出一个值。
srandmember <key><n>随机从该集合中取出n个值。不会从集合中删除 。
smove <source><destination>value把集合中一个值从一个集合移动到另一个集合
sinter <key1><key2>返回两个集合的交集元素。
sunion <key1><key2>返回两个集合的并集元素。
sdiff <key1><key2>返回两个集合的差集元素(key1中的,不包含key2中的)
2.4 哈希(Hash)
哈希是一个键值对的集合,其中键和值都是字符串,它可以用来存储对象的属性,类似与关系型数据库中的表记录
常用的应用场景:存储用户信息,商品信息等对象数据
常用的命令
hset <key><field><value>给<key>集合中的 <field>键赋值<value>
hget <key1><field>从<key1>集合<field>取出 value
hmset <key1><field1><value1><field2><value2>... 批量设置hash的值
hexists<key1><field>查看哈希表 key 中,给定域 field 是否存在。
hkeys <key>列出该hash集合的所有field
hvals <key>列出该hash集合的所有value
hincrby <key><field><increment>为哈希表 key 中的域 field 的值加上增量 1 -1
hsetnx <key><field><value>将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
2.5 有序集合(Sorted Set/zset)
sorted Set和zset是一个东西,他们都是同一数据类型,只是称呼不同。有序集合和set是非常的相似,不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合成员是唯一的,但是评分可以重复。因为元素是有序的,所以我们也可以跟快的根据评分(score)或者次序(position)来获取范围元素
常用的应用场景:排行榜,热门话题等功能
常用的命令
zadd <key><score1><value1><score2><value2>…将一个或多个 member 元素及其score 值加入到有序集 key 当中
zrange <key><start><stop> [WITHSCORES] 返回有序集 key 中,下标在<start><stop>之间的元素,带WITHSCORES,可以让分数一起和值返回到结果集。
zrangebyscore key minmax [withscores] [limit offset count]返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrevrangebyscore key maxmin [withscores] [limit offset count] 同上,改为从大到小排列。
zincrby <key><increment><value> 为元素的score加上增量
zrem <key><value>删除该集合下,指定值的元素
zcount <key><min><max>统计该集合,分数区间内的元素个数
zrank <key><value>返回该值在集合中的排名,从0开始。
三、五种数据类型使用案例
3.1 连接redis
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.4.7.RELEASE</version></dependency>
或
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.8.0</version>
</dependency>
注意点:这个是springboot的jar,其实也可以直接导入jedis的ajr
下面连接redis调用的都是这个RedisTestUtil工具类
package com.study.redis;import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;/*** @author Administrator* @version 1.0* @project study* @description* @date 2025/5/20 星期二 17:11:46*/
public class RedisTestUtil {/*** 地址*/private static final String HOST = "127.0.0.1";/*** 端口*/private static final int PORT = 6379;/*** 缓存时间*/private static final int TIMEOUT = 30000;/*** 密码*/private static final String PASSWORD = "hm23";/*** 使用的redis库*/private static final int DATABASE = 0;private static final JedisPool jedisPool;static {JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(100);config.setMaxIdle(10);config.setMinIdle(5);config.setTestOnBorrow(true);jedisPool = new JedisPool(config, HOST, PORT, TIMEOUT, PASSWORD, DATABASE);}public static Jedis getJedis() {return jedisPool.getResource();}public static void close(Jedis jedis) {if (jedis != null) {jedis.close();}}
}
注意点:如果想springboot连接redis可以查看springboot连接redis_springboot链接单机redis bean注入地址信息-CSDN博客
3.2 String使用案例(存储token)
用字符串缓存一个token
public static void main(String[] args) {String stringKey = "auth:token:";String token = "token222222222222222222222222222222";//连接redisJedis jedis = RedisTestUtil.getJedis();// redis缓存tokenjedis.set(stringKey, token);//redis获取对应的值String content = jedis.get(stringKey);System.out.println("获取到的值为>>>>>>>>"+content);}
3.3 List使用案例(用户操作历史记录)
用list缓存历史记录,每个用户对应一个list
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.time.LocalDateTime;
import java.util.Date;/*** @author Administrator* @version 1.0* @project study* @description* @date 2025/5/20 星期二 17:29:29*/
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class HistoryRecord {private Integer id;private String userId; // 用户IDprivate String content; // 记录内容private String time; // 记录时间
}
public class RedisTest {private static final String HISTORY_KEY_PREFIX = "user:history:";private static final int MAX_RECORDS = 20; // 每个用户最大记录数public static void main(String[] args) {// 缓存userId为1的历史记录RedisTest test = new RedisTest();for (int i = 0; i < 10; i++) {test.addRecord(i,"1","点击了"+i);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}//缓存userId为2的历史记录for (int i = 0; i < 10; i++) {test.addRecord(i,"2","点击了"+i);try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}// 获取userId为1历史记录System.out.println("==============================获取userId为1历史记录=============================================");List<HistoryRecord> historyRecordList = test.getRecords("1");for (HistoryRecord historyRecord : historyRecordList) {System.out.println(JSON.toJSONString(historyRecord));}// 获取用户最新的n条历史记录System.out.println("==============================获取用户最新的n条历史记录=============================================");List<HistoryRecord> historyRecordList2 = test.getLatestRecords("1",2);for (HistoryRecord historyRecord : historyRecordList2) {System.out.println(JSON.toJSONString(historyRecord));}System.out.println("==============================删除单条历史记录=============================================");test.deleteRecord("1","2");// 第二个参数为操作idSystem.out.println("==============================清空用户的历史记录=============================================");test.clearHistory("1");}/*** 添加历史记录(自动去重,保持最新记录)*/public void addRecord(Integer id,String userId, String content) {Jedis jedis = RedisTestUtil.getJedis();String key = HISTORY_KEY_PREFIX + userId;HistoryRecord record = new HistoryRecord(id,userId,content, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));String json = JSON.toJSONString(record);// 1. 从左边删除,先删除旧记录(如果存在)jedis.lrem(key, 0, json);// 2. 添加新记录到列表头部(最新记录在前)jedis.lpush(key, json);// 3. 限制列表长度,超出部分自动删除if (jedis.llen(key) > MAX_RECORDS) {jedis.rpop(key);}}/*** 获取用户的历史记录(按时间倒序)*/public List<HistoryRecord> getRecords(String userId) {Jedis jedis = RedisTestUtil.getJedis();String key = HISTORY_KEY_PREFIX + userId;List<String> jsonList = jedis.lrange(key, 0, -1);List<HistoryRecord> records = new ArrayList<>();for (String json : jsonList) {records.add(JSON.parseObject(json, HistoryRecord.class));}return records;}/*** 获取用户最新的N条历史记录*/public List<HistoryRecord> getLatestRecords(String userId, int count) {Jedis jedis = RedisTestUtil.getJedis();String key = HISTORY_KEY_PREFIX + userId;List<String> jsonList = jedis.lrange(key, 0, count - 1);List<HistoryRecord> records = new ArrayList<>();for (String json : jsonList) {records.add(JSON.parseObject(json, HistoryRecord.class));}return records;}/*** 删除单条记录实录* @param userId* @param recordId 操作的id*/public void deleteRecord(String userId, String recordId) {Jedis jedis = RedisTestUtil.getJedis();String key = HISTORY_KEY_PREFIX + userId;List<String> jsonList = jedis.lrange(key, 0, -1);// 查找并删除匹配ID的记录for (String json : jsonList) {HistoryRecord record = JSON.parseObject(json, HistoryRecord.class);if (record.getId().equals(Integer.valueOf(recordId))) {jedis.lrem(key, 0, json);break;}}}/*** 清空用户的历史记录*/public void clearHistory(String userId) {Jedis jedis = RedisTestUtil.getJedis();String key = HISTORY_KEY_PREFIX + userId;jedis.del(key);}
}
3.3 Set使用案例(当月签到情况)
利用set缓存一个签到功能,通过用户id可以查看到当月签到情况
public class RedisTest {private static final String HISTORY_KEY_PREFIX = "user:history:";private static final int MAX_RECORDS = 20; // 每个用户最大记录数private static final String SIGN_KEY_PREFIX = "sign:";public static void main(String[] args) {Long userId = 1001L;RedisTest test = new RedisTest();// 签到boolean isNewSign = test.doSign(userId);System.out.println("签到结果: " + (isNewSign ? "新签到" : "已签到"));// 检查是否签到System.out.println("今日是否签到: " + test.checkSign(userId));// 获取当月签到次数System.out.println("当月签到次数: " + test.getSignCount(userId));// 获取连续签到次数System.out.println("连续签到次数: " + test.getContinuousSignCount(userId));// 获取签到详情List<Boolean> signDetail = test.getSignDetail(userId);System.out.println("当月签到详情: " + signDetail);}// 生成 Key(格式:sign:{userId}:{yearmonth})private String getSignKey(Long userId) {LocalDate now = LocalDate.now();String yearMonth = now.format(DateTimeFormatter.ofPattern("yyyyMM"));return SIGN_KEY_PREFIX + userId + ":" + yearMonth;}// 签到(返回 true 表示首次签到,false 表示已签到)public boolean doSign(Long userId) {Jedis jedis = RedisTestUtil.getJedis();LocalDate now = LocalDate.now();int dayOfMonth = now.getDayOfMonth();String key = getSignKey(userId);// 使用 SADD 命令添加成员(Set 自动去重,存在则返回 0)return jedis.sadd(key, String.valueOf(dayOfMonth)) == 1;}// 检查今日是否已签到public boolean checkSign(Long userId) {Jedis jedis = RedisTestUtil.getJedis();LocalDate now = LocalDate.now();int dayOfMonth = now.getDayOfMonth();String key = getSignKey(userId);// 使用 SISMEMBER 命令检查成员是否存在return jedis.sismember(key, String.valueOf(dayOfMonth));}// 获取当月签到总次数public long getSignCount(Long userId) {Jedis jedis = RedisTestUtil.getJedis();String key = getSignKey(userId);// 使用 SCARD 命令获取集合大小return jedis.scard(key);}// 获取当月连续签到次数public long getContinuousSignCount(Long userId) {Jedis jedis = RedisTestUtil.
3.4 Hash使用案例(缓存商品信息)
利用Hash缓存商品信息
@Data
@Accessors(chain = true)
public class Product {private Long productId;private String name;private Double price;private Integer stock;private String category;private String description;private Long updateTime;}
public class RedisTest {private final Jedis jedis = RedisTestUtil.getJedis();private static final String PRODUCT_KEY_PREFIX = "product:";public static void main(String[] args) {// 创建商品对象Product product = new Product();product.setProductId(1001L);product.setName("iPhone 15 Pro");product.setPrice(6999.00);product.setStock(100);product.setCategory("手机/数码");product.setDescription("A17芯片,灵动岛设计");product.setUpdateTime(System.currentTimeMillis() / 1000);RedisTest redisTest = new RedisTest();// 存储商品到 Redis(过期时间 1天 = 86400秒)redisTest.saveProduct(product, 86400);System.out.println("商品已缓存");// 获取所有属性Map<String, String> productData = redisTest.getProduct(1001L);System.out.println("商品信息:" + productData);// 更新库存redisTest.updateProductField(1001L, "stock", "80");System.out.println("库存更新后:" + redisTest.getProductField(1001L, "stock"));// 删除描述字段redisTest.deleteProductField(1001L, "description");System.out.println("删除描述后:" + productData.get("description")); // 应输出 null}// 存储商品信息到 Redis Hash(带过期时间)public void saveProduct(Product product, int expireSeconds) {String key = getProductKey(product.getProductId());Map<String, String> hash = new HashMap<>();hash.put("name", product.getName());hash.put("price", String.valueOf(product.getPrice()));hash.put("stock", String.valueOf(product.getStock()));hash.put("category", product.getCategory());hash.put("description", product.getDescription());hash.put("update_time", String.valueOf(product.getUpdateTime()));jedis.hmset(key, hash); // 批量设置字段jedis.expire(key, expireSeconds); // 设置过期时间(秒)}// 获取商品的所有属性public Map<String, String> getProduct(Long productId) {String key = getProductKey(productId);return jedis.hgetAll(key); // 返回所有字段和值}// 获取单个属性(如价格)public String getProductField(Long productId, String field) {String key = getProductKey(productId);return jedis.hget(key, field);}// 更新商品属性(如库存)public Long updateProductField(Long productId, String field, String value) {String key = getProductKey(productId);return jedis.hset(key, field, value); // 返回 1 表示新增字段,0 表示更新现有字段}// 删除商品属性(如描述)public Long deleteProductField(Long productId, String field) {String key = getProductKey(productId);return jedis.hdel(key, field); // 返回删除的字段数}// 生成完整 Keyprivate String getProductKey(Long productId) {return PRODUCT_KEY_PREFIX + productId;}}
3.4 Sort Set使用案例(排行榜)
利用Sort Set缓存一个排行榜
@Accessors(chain = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RankItem {private int rank; // 排名private String userId; // 用户 IDprivate double score; // 分数
}
public class RedisTest {private Jedis jedis = RedisTestUtil.getJedis();private static final String RANK_KEY = "rank:score"; // 排行榜 Keypublic static void main(String[] args) {RedisTest test = new RedisTest();// 添加测试数据test.updateScore("user:1001", 95.0);test.updateScore("user:1002", 88.0);test.updateScore("user:1003", 92.0);test.updateScore("user:1004", 76.0);test.updateScore("user:1005", 95.0); // 与 1001 分数相同// 获取前三名List<RankItem> top3 = test.getTopN(3);System.out.println("排名前三用户为:");top3.forEach(System.out::println);// 获取用户 1002 的排名long rank = test.getUserRank("user:1002");System.out.println("用户1002排名: " + rank);}// 添加/更新用户分数public void updateScore(String userId, double score) {jedis.zadd(RANK_KEY, score, userId);}// 获取排行榜前 N 名(降序)public List<RankItem> getTopN(int n) {// 获取前 N 名(分数从高到低)Set<Tuple> topN = jedis.zrevrangeWithScores(RANK_KEY, 0, n - 1);List<RankItem> result = new ArrayList<>();int rank = 1;for (Tuple tuple : topN) {result.add(new RankItem(rank++,tuple.getElement(), // 用户 IDtuple.getScore() // 分数));}return result;}// 获取用户排名(从 1 开始)public long getUserRank(String userId) {// ZREVRANK 返回 0 为第一名Long rank = jedis.zrevrank(RANK_KEY, userId);return rank != null ? rank + 1 : -1; // -1 表示未找到}// 获取用户分数public double getUserScore(String userId) {Double score = jedis.zscore(RANK_KEY, userId);return score != null ? score : 0;}}
参考文档:Redis五大基本数据类型(String、LIst、Set、Hash、ZSet)及其底层结构-腾讯云开发者社区-腾讯云
相关文章:

redis五种数据结构详解(java实现对应的案例)
一、简述 Redis是一款高性能的键值对存储数据库,它支持五种基本数据类型,分别是字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)。 二、五种基本数据类型 2.1 字符串(String) String是Redis最基本的类型,一个key对…...
Telnet 命令详解
Telnet 命令详解:从基础到实战应用 Telnet 是一种历史悠久的网络协议,广泛用于远程登录和管理设备。尽管如今更安全的 SSH 协议已逐渐取代其地位,但 Telnet 在特定场景下依然发挥着重要作用。本文将深入解析 Telnet 命令的参数、使用场景及注…...
深度解析新能源汽车结构与工作原理
一、核心系统架构 新能源汽车主要由三大核心系统构成: 电力驱动系统:包含永磁同步电机、电机控制器(MCU)及减速器,采用三合一集成设计实现轻量化。永磁同步电机通过电磁感应原理将电能转化为机械能,其效率可…...

React 生命周期与 Hook:从原理到实战全解析
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…...
OpenSSL 与 C++ 搭建一个支持 TLS 1.3 的服务器
好的,我们可以使用 OpenSSL 与 C 搭建一个支持 TLS 1.3 的服务器。下面是: ✅ 一、完整示例代码(基于 OpenSSL) 使用 C 和 OpenSSL 创建一个简单的 TCP TLS 服务器,支持 TLS 1.3。 ✅ 代码:tls_server.cp…...
HOW - 简历和求职面试宝典(六)
文章目录 1. 如何更好地认识自己?一、认清自己的实力二、明确求职方向三、认识求职岗位与自己的匹配度2. 如何判断公司是否合适自己?一、网站平台二、内部人员三、通过面试官1. 如何更好地认识自己? 一、认清自己的实力 我们经常会听到这样的话:我现在的工作做的好不开心…...

【机器学习基础】机器学习入门核心算法:逻辑回归(Logistic Regression)
机器学习入门核心算法:逻辑回归(Logistic Regression) 一、算法逻辑1.1 基本概念1.2 Sigmoid函数1.3 决策边界 二、算法原理与数学推导2.1 概率建模2.2 损失函数推导2.3 梯度下降优化2.4 正则化处理 三、模型评估3.1 常用评估指标3.2 ROC曲线…...
深入理解设计模式之命令模式
下面是一篇关于设计模式之命令模式(Command Pattern)的详细博客,并附有 Java 实现代码示例。 深入理解设计模式之:命令模式(Command Pattern) 一、什么是命令模式? 命令模式(Comma…...

智能仓储落地:机器人如何通过自动化减少仓库操作失误?
仓库作业的速度和准确性至关重要,尤其是在当前对无差错、高效作业的要求达到前所未有的环境下。每一个错误,无论是物品放错位置还是库存差异,都会在供应链中产生连锁反应,造成延误、增加成本,并最终影响客户满意度。 …...
Android 架构演进之路:从 MVC 到 MVI,拥抱单向数据流的革命
在移动应用开发的世界里,架构模式的演进从未停歇。从早期的 MVC 到后来的 MVP、MVVM,每一次变革都在尝试解决前一代架构的痛点。而今天,我们将探讨一种全新的架构模式 ——MVI(Model-View-Intent),它借鉴了…...

[低代码表单生成器设计基础]ElementUI中Layout布局属性Form表单属性详解
Layout 布局 ElementUI 的 Layout 布局系统基于 24 栏栅格设计,提供了灵活的响应式布局能力,适用于各种页面结构的构建。(CSDN) 📐 基础布局结构 ElementUI 的布局由 <el-row>(行)和 <el-col>࿰…...
数据结构7——二叉树
一、二叉树的定义与性质 1.定义 首先是树形结构,每个节点最多有2棵树,二叉树的子树有左右之分,不能颠倒。 2.性质 (1)二叉树的第i层,最多有2的(i-1)次幂。 (2)深度为k࿰…...

从“被动养老”到“主动健康管理”:平台如何重构代际关系?
在老龄化与数字化交织的背景下,代际关系的重构已成为破解养老难题的关键。 传统家庭养老模式中,代际互动多表现为单向的“赡养-被赡养”关系。 而智慧养老平台的介入,通过技术赋能、资源整合与情感连接,正在推动代际关系向“协作…...
Java 中的 synchronized 和 Lock:如何保证线程安全
Java 中的 synchronized 和 Lock:如何保证线程安全 引言 在 Java 多线程编程中,线程安全是一个核心问题。当多个线程同时访问共享资源时,可能会导致数据不一致或其他不可预期的结果。synchronized关键字和Lock接口是 Java 中实现线程同步的…...

贪心算法应用:最大匹配问题详解
Java中的贪心算法应用:最大匹配问题详解 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。在Java中,贪心算法可以应用于多种问题,其中最大匹配问题是一个经典的应用场景。下面我将从基础概念到具体实现,全面详细地讲解贪…...

爬虫IP代理效率优化:策略解析与实战案例
目录 一、代理池效率瓶颈的根源分析 二、六大核心优化策略 策略1:智能IP轮换矩阵 策略2:连接复用优化 策略3:动态指纹伪装 策略4:智能重试机制 三、典型场景实战案例 案例1:电商价格监控系统 案例2:…...

豆瓣电视剧数据工程实践:从爬虫到智能存储的技术演进(含完整代码)
通过网盘分享的文件:资料 链接: https://pan.baidu.com/s/1siOrGmM4n-m3jv95OCea9g?pwd4jir 提取码: 4jir 1. 引言 1.1 选题背景 在影视内容消费升级背景下,豆瓣电视剧榜单作为国内最具影响力的影视评价体系,其数据价值体现在:…...
【HW系列】—C2远控服务器(webshell链接工具, metasploit、cobaltstrike)的漏洞特征流量特征
文章目录 蚁剑、冰蝎、哥斯拉一、蚁剑(AntSword)流量特征二、冰蝎(Behinder)流量特征三、哥斯拉(Godzilla)流量特征 metasploit、cobaltstrike一、Metasploit流量特征二、CobaltStrike流量特征三、检测与防…...
5.28 孔老师 nlp讲座
本次讲座主要介绍了语言模型的起源、预训练模型以及大语言模型(需要闫老师后讲)等内容。首先,语言模型的起源可以追溯到语音识别中的统计语言模型,通过估计声学参数串产生文字串的概率来找到最大概率的文字串。然后,介…...

基于微信小程序的漫展系统的设计与实现
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,没有什么华丽的语言࿰…...
打卡day39
一、 图像数据的介绍 1.1 灰度图像 # 先继续之前的代码 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset # DataLoader 是 PyTorch 中用于加载数据的工具 from torchvision import datasets, transforms…...

基于Web的分布式图集管理系统架构设计与实践
引言:为什么需要分布式图集管理? 在现代Web图形应用中,纹理图集(Texture Atlas)技术是优化渲染性能的关键手段。传统的图集制作流程通常需要美术人员使用专业工具(如TexturePacker)离线制作&am…...

mysql执行sql语句报错事务锁住
报错情况 1205 - Lock wait timeout exceeded; try restarting transaction先找出长时间运行的事务 SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started ASC;终止长时间运行的事务 KILL [PROCESS_ID];...

Java消息队列应用:Kafka、RabbitMQ选择与优化
Java消息队列应用:Kafka、RabbitMQ选择与优化 在Java应用领域,消息队列是实现异步通信、应用解耦、流量削峰等重要功能的关键组件。Kafka和RabbitMQ作为两种主流的消息队列技术,各有特点和适用场景。本文将深入探讨Kafka和RabbitMQ在Java中的…...

零基础设计模式——结构型模式 - 组合模式
第三部分:结构型模式 - 组合模式 (Composite Pattern) 在学习了桥接模式如何分离抽象和实现以应对多维度变化后,我们来探讨组合模式。组合模式允许你将对象组合成树形结构来表现“整体-部分”的层次结构。组合模式使得用户对单个对象和组合对象的使用具…...
额度年审领域知识讲解
金融领域的“额度年审”是一个非常重要的常规性工作。它指的是金融机构(主要是银行)对其授予客户的各种信用额度或授信额度,在授信有效期内(通常是一年)进行周期性的重新评估、审查和确认的过程。 核心目的࿱…...

腾讯云国际站可靠性测试
在数字化转型加速的今天,企业对于云服务的依赖已从“可选”变为“必需”。无论是跨境电商的实时交易,还是跨国企业的数据协同,云服务的可靠性直接决定了业务连续性。作为中国领先的云服务提供商,腾讯云国际站(Tencent …...

自定义异常小练习
在开始之前,让我们高喊我们的口号: 键盘敲烂,年薪百万! 目录 键盘敲烂,年薪百万! 异常综合练习: 自定义异常 异常综合练习: 自定义异常: 定义异常类写继承关系空参构造带参构造 自定…...

SpringBoot整合MinIO实现文件上传
使用Spring Boot与JSP和MinIO(一个开源对象存储系统,兼容Amazon S3)进行集成,您可以创建一个Web应用来上传、存储和管理文件。以下是如何将Spring Boot、JSP和MinIO集成的基本步骤: 这个是minio正确启动界面 这个是min…...

基于面向对象设计的C++日期推算引擎:精准高效的时间运算实现与运算重载工程化实践
前引: 在软件开发中,时间与日期的处理是基础但极具挑战性的任务。传统的手工日期运算逻辑往往面临闰年规则、月份天数动态变化、时区转换等复杂场景的容错难题,且代码冗余度高、可维护性差。本文将深入探讨如何利用C的面向对象特性与成员函数…...