个人项目《城院生态圈》微信小程序
城院生态圈简介
《城院生态圈》是一款基于微信小程序+SpringBoot的校内动植物百科以及论坛小程序,面向浙大城市学院范围内的师生,目前正在开发中。在这里你可以查看本校内所有动植物的个体信息,包括学名、外号、习性、生物学分类、养护指南等,也可以在里面和其他动植物爱好者交流,甚至可以云领养流浪动物,在虚拟世界中完成和流浪动物的交互。
前端技术栈
wxml + wxss + js
后端技术栈
SpringBoot + SpringSecurity + Redis + MySQL + RabbitMQ效果预览图
开发进度
动植物科普模块
动物百科功能
动物养护指南、照片、外号、学名、性格、外貌、亲属关系等。
植物百科功能
植物养护指南、照片、校内分布位置、学名、生物分类学信息等。
动植物搜索功能
文字模糊搜索。
拍照识别(TBD)。
支持用户对百科条目的修订、照片上传,帮助维护。
论坛模块
交流功能
发帖
图片上传
视频上传
表情
点赞
收藏
评论
举报
分享
打赏
实时热帖
帖子搜索 ...
【Java知识点】关于并发的一些面试问答
本篇文章内容参考JavaGuide,自己整理一遍加深印象。
关于进程和线程进程与线程的定义
进程
程序的一次执行过程,是系统运行程序的基本单位,进程是动态的。
线程
比进程更小的执行单位
一个进程执行过程中可以产生多个线程
同类的多个线程共享进程的堆和方法区资源
每个线程有自己的程序计数器、虚拟机栈和本地方法栈
也被称为轻量级进程
程序计数器为什么是私有的一句话概括——为了让线程切换后能够恢复到正确的执行位置
堆和方法区的作用
是所有线程共享的资源
堆
进程中最大的一块内存
存放新创建的对象(几乎所有对象都是在这里分配内存)
方法区
存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
并发和并行的区别
并发:两个及两个以上的作业在同一时间段内执行
并行:两个及两个以上的作业在同一时刻执行
同步和异步的区别
同步: 发出一个调用之后,在没有得到结果之前,该调用就不可以返回,一直等待。
异步: 调用发出之后,不用等待返回结果,该调用直接返回。
线程的生命周期和状态
NEW:初始状态,线程被创建出来,但是没有被调用start()
RUNNABLE:运行 ...
【Java知识点】关于集合的一些面试问答
本篇文章内容参考JavaGuide,自己整理一遍加深印象。
集合概述Java集合,也叫做容器。主要是由Collection(存放单一元素)、Map(存放键值对)两大接口派生而来。对于Collection接口,有三个主要的子接口:List、Set、Queue
常见问答说说List,Set,Queue,Map四者的区别
List(对付顺序的好帮手)
存储的元素是有序的、可重复的。
Set(注重独一无二)
存储的元素是无序的、不可重复的。
Queue(排队,注重规则排序)
按特定的规则来确定先后顺序,存储的元素是无序的、可重复的。
Map(Key-Value,key独一无二,一一对应)
key是无序的、不可重复的。
value是无序的、可重复的。
常用的集合类有哪些
List
ArrayList
底层是Object[]数组
Vector
底层是Object[]数组,线程安全,效率低,使用较少
LinkedList
底层是双向链表
Set
HashSet
无序,底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合Key部分。
...
【Java知识点】关于I/O你需要知道的基础
基础知识IO流简介IO,即(Input/Output),也就是输入和输出。IO流在Java中分为输入流和输出流,根据数据的处理方式又分为字节流和字符流。
为什么IO操作有字节流和字符流?
在不知道编码类型的情况下,字节流操作容易出现乱码。
字符流要通过Java虚拟机转换得到的,过程比较耗时。
音频文件、图片等媒体文件用字节流较好,文字用字符流较好。
字节流InputStream(字节输入流)java.io.InputStream抽象类是所有字节输入流的父类。
作用
用于从源头(通常是文件)读取数据(字节信息)到内存中。
FileInputStream
作用
常用的字节输入流对象,可以指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。
一般不直接单独使用,常与BufferedInputStream(字节缓冲输入流)搭配,如下面这段代码。12345// 新建一个 BufferedInputStream 对象BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInp ...
【爬虫实战】获取某租房网站的房源信息
爬虫实战-获取某租房网站的房源信息Github代码地址
帮助朋友编一个爬虫来获取信息建立房价预测的数据集,顺便回忆一下之前自学的爬虫。首先确定好要使用的几个库。
requests库模拟请求
BeautifulSoup库处理数据
json库序列化接口数据
traceback库打印请求信息
保存数据的库一开始本来是用xlwt的,但是写完发现保存的数据无法被pandas读取(编码问题),于是采用csv库手搓爬虫开始直接用request发请求的话必然是会被阻拦的,尝试了下返回403,果然被拦截了。那么这时候就要把爬虫伪装一下。添加头部信息:123headers = { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76"}
接下来开始分析网站台湾租房网
从首页可以看出我们需要的数据在列表 ...
进阶日记(一)——全局异常处理与统一处理返回体
统一返回格式身为一名后端开发者,少不了前后端的信息交互,这个时候如果你传给前端的信息乱七八糟,往往少不了挨一顿揍。所以统一一下返回格式还是很有必要的。有点经验的开发者一般都会养成这个习惯,所以今天这篇文章的目的并不在于讲解如何统一返回信息。现在有这么一个问题,你已经封装好了统一的返回信息,按照标准给前端返回了code,msg和data,但是你每次写接口都要重新写一遍生成这个对象,再包装,让代码变得十分冗余并且不美观。接下来就记录我个人在自己的项目上对这个现象进行优化的过程。
@RestControllerAdvice注解首先他是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component。个人理解他的作用是,在Controller层return完数据,在最终返回给前端信息前对数据进行拦截并自定义处理。看一下ResponseBodyAdvice的接口源码。
12345678910111213public interface ResponseBodyAdvice<T> { / ...
Nginx使用上遇到的坑
记录一次Nginx使用的坑情况描述https甲方配置了已经绑定到我们8082端口了,Nginx如何配才能让自己的请求通过这个端口在本地无证书的情况下变成https。
使用环境Docker安装最新版Nginx,并映射到各自的80端口,做好了文件映射
1docker run -p 80:80 --name nginx --restart=always -v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d -v /opt/docker/nginx/html:/usr/share/nginx/html -v /opt/docker/nginx/logs:/var/log/nginx -d nginx
坑一不论怎么配置80端口的代理,永远不生效,指定root目录后依旧是展示Nginx启动页,换了资源目录、配置全局root、换成alias都无效。以下是配置文件
1234567891011121314151617181920212223 ...
利用Redis完成论坛帖子的分页加载
利用Redis完成论坛帖子的分页加载核心思路
利用Redis的ZSet(SortedSet)和Hash做分页。
SortedSet会给每个添加的元素member绑定一个用于排序的值score,SortedSet就会根据score值的大小对元素进行排序,在论坛的应用场景中可以将发布日期当作score用于排序。在RedisTemplate中提供了相关的函数来进行分页取出操作。详情见下。
在Hash里对应存储ID->帖子信息,在SortedSet中存储帖子ID,分页取出每个帖子ID后在Hash中直接根据ID找到对应的帖子信息,返回数组即可。
实现操作
设置定时任务每天在访问低峰期更新数据。
使用@EnableScheduling开启基于注解的定时任务
使用@Scheduled搭配cron表达式设置时间
加载1000条帖子到本地,用getTime()取到Long类型的时间数据作为排序依据,用postID作值。1234567891011121314//每天凌晨四点更新缓存,把数据库里前1000条更新到缓存里。(没人能这么闲看完这么多帖子吧)List<CommunityPos ...
Redis知识点复习整理
Redis学习笔记笔记声明
本篇文章是根据视频【尚硅谷】Redis 6 入门到精通 超详细 教程学习得来,参考老师的笔记进行整理
NoSQL概念
NoSQL(Not Only SQL) 泛指非关系型数据库,不依赖业务逻辑方式存储,而以简单的Key-Value方式存储,大大增加了数据库的扩展能力
特点
不遵循SQL标准
不支持ACID
ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
远超于SQL的性能
适用场景
对数据高并发的读写
海量数据读写
对数据高可扩展性的
不适用场景
需要事务支持
基于sql的结构化查询存储,处理复杂的关系,需要即席查询
用不着sql的和用了sql也不行的情况,考虑用NoSQL
Redis基础知识
Redis是单线程+多路IO复用技术
原子操作
定义
不会被线程调度机制打断的操作。一旦开始操作就 ...
JVM知识点整理
JVM学习笔记
双亲委派机制
目的
安全
内容
例如自己写了一个java.lang.String类,在里面写main方法时,会提示找不到main方法。原因是因为双亲委派机制会逐步向上找,通过APP(应用程序加载器)->EXTEND(扩展类加载器)->BOOTSTRAP(启动类(根)加载器)逐级向上找其他地方有没有String类
步骤
类加载器收到类加载的请求
将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
启动加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,如果都找不到,就抛出异常,通知子加载器进行加载。
重复步骤3
百度解释(1.8以及之前版本)1如果一个类加载器收到了类加载请求,它首先不会自动去尝试加载这个类,而是把这个类委托给父类加载器去完成,每一层依次这样,因此所有的加载请求都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成该加载请求(找不到所需的类)时,这个时候子加载器才会尝试自己去加载,这个过程就是双亲委派机制!
优势
避免了类的重复加载
保护了程序的安全性,防止核心API被修改
nati ...