- 博客(51)
- 收藏
- 关注
原创 后端面试题整理-1
int 是基本数据类型,它在内存中的存储效率较高,适用于大量需要整数运算的情况,当需要在面向对象的环境中处理整数值时,可以使用 Integer 包装类。在 Java 中,Object 类中的 equals() 方法默认实现就是比较两个对象的内存地址是否相等,因此需要在具体类中重写 equals() 方法来实现逻辑上的相等判断。在比较基本数据类型时,使用==比较的是它们的值是否相等。在 Java 中,== 和 equals() 都是比较对象是否相等的方法,但它们的实现方式和比较的含义不同。
2024-03-05 19:12:35 1016
原创 CDN是什么?CDN能为我们做什么?
CDN,全称为 Content Delivery Network,意为内容分发网络,是一种通过在全球各地部署服务器节点来加速内容传输的网络架构。
2024-03-05 18:56:19 1025
原创 CopyUtil对象复制工具类
CopyUtil是一个通用的对象复制工具类,其中包含单体复制和列表复制两个方法。单体复制方法copy通过传入源对象和目标class,利用Java反射机制创建目标对象,并将源对象的属性值复制到目标对象中。若源对象为空,则返回null。若创建目标对象失败,则返回null。列表复制方法copyList通过遍历源列表中的每个对象,调用单体复制方法copy完成每个对象的复制,将复制后的对象添加到新的列表中。若源列表为空,则返回空列表。在这个实现中,使用了开源框架BeanUtils的copyProperties方
2024-03-04 16:59:31 1376
原创 基于 Redis 的 JWT令牌失效方案
当用户登录状态到登出状态时,对应的JWT的令牌需要设置为失效状态,这时可以使用基于 Redis 的黑名单方案来实现JWT令牌失效。
2024-03-04 16:47:39 1484
原创 Spring 事务失效的场景
Spring 事务失效指在使用 Spring 进行事务管理时,事务没有被正确地提交或回滚所致的问题。可能是因为代码中未正确地配置事务管理器或者事务注解的使用不正确所导致的。如果事务失效,则数据库操作可能未能正确地更新或回滚,可能会造成不可预知的结果,从而影响系统的稳定性和一致性。
2024-03-03 21:21:52 1010
原创 【Java】Java 中的方法引用写法
方法引用(MethodReference)是Lambda表达式的另一种格式,在某些场景下可以提高代码的可读性。
2024-03-03 21:07:03 1050
原创 【Redis】RedisTemplate和StringRedisTemplate的区别
RedisTemplate 看这个类的名字后缀是 Template ,如果了解过 Spring 如何连接关系型数据库的,大概不会难猜出这个类是做什么的 ,它跟 JdbcTemplate 一样封装了对Redis的一些常用的操作,当然 StringRedisTemplate 跟 RedisTemplate 功能类似那么肯定就会有人问,为什么会需要两个Template呢,一个不就够了吗?,如果需要自定义序列化配置,可以自己写一个 RedisTemplate 的Bean,来完成配置。那么就可以得出一个结论,
2024-02-29 10:24:12 2363
原创 【Redis】Redis 实现分布式Session
Cookie 保存在客户端浏览器中,而 Session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 Session。客户端浏览器再次访问时只需要从该 Session 中查找该客户的状态就可以了。在实际工作中我们建议使用外部的缓存设备来共享 Session,避免单个服务器节点挂掉而影响服务,共享数据都会放到外部缓存容器中。
2024-02-29 10:15:10 1115
原创 【Redis】什么是缓存雪崩,如何预防缓存雪崩?
如果缓存集中在一段时间内失效,也就是通常所说的热点数据集中失效 (一般都会给缓存设定一个失效时间,过了失效时间后,该数据库会被缓存直接删除,从而一定程度上保证数据的实时性),发生大量的缓存穿透,造成大量的查询要查询数据库,这就造成了缓存雪崩,可能会导致数据库崩溃。如果缓存中间件宕机,当然可以对缓存中间件做高可用集群来避免。
2023-08-19 23:44:09 828
原创 【Redis】什么是缓存击穿,如何预防缓存击穿?
缓存击穿是指一个 Key 非常热点,大并发集中对这一个点进行访问,当这个Key 在失效的瞬间,持续的大并发就会穿破缓存,直接请求数据库。缓存击穿和缓存雪崩的区别在于,缓存击穿是针对某一个 Key缓存而言,缓存雪崩则是很多 Key。一般的网站很难有某个数据达到缓存击穿的级别,一般是热门网站的秒杀或爆款商品,才有可能发生这种情况。当然,这时把这种商品设置成永不过期或者过期时间超过抢购时段是一种很好的避免发生缓存击穿的方式,前提是这时应用系统不需要考虑数据可能的不一致性问题。
2023-08-19 23:43:29 640
原创 【Redis】什么是缓存穿透,如何预防缓存穿透?
但这样做有一定的弊端,就是当这个查询有数据时,在一定时间内得到的结果仍然是空,所以这个空结果的数据它的过期时间应该要设置得短一些,让它能得到自动剔除;空值缓存,也就保存了更多的键值,消耗了更多的内存空间,如果是外部攻击大量的空值缓存,会消耗掉所有的内存空间,导致系统崩溃。缓存穿透是指查询一个一定不存在的数据,由于缓存中不存在,这时会去数据库查询查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,这就造成缓存穿透。简单来说,就是访问业务系统不存在的数据,就可能会造成缓存穿透。
2023-08-19 23:41:34 1020
原创 【Redis】Redis中的布隆过滤器
布隆过滤器的原理其实非常简单,就是bitmap + 多重hash,主要优势就是利用非常小的空间就可以实现在大规模数据下快速判断某一对象是否存在,缺点是存在误判的可能,但不会漏判,也就是存在的对象一定会判断为存在,而不存在的对象会有较低的概率为误判为存在,且不支持对象的删除,因为会增加误判的概率。最典型的使用是解决缓存穿透的问题。
2023-08-19 22:54:36 554
原创 【Redis】Redisson分布式锁原理与使用
Redisson - 是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象,Redisson、Jedis、Lettuce 是三个不同的操作 Redis 的客户端,Jedis、Lettuce 的 API 更侧重对 Reids 数据库的 CRUD(增删改查),而 Redisson API 侧重于分布式开发。GitHub地址:https://github.com/redisson/redissonre。
2023-08-19 22:20:38 584
原创 【Redis】Redis分布式锁
分布式应用进行逻辑处理时经常会遇到并发问题。如果一个操作要修改用户的状态。修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行,就会出现并发问题,因为“读取”和“保存状态”这两个操作不是原子操作。。这个时候就要使用到分布式锁来限制程序的并发执行。Redis 分布式锁使用得非常广泛,它是面试的重要考点之一,很多同学都知道这个知识,也大致知道分布式锁的原理,但是具体到细节的掌握上,往往并不完全正确。
2023-08-18 22:56:57 395
原创 【Redis】Redis哨兵模式
Redis 可以存在多台服务器,并且实现了主从复制的功能。哨兵模式是一种特殊的模式,在 Redis 中哨兵是一个独立的进程。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例是否可以正常工作,如下图所示。通过发送命令,让 Redis 服务器返回其运行状态,包括主服务器和从服务器。当哨兵监测到主机出现故障后,会自动将其中一台从服务器切换成主服务器,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换新的主服务器。
2023-08-18 22:21:47 623
原创 【Redis】Redis 的主从同步
很多企业都没有使用 Redis 的集群,但是至少都做了主从。有了主从,当主节点(Master) 挂掉的时候,运维让从节点 (Slave) 过来接管,服务就可以继续,否则主节点需要经过数据恢复和重启的过程,这就可能会拖延很长的时间,从而影响线上业务的持续服务。尽管 Redis 的性能很好,但是有时候依旧满足不了应用的需要,比如过多的用户进入主页.导致 Redis 被频繁访问,此时就存在大量的读操作。
2023-08-18 00:22:57 2396
原创 【Redis】Redis的持久化(备份)
Redis的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制。
2023-08-16 23:30:38 908
原创 【Redis】Redis中大key怎么处理?
有时候会因为业务人员使用不当,在 Redis 实例中形成了很大的对象,比如一个很大的 hash 或一个很大的zset,都是可能出现的。这样的对象给 Redis 的集群数据迁移带来了很大的问题,因为在集群环境下,如果某个 key 太大,会导致数据迁移卡顿。另外在内存分配上,如果一个 key 太大,那么当它需要扩容时,会一次性申请更大的一块内存,这也会导致卡顿。如果这个大 key 被删除,内存会被一次性回收,卡顿现象也会再次产生。
2023-08-15 00:10:26 692
原创 MyBatis快速入门
实体类属性名和数据库表列名不一致,不能自动封装数据(1)起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样1*可以定义片段,提升复用性(2)resultMap : 定义完成不一致的属性名和列名的映射(1)#{} : 执行SQL时,会将#占位符替换为?,将来自动设置参数值(2)${} : 拼SQL,会存在sQL注入问题(1)用于设置参数类型,该参数可以省略(1)转义字符(2)<![CDATA[内容]I>SQL语句设置多个参数有几种方式?
2023-08-06 17:37:17 186
原创 Spring 非自定义Bean注解
在xml中配置的Bean都是自己定义的, 例如:UserDaolmpl,UserServicelmpl。但是,在实际开发中有些功能类并不是我们自己定义的, 而是使用的第三方jar包中的,那么,这些Bean要想让Spring进行管理,也需要对其进行配置配置非自定义的Bean需要考虑如下两个问题:- 被配置的Bean的实例化方式是什么?无参构造、有参构造、静态工厂方式还是实例工厂方式;- 被配置的Bean是否需要注入必要属性。
2023-08-04 22:54:18 740
原创 详解Spring事务
事务(Transaction)是指在编程中一系列操作组成的单个逻辑工作单元,要么全部执行成功,要么全部失败回滚,保证数据的一致性、完整性和安全性
2023-08-03 22:31:43 283
原创 详解Spring Bean的生命周期
对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,便实例化所有的bean。容器通过获取BeanDefinition对象中的信息进行实例化。并且这一步仅仅是简单的实例化,并未进行依赖注入。实例化对象被包装在BeanWrapper对象中,BeanWrapper提供了设置对象属性的接口,从而避免了使用反射机制设置属性。
2023-08-03 19:30:53 1651
原创 如何使用RestTemplate测试接口
RestTemplate是一个执行HTTP请求的同步客户端,在诸如JDK的HttpURLConnection,Apache的HttpComponents等底层HTTP客户端上刚开一个简单的模板方法API。
2023-08-02 23:27:43 244
原创 SpringMVC中Model和ModelAndView的区别
虽然Model和ModelAndView都可以用于将数据传递到视图层,但ModelAndView更加强大,因为它不仅可以传递数据,还可以指定要呈现的视图。如果你只需要传递数据而不关心视图,则可以使用Model。但如果你需要同时传递数据和指定视图,则应该使用ModelAndView。
2023-08-02 22:25:47 325
原创 Java中DAO层、Service层和Controller层的区别
DAO层:DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,建议DAO只做原子操作,增删改查。Dao层主要做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。Service层:Service层叫服务层,被称为服务,粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事物控制。Servi
2022-02-01 08:50:41 765
原创 @Controller、@Service和@Repository注解详解
@Repository和@Controller、@Service、@Component的作用差不多,都是把对象交给spring管理。1. @Controller控制层@Controller用于标记在一个类上,使用它标记的类就是一个SpringMvc Controller对象,分发处理器会扫描使用该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。@Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是处理请求的处理器。@Controll
2022-02-01 08:45:44 2994
原创 什么是URL?
什么是URL?URL是指统一资源定位符任何一个URL都包括:协议+IP地址+端口号port+资源名http://192.168.100.2:8888/abc协议:是一个提前规定好的数据传输格式。通信协议有很多:http、https…,在传送数据之前,提前先商量好数据传送的格式。这样对方接收到数据之后,就会按照这个格式去解析,拿到有价值的数据。IP地址:网络当中定位某台计算机的。PORT端口号:定位这台计算机上某个服务的。资源名:这个服务下的某个资源。jdbc:mys
2022-01-29 00:21:13 85
原创 JDBC入门案例
1、什么是JDBC?Java DataBase Connectivity 在Java语言中编写Sql语句,对Mysql数据库中的数据进行CRUD操作。2、JDBC相关的类库在哪里?java.sql.*3、JDBC本质上是一堆什么呢?java.sql.包下都是JDBC的接口,SUN公司制定的,JDBC是体现“接口作用”的非常经典的例子。JDBC降低了耦合度,提高了扩展力。对于java程序员来说,不需要关心数据库是哪个品牌。只要面向JDBC接口编程就行!JDBC整个程序的结构当中有三
2022-01-29 00:17:31 135
原创 【数据结构】【C语言】 栈的应用之进制转换
进制转换使用的方法是短除法短除法图示:原理: 图中9是待转换数,将9与2相除,得到的余数依次入栈,当待转换数9被除为0时,将栈中的余数依次出栈,即得到9的二进制形式:1001代码示例:#include<stdio.h>#include<stdlib.h>#define MAXSTACK 50 //栈的最大容量//结构体的定义——>栈的属性struct myStack{ int* stackMemory; //以栈中存储的数据是整数为例 i.
2021-09-08 19:21:31 4741
原创 【数据结构】【C语言】 栈和队列知识点+笔记
队列的定义:队列也是一种线性表,逻辑结构与线性表相同,为一对一结构,分为顺序队列和链式队列。队列只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。栈的定义:栈是一种线性表,限定仅在表尾进行插入和删除操作的线性表,表尾又称为栈顶。逻辑结构与线性表相同,也为一对一结构。线性表分为顺序表和链表,同样的栈也可以分为顺序栈和链栈。顺序栈和链栈的区别:顺序栈的实现在于使用了数组这个基
2021-09-07 21:56:08 86
原创 【SQL】SQL做题笔记
SQL2 查找入职员工时间排名倒数第三的员工所有信息Tips:LIMIT m,n : 表示从第m+1条开始,取n条数据;LIMIT n : 表示从第0条开始,取n条数据,是limit(0,n)的缩写。SQL5 查找所有员工的last_name和first_name以及对应部门编号Tips:INNER JOIN 两边表同时有对应的数据,即任何一边缺失数据就不显示。LEFT JOIN会读取左边数据表的全部数据,即便右边表无对应数据。RIGHT JOIN 会读取右边数据表的全部数据,即便左边
2021-09-07 21:48:16 74
原创 【SQL】SQL语句及其功能
SQL SELECT TOP 子句在 Microsoft SQL Server 中还可以使用百分比作为参数。下面的 SQL 语句从 websites 表中选取前面百分之 50 的记录:SELECT TOP 50 PERCENT * FROM Websites;变相返回后 N 行:–前5行select top 5 * from table–后5行select top 5 * from table order by id desc --desc 表示降序排列 asc 表示升序SQL I
2021-09-07 21:08:56 126
原创 【数据结构】【C语言】 链表知识点+笔记
1. 内存4区代码区:函数代码,存放在代码区,函数名就是这个函数的地址全局区:全局的变量,字符串常量栈区:系统开辟和释放堆区:用户决定要开辟多大内存?装什么数据?使用完后还要不要继续使用? 用户自己需要决定开辟和释放内存示意图:#include<stdlib.h> Int *p; P=(int *)molloc(size); //在堆区开辟size个字节的内存 //指针p指向这段内存 //用molloc去开辟的内存不会自动释放,需要手动释放 Free(p)
2021-08-22 23:30:39 173
原创 C语言程序设计练习(一)(HDU 2000-2007)
**题目网址:**http://acm.hdu.edu.cn/search.php?field=problem&key=C%D3%EF%D1%D4%B3%CC%D0%F2%C9%E8%BC%C6%C1%B7%CF%B0%A3%A8%D2%BB%A3%A9&source=1&searchmode=sourceASCII码排序(HDU 2000)AC代码://ASCII排序 #include<stdio.h>int main(){ char a,b,c,t;
2021-03-22 21:50:35 142
原创 OJ 3177:判断素数个数 (C语言)
先来看一下题目:题目链接:AC代码:#include <stdio.h> void swap(int *a, int *b) //x,y交换顺序 { int t; t = *a; *a = *b; *b = t;} int isprime(int n) //判断n是否为素 { int i; for(i=3; i*i<=n; i+=2) { if(n % i == 0) {
2021-02-13 06:26:13 474
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人