项目
文章平均质量分 69
HCH996
一边失去,一边在寻找~
展开
-
7.7 热帖排行
在点赞,评论,收藏,加精等地方都要重新计算帖子分数。 使用redis中的set集合数据结构,在以上操作处理中, 往set集合中存入帖子id 设置一个定时任务,每隔半小时去重新计算帖子的分数 具体为: 根据set中的id从数据库中查询出DiscussPost, 利用commentCount, likeCount等字段计算score, 计算完了以后需要将帖子同步到数据库和ElasticSerach服务器中去 再提供一个根据热度排行的服务处理方法规划key private static f原创 2021-01-05 12:29:14 · 147 阅读 · 0 评论 -
7.1 和7.2 Spring Security
简介Spring Security是一个专注于为Java应用程序提供身份认证和授权的框架,它的强大之处在于它可以轻松扩展以满足自定义的需求特征对身份的认证和授权提供全面的,可扩展的支持。 防止各种攻击,如会话固定攻击,点击劫持,csrf攻击等。 支持与Servlet API, Spring MVC等Web技术集成。Filter可以拦截对DispathcerServler的访问。 Spring Security的的底层就是利用的Filter,对各个请求进行拦截。Filter判断的时机比拦截器要原创 2021-01-04 10:57:34 · 151 阅读 · 0 评论 -
技术总体架构
技术架构Spring Boot Spring Spring MVC, MyBatis Redis, Kafka, Elasticsearch (提高性能方面) Spring Security, Spring Actuator 提高性能方面 使用了redis, Kafka, Elasticsearch 零碎技术: 怎么生成验证码,怎么生成长图并传递至云服务器, 怎么实现敏感词过滤,怎么实现定时启动任务。开发环境利用Maven构建 创建 编译 测试和生成文档等集成开发环境:...原创 2020-12-23 21:01:30 · 544 阅读 · 0 评论 -
项目挑战
一、客户端图片直传Situation在实现这个功能时,接连出现了两个问题,一是没有上传至七牛云服务器的权限;二是能够顺利上传,但是达不到自动刷新头像的效果。Task定位这两个问题Action针对第一个问题,处理方式1. 核对配置文件中对应的用户认证密钥、对上传文件加密的密钥、指定空间的名称、指定空间的域名是否配置正确。2. 核对无误后,在本地应用单独写了一个测试方法,先把头像上传至本地应用,再把头像上传至七牛云服务器,返回的数据表示上传成功,那就大致能定位到客户端利用js发生原创 2020-11-26 12:58:34 · 172 阅读 · 0 评论 -
常见面试题
目录一、MySQL/锁1. 范围2. 类型(InnoDB) (悲观锁)3. 加锁4. 死锁场景解决方案避免死锁5. 乐观锁1. 版本号机制2. CAS算法(Compare and swap)6. B+Tree树(InnoDB)二、redis1. 数据类型2. 过期策略惰性删除定期扫描:3. 淘汰策略4. 缓存穿透5. 缓存击穿(一个热点数据)6. 缓存雪崩(整个缓存、大批量数据)7. 分布式锁8. redis实.原创 2020-11-17 18:46:51 · 142 阅读 · 0 评论 -
8. 2 项目总结
目录从技术和业务的角度梳理SpringSpring MVC(解决前后端处理请求,交互的问题)Spring MyBatis(访问数据库)Spring Security(用来管理用户权限,解决安全层面的问题)SSM是项目的基石,绝大多数的请求处理都是基于这些技术的。其他技术:分别解决不同层面的问题登录和权限模块核心性能通知搜索其他从运维角度-部署架构从技术和业务的角度梳理Spring不是核心的技术,只是起到一个辅助的作用,进而降低其他.原创 2020-11-16 21:14:21 · 134 阅读 · 1 评论 -
8.1 单元测试
为某次测试单独初始化数据,单独为这次测试而服务的,用完后就会被清理掉(虽然性能低,但是独立性好)@BeforeTestClass:在测试类加载之前,方法被执行,只会执行一次 @AfterTestClass:在类销毁的时候执行,只会执行一次 @BeforeEach:每个测试方法执行之前执行(可以初始化数据) @AfterEach:每个测试方法执行之后执行(可以销毁数据) @Test:可以执行的测试方法如果右键运行一个类,测试整个类,执行所有的@Test的方法,然后每个方法的前后都会执行@..原创 2020-11-16 20:40:42 · 97 阅读 · 0 评论 -
7.10 优化网站的性能
目录部署两级缓存的过程缓存用户热门的帖子列表导包配置相关参数优化Service层DiscussPostService利用JMeter完成压力测试创建线程组添加取样器添加统一随机定时器添加监听器(聚合报告)登录凭证是不适合放在本地缓存的,因为在分布式环境下,用户访问A服务器,再访问B服务器,服务器和凭证相互关联的。分布式缓存的性能略低于本地缓存,主要是网络开销所造成的。数据库查询到的数据需要更新到缓存、尽一切可能避免访问数据库。redis可以跨服务器,可..原创 2020-11-16 19:57:06 · 162 阅读 · 0 评论 -
7.9 将文件上传至云服务器
目录上传头像-客户端上传UserControllersetting.htmlsetting.js分享功能-服务器直传ShareControllerEventConsumer配置七牛云相关内容(主要分为秘钥和空间)# qiniuqiniu.key.access= #用户身份认证秘钥qiniu.key.secret= #对上传文件加密秘钥qiniu.bucket.header.name=cuihua-header #指定空间的名称qiniu.bucket.原创 2020-11-16 10:58:05 · 335 阅读 · 0 评论 -
7.8 生成长图
目录Java操作wkhtmltoimage演示模拟实现分享功能新创建一个ShareController消费生成长图的事件Java操作wkhtmltoimage演示public class WkTests { public static void main(String[] args){ //只是把命令发送给操作系统来执行,和主程序是并发的 String cmd = "C:/Program Files/wkhtmltopdf/bin/.原创 2020-11-16 09:37:34 · 449 阅读 · 0 评论 -
7.6 任务执行和调度
JDK线程池演示 //JDK线程池(通过工厂实例化的) private ExecutorService executorService = Executors.newFixedThreadPool(5); //JDK可执行定时任务线程池 private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5); //1.JDK普通线程池 ...原创 2020-11-15 22:17:44 · 216 阅读 · 0 评论 -
7.5 网站数据统计
目录规划RedisKeyUtilDataService表现层1. 记录值2. 查看值data.html配置权限:只有管理员能使用UV关注的是访问量,不关注有没有登录,只要访问过就都算,基于IP地址排重统计。DAU,基于用户ID排重统计(更关注用户的有效性),要求结果必须精确。规划RedisKeyUtil private static final String PREFIX_UV = "uv"; private static final Str...原创 2020-11-15 21:18:55 · 186 阅读 · 0 评论 -
7.4 Redis高级数据结构
HyperLogLog:超级日志 ,BitMap(实际还是01字符串):精确统计,应用场景:(签到)一年365天,对应位置为1就表示已到,否则表示未到。都适合对网站运营的数据进行统计,且非常节约内存。使用演示//统计20万个重复数据的独立总数@Testpublic void testHyperLogLog(){ String redisKey = "test:h11:01"; for(int i = 0; i < 1000; i++){ redis..原创 2020-11-15 20:48:33 · 148 阅读 · 0 评论 -
7.3 置顶、加精和删除
目录DiscussPostMapperDiscussPostServiceDiscussPostControllerdiscuss.js配置权限SecurityConfig导入thymeleaf-spring包DiscussPostMapperint updateType(int id, int type);int updateStatus(int id, int status);<update id="updateType"> upda..原创 2020-11-15 20:21:23 · 219 阅读 · 0 评论 -
6.3 开发社区搜索功能
目录新建一个ElasticsearchServiceDiscussPostControllerCommentController消费事件EventConsumer新建一个SearchControllersearch.html新建一个ElasticsearchService@Servicepublic class ElasticsearchService { @Autowired private DiscussPostRepository disc.原创 2020-11-15 16:35:02 · 329 阅读 · 0 评论 -
6.2 Spring整合Elasticserach
目录配置es实体类与index映射配置创建一个测试类配置es# Elasticserarchpropertiesspring.data.elasticsearch.cluste-name=newcoderspring.data.elasticsearch.cluster-node=127.0.0.1:9300 解决ES中Netty启动冲突的问题。//表示这个类是一个配置文件@SpringBootApplicationpublic class Commu...原创 2020-11-15 12:50:15 · 322 阅读 · 0 评论 -
6.1 Elasticsearch入门
存储:分词:建立索引 分片:提高并发能力 副本:提高可靠性安装es,配置数据存放路径,配置环境变量。安装中文分词器IK,下载完后解压到es中的plugin目录下的ik目录下,在IK目录下可以配置一些扩展词(网络流行用词)和停止词,es6之后的一个索引就类似于一张表,一行记录就相当于是一篇文档,文档是最一个可被检索的最基础的信息单元。localhost:9092:/test/_doc/1: _doc:占位置localhost:9092:/test/_search?q=content:运...原创 2020-11-15 11:42:34 · 98 阅读 · 0 评论 -
5.5 显示系统通知
目录一、通知列表MessageMapperMessageServiceMessageControllernotice.html二、通知详情MessageMapperMessageServiceMessageControllernotice-detail.html三、显示头部的总的未读消息总数,利用拦截器实现创建MessageInterceptorWebMvcConfig配置拦截器在index.html中的header中显示数据一、通...原创 2020-11-15 10:18:35 · 374 阅读 · 0 评论 -
5.4 发送系统通知
目录封装事件Event事件生产者EventProducer事件消费者EventConsumerCommentControllerLikeControllerFollowController因为评论、点赞、关注都是频繁的操作,为了提高性能,需要用到消息队列。把这件事包装成一个事件,仍到消息队列里去。后续的事情由消费者去处理,消费者和生产者并发异步执行。在Kafka的基础上,以事件驱动编程。事件对象中包含了消息中的所有数据,而不是只有一个字符串,因此更具有扩展性。消费事.原创 2020-11-15 09:15:10 · 225 阅读 · 0 评论 -
5.3 Spring整合Kafka
配置对kafka做相应的配置application.properties# KafkaPropertiesspring.kafka.bootstrap-servers=localhost:9092spring.kafka.consumer.group-id=community-consumer-groupspring.kafka.consumer.enable-auto-commit=truespring.kafka.consumer.auto-commit-interval=3000..原创 2020-11-14 17:58:36 · 221 阅读 · 0 评论 -
5.2 Kafka入门
一个主题由多个分区构成,一个分区有多个副本,Offset表示消息在分区中的偏移起始位置。主分区处理请求,但从分区只负责备份数据。http://kafka.apache.org启动先启动zookeeper 需要指定配置文件(新启动一个cmd窗口)启动kafka(重新打开一个终端)bin\windows\zookeeper-server-start.bat config\zookeeper.propertiesbin\windows\kafka-server-start.ba...原创 2020-11-14 17:46:37 · 147 阅读 · 0 评论 -
5.1 阻塞队列
BlockingQueue解决线程通信的问题 阻塞方法: put、take生产者消费者模式生产者:产生数据的线程 消费者:使用数据的线程实现类 ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue、SynchronousQueue、DelayQueue等 阻塞队列使用演示public class BlockingQueueTests { public static voi...原创 2020-11-14 17:15:44 · 112 阅读 · 1 评论 -
4.7 优化登录模块
目录使用Redis存储验证码规划RedisKeyUtilLoginController使用redis存储登录凭证规划RedisKeyUtilUserService使用Redis缓存用户信息规划RedisKeyUtilUserService之前的验证码是存储在session里的,登录凭证存储在数据库中。用户的信息也是每次都从数据库中查询得到,效率低。使用Redis存储验证码规划RedisKeyUtil private static fin..原创 2020-11-14 16:45:43 · 215 阅读 · 0 评论 -
4.6 关注列表、粉丝列表
FollowService倒序查询 //查询某用户关注的人 public List<Map<String, Object>> findFollowees(int userId, int offset, int limit){ String followeeKey = RedisKeyUtil.getFolloweeKey(userId, ENTITY_TYPE_USER); //需要按照时间倒序排列 Set&..原创 2020-11-14 16:02:03 · 589 阅读 · 0 评论 -
4.5 关注、取消关注
规划RedisKeyUtil为统计方便,同时存两份数据,使用zset数据结构,以时间为分数进行排序 private static final String PREFIX_FOLLOWEE = "followee"; private static final String PREFIX_FOLLOWER = "follower"; //某个用户关注的实体 以当前时间加入set,以便更好的进行业务变化 //followee:userId:entityType -&...原创 2020-11-14 15:39:35 · 233 阅读 · 0 评论 -
4.4 我收到的赞
在用户点赞的是时候,增加一个维度。在RedisKeyUtil中添加private static final String PREFIX_USER_LIKE = "like:user";//某个用户的赞//like:user:userId -> intpublic static String getUserLikeKey(int useId){ return PREFIX_USER_LIKE + SPLIT + useId;}LikeService涉及到了多个操作...原创 2020-11-14 15:07:59 · 194 阅读 · 0 评论 -
4.3 点赞
目录生成key的工具类RedisKeyUtil业务组件LikeService表现层LikeControllerdiscuss-detail.htmldiscuss.js完善HomeControllerindex.htmlDiscussPostControllerdiscuss-detail.html直接写业务层,调用redisTemplate往redis中读取和存入数据即可,面向key编程,先创建一个可生成key的工具类: RedisKeyUti...原创 2020-11-14 12:52:12 · 282 阅读 · 0 评论 -
4.2 Spring整合Redis
以上方法返回一个可以操作对应数据类型的对象配置redis# RedisPropertiesspring.redis.database=11 #需要设置成哪个库spring.redis.host=localhostspring.redis.port=6379redis连接数据库就得创建一个连接工厂,主要配置的是序列化的方式API演示@SpringBootTest@ContextConfiguration(classes = CommunityApplication.cla...原创 2020-11-14 11:46:45 · 147 阅读 · 0 评论 -
4.1 Redis入门
目录常见命令StringHashListSetSorted set(提供了按照分数排序的功能)全局命令常见命令Stringget set incr decrHashhset hgetListlpush lpop rpush rpop llen lindex lrangeSetsadd scard(统计集合中元素的个数) spop(从集合中随机弹出一个元素,抽奖) smembers(查看集合中还有多少个元素)Sorted se...原创 2020-11-14 11:03:09 · 81 阅读 · 0 评论 -
3.10 统一记录日志
目录AOP概念术语实现Spring AOPJDK动态代理CGLib动态代理AOP代码演示定义切点@Pointcut定义通知利用AOP完成项目记录日志的功能拦截器是针对控制器的处理。通知和拦截器解决不了在业务层记日志的需求。记录日志属于系统需求,不属于业务需求,将系统需求处理的逻辑单独拆分出去,而非硬编码至业务层。AOP概念术语Joinpoint:连接点,表示织入目标对象的哪个具体位置,可以是属性,可以是方法,可以是构造方法、静.原创 2020-11-14 09:31:11 · 150 阅读 · 0 评论 -
3.9 统一异常处理
spring boot自动提供的异常处理方式在特定目录位置下templates/error 以错误状态名创建对应的html.比如404.html和500.html,当出现对应的错误时会自动跳转至相应的错误页面。一旦出现了错误,不能只跳转至相应的页面,最好还需要记录日志。表现层HomeController @RequestMapping(path = "/error", method = RequestMethod.GET) public String getError原创 2020-11-13 22:20:41 · 106 阅读 · 0 评论 -
3.8 发送私信
目录数据层MessageMappermessage-mapper.xml业务层MessageService表现层MessageControllerletter.htmlletter.js数据层MessageMapper //新增一个消息 int insertMessage(Message message);message-mapper.xml <sql id="insertFields"> .原创 2020-11-13 18:12:12 · 255 阅读 · 1 评论 -
3.7 私信列表-私信详情
目录数据表message实体类Message私信列表数据层MessageMappermessage-mapper.xml业务层MessageService表现层MessageControllerindex.htmlletter.html私信详情表现层MessageControllerletter.htmlletter-detail.html多次对话为一次会话数据表messageCREATE TABLE `mes...原创 2020-11-13 17:34:56 · 547 阅读 · 0 评论 -
3.5 显示评论
评论表介绍CREATE TABLE `comment` ( `id` int NOT NULL AUTO_INCREMENT, `user_id` int DEFAULT NULL, `entity_type` int DEFAULT NULL, #对帖子的评论、对评论的评论、用户 `entity_id` int DEFAULT NULL, # 具体类型的id,如果评论的是帖子,则对应的是帖子的id `target_id` int DEFAULT NULL, #记录评论的是哪...原创 2020-11-13 15:51:54 · 273 阅读 · 0 评论 -
3.4 事务管理
目录事务常见的并发异常和隔离级别Spring事务管理声明式事务编程式事务事务隔离性很值得探讨,因为这是并发编程中非常重要的一个话题。常见的并发异常和隔离级别单独看事务1,尝试去对N加1, 加1失败,所以回滚。单独看事务2,尝试将N减1,并提交成,由于事务2的回滚,事务1的更新丢失。事务2无法接受,因为事务1的提交导致自己的更新被丢失。Y表示会出现,Read Uncommited 的隔离级别相当于什么都没...原创 2020-11-13 14:50:05 · 165 阅读 · 0 评论 -
3.3 帖子详情
DiscussPostMapper.java DiscussPost selectDiscussPostById(int id);discusspost-mapper.xml文件 <select id="selectDiscussPostById" resultType="DiscussPost"> select <include refid="selectFields"></include> from ...原创 2020-11-13 13:58:37 · 316 阅读 · 0 评论 -
3.1 过滤敏感词
目录算法原理创建一个SensitiveFilter并加入spring容器进行管理(1) 定义字典树的数据结构类(静态内部类)(2) 初始化树(3) 编写将敏感词添加至前缀树的逻addKeyword(4) 实现检索的方法filter(核心)算法原理算法描述2和3开始都指向第一个字符:2(x) 、3(x) 检查1(root)的子节点中不包含3(x),x安全,记录x至StringBuilder之中,2和3继续往后走,至2(w)、3(w)。 "x"...原创 2020-11-13 11:50:02 · 220 阅读 · 0 评论 -
2.8 利用自定义注解检查登录状态
自定义注解自定义注解基于元注解。 @Target: 声明自定义的注解可以作用在什么位置?类上,还是方法上,属性上。 @Retention: 自定义注解保留的有效时间,编译器有效还是运行时有效。 @Document: 声明自定义注解在生成文档的时候,要不要把注解也带上去。 @Inherited:子类继承父类,父类有这个注解,子列是否需要继承父类的注解。 自定义注解中@Target和@Retention是必须的,另外两个是非必须的,可以省略获取注解在运行期间通过反射实现,获取方法上有没...原创 2020-11-12 12:05:01 · 235 阅读 · 0 评论 -
2.7 账号设置
1. 访问账号设置页面-新建一个UserController类@Controller@RequestMapping("/user")public class UserController implements CommunityConstant { @RequestMapping(path="/setting", method = RequestMethod.GET) public String getSettingPage(Model model){ return ...原创 2020-11-12 11:42:44 · 263 阅读 · 0 评论 -
2.6 显示登录信息
目录拦截器实例1. 在interceptor包下创建一个拦截器2. 在config包下创建一个拦截器配置类,配置需要拦截哪些请求拦截器应用-显示用户登录信息1. 捋清思路2. 创建LoginInterceptor.javaa. preHandle方法之中,保存用户数据b. 在postHandle方法之中使用保存的User对象信息c. 在afterCompletion(),模板引擎渲染完之后清除掉用户的数据2. 配置LoginInterceptor3. 页面显示用.原创 2020-11-12 10:54:43 · 331 阅读 · 0 评论