如何优雅地使用本地缓存?
【译】Apache Shiro介绍

【译】Apache Shiro介绍

一、什么是 Apache Shiro?

Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,表现在身份认证、授权、加密和会话管理,可用于保护任何应用程序,小到命令行应用程序、移动应用程序,大到 Web 和企业应用程序。

应用程序安全性的 4 个基石:

  • 身份验证 - 证明用户身份,通常称为用户“登录”
  • 授权 - 访问控制
  • 加密 - 保护或隐藏数据免遭窥探
  • 会话管理 - 每个用户的时间敏感状态
阅读更多
MySQL是如何给表加字段的?

MySQL是如何给表加字段的?

在我最近的项目中,经常会有给大表加字段的需求,这个过程非常耗时。

可以看到,900 万数据量的一张表,加一个字段就需要 3 个小时左右。

我们知道,给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。假设表数据量比较大,加字段的过程将会非常耗时。

不过我最关心的是,在加字段的过程中,会不会对业务的增删改查造成影响?在询问 DBA 后,他给出的答复是不会造成影响。这不禁让我思考这背后的实现原理。

下面,我们就来一探究竟。

阅读更多
MyBatis拦截器在实际项目中的应用

MyBatis拦截器在实际项目中的应用

MyBatis 是一个流行的 Java 持久层框架,它简化了数据库访问的复杂性,为开发者提供了强大的功能。其中,MyBatis 拦截器是一个非常有用的特性,可以帮助开发者灵活地解决各种问题。

本文将探讨 MyBatis 拦截器在实际项目中的应用场景和具体实现方法。

文中代码:https://github.com/studeyang/mybatis-interceptor-demo

阅读更多
Kafka 位移提交的正确姿势

Kafka 位移提交的正确姿势

你说你 Kafka 用了很多年了,但是位移提交的这些细节你未必清楚。

不久前有个同事出去面试了,他说在 Kafka 问题上被面试官藐视了。

阅读更多
Spring Security入门:保护Web应用

Spring Security入门:保护Web应用

本文我们将构建一个简单但完整的小型 Web 应用程序,以演示 Spring Security 的入门教程。大致逻辑是:当合法用户成功登录系统之后,浏览器会跳转到一个系统主页,并展示一些个人健康档案(HealthRecord)数据。

让我们开始吧!

阅读更多
今日算法13-剪绳子

今日算法13-剪绳子

一、题目描述

题目链接:https://leetcode.cn/problems/jian-sheng-zi-lcof/

难易程度:中等

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n 都是整数,n > 1 并且 m > 1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18。

1
2
3
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
阅读更多
程序员的修炼-知识与体系

程序员的修炼-知识与体系

本文来自我最近正在学习的课程,极客时间胡峰的专栏文章《程序员进阶攻略》,内容如下。

今年年初,我学习了梁宁的《产品思维》课,其中有一篇叫《点线面体的战略选择》,我觉得特别有感触。虽然是讲产品,但假如把个人的成长当成产品演进一样来发展,会有一种异曲同工、殊途同归之感。

在我工作的经历中就曾碰到过这么一个人,他一开始做了几年开发,从前端到后端,后来又转做测试,接触的“点”倒是不少,但却没能连接起来形成自己的体系,那他个人最大的价值就局限在最后所在的“点”上了。

其实个人的成长有很多方面,但对于程序员的成长最重要的就是知识体系的构建,这其实就是一个 “点线面体” 的演进过程。

下面我会结合自己的成长路线来梳理下这个体系的建立过程。

阅读更多
今日算法12-矩阵中的路径

今日算法12-矩阵中的路径

一、题目描述

题目链接:https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/

难易程度:中等

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。

示例:

1
2
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
阅读更多
今日算法11-旋转数组的最小数字

今日算法11-旋转数组的最小数字

一、题目描述

题目链接:https://leetcode.cn/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof

难易程度:简单

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。

注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]] 。

1
2
3
4
5
6
7
示例1:
输入:numbers = [3,4,5,1,2]
输出:1

示例2:
输入:numbers = [2,2,2,0,1]
输出:0
阅读更多