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,并查询通过命令行查询 list插入数据到redis中从redis中读取命令读取数据 hash向redis中逐个添加map键值对获取key对应的map中所…...

MySQL使用LIKE索引是否失效的验证
1、简单的示例展示 在MySQL中,LIKE查询可以通过一些方法来使得LIKE查询能够使用索引。以下是一些可以使用的方法: 使用前导通配符(%),但确保它紧跟着一个固定的字符。 避免使用后置通配符(%)&…...

封装日历uniapp,只显示年月不显示日
默认展示最新日期 子组件 <template><view class"date-picker"><picker mode"date" fields"month" change"onDateChange" :value"selectedDate"><view class"picker">{{ selectedDate…...

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

Mysql面试合集
概念 是一个开源的关系型数据库。 数据库事务及其特性 事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。 事务特性: (1)原子性:即不可分割性,事务要么全部被执行,要么就…...

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修改模态框标题 编辑页面拿到数据库数据显示默认数据功能实现 想要去数据库中获取数据时:对象/字典 三种不同的数据类型 使用Ajax传入数据实现表单编辑&…...

docker部署mycat,连接上面一篇的一主二从mysql
一、docker下载mycat镜像 查看安装结果 这个名称太长,在安装容器时不方便操作,设置标签为mycat docker tag longhronshens/mycat-docker mycat 二、安装容器 先安装一个,主要目的是获得配置文件 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容器的一些总结: stack容器比较简单,主要包括: 1、构造函数:stack [staName] 2、添加、删除元素: push() 、pop() 3、获取栈顶元素:top() 4、获取栈的大小:size() 5、判断栈是否为空&#x…...

跨平台Ribbon UI组件QtitanRibbon全新发布v6.7.0——支持Qt 6.6.3
没有Microsoft在其办公解决方案中提供的界面,就无法想象现代应用程序,这个概念称为Ribbon UI,目前它是使应用程序与时俱进的主要属性。QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibb…...

(6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
目录 前言1. DataFrame 简介2. DataFrame的特点3. DataFrame的创建3.1 使用字典创建DataFrame3.2 使用列表的列表(或元组)创建DataFrame3.3 使用NumPy数组创建DataFrame3.4 使用Series构成的字典创建DataFrame3.5 使用字典构成的字典创建DataFrame 4. 从…...

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

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

中英双语介绍百老汇著名歌剧:《猫》(Cats)和《剧院魅影》(The Phantom of the Opera)
中文版 百老汇著名歌剧 百老汇(Broadway)是世界著名的剧院区,位于美国纽约市曼哈顿。这里汇集了许多著名的音乐剧和歌剧,吸引了全球各地的观众。以下是两部百老汇的经典音乐剧:《猫》和《剧院魅影》的详细介绍。 1.…...

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

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

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

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

leetcode力扣_贪心思想
455.分发饼干(easy-自己想得出来并写好) 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺…...

Vue中Class数据绑定
Class数据绑定 数据绑定的一个常见需求场景是操作CSS class列表,因为class是attribute(属性),我们可以和其他attribute一样使用v-bind 将它们和动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生…...

Python数据分析案例49——基于机器学习的垃圾邮件分类系统构建(朴素贝叶斯,支持向量机)
案例背景 trec06c是非常经典的邮件分类的数据,还是难能可贵的中文数据集。 这个数据集从一堆txt压缩包里面提取出来整理为excel文件还真不容不易,肯定要做一下文本分类。 虽然现在文本分类基本都是深度学习了,但是传统的机器学习也能做。本案…...

贪心算法-以学籍管理系统为例
1.贪心算法介绍 1.算法思路 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一 步都要确保能获得局部最优解。每一步只考虑一 个数据,其选取应该满足局部优化的条件。若下 一个数据和部分最优解连在一起…...

PyCharm 安装
PyCharm是一种流行的Python集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能,如智能代码补全、实时错误检查、项目导航、调试工具以及版本控制等,极大地提高了Python开发人员的工作效率。以下是PyCharm安装…...

C++:对象指针访问成员函数
使用箭头操作符 (->):ptr->function() 是最常用和推荐的方式,因为它更简洁、更直观。箭头操作符 (->) 被设计为与点操作符 (.) 配合指针一起使用,以便通过指针访问对象的成员。 先解引用指针,然后使用点操作符 (.)&…...

Linux 防火墙配置指南:firewalld 端口管理应用案例(二十个实列)
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧🐧Linux高级管理专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️…...

推荐Bulk Image Downloader插件下载网页中图片链接很好用
推荐:Bulk Image Downloader chome浏览器插件下载图片链接,很好用。 有个网页,上面放了数千的gif的电路图,手工下载会累瘫了不可。想找一个工具分析它的静态链接并下载,找了很多推荐的下载工具,都是不能分…...

详解前缀码与前缀编码
前缀编码是一种数据压缩技术,也被称为可变长度编码。它的基本原理是将频繁出现的字符或字符序列用较短的编码表示,而较少出现的字符或字符序列用较长的编码表示,从而达到压缩数据的目的。 概念定义 前缀码:给定一个编码序列的集合…...

数据库管理工具 -- Navicat Premium v17.0.8 特别版
软件简介 Navicat Premium 是一款功能强大的数据库管理工具,适用于Windows、Mac和Linux平台。它支持多种数据库,包括MySQL、MariaDB、SQL Server、PostgreSQL、Oracle、SQLite等。用户可以通过Navicat Premium轻松地连接到各种数据库服务器,…...

【Linux】进程创建和终止 | slab分配器
进程创建 fork 1.fork 之后发生了什么 将给子进程分配新的内存块和内核数据结构(形成了新的页表映射)将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork 返回,开始调度器调度 这样就可以回答之前返回两个值?…...