面试题学习以及问题

news2025/1/18 10:07:32

redis

redis缓存 

缓存穿透

布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是 redisson实现的布隆过滤器。 它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一 开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据 的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一 个key的存在。查找的过程也是一样的。

当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置 这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增 加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能 接受,不至于高并发下压倒数据库。

 缓存雪崩

双写一致 

 强一致性:读写锁

 异步通知:

数据持久化 

数据过期策略 

 redis的过期策略是惰性删除和定期删除配合使用

 

 数据淘汰策略

 

 分布式锁

 

 

 

 

 主从复制

 

 

 

主从复制原理 

 

 

 哨兵模式

 

 

 

redis是单线程快的原因 

 

 

 

 redis业务场景自我整理

spring

考察范围

spring框架中的单列bean是线程安全的码 

 

spring AOP详解 

 

 结果输出:

 

 

 

 spring事务失效的原因

只有代理的类才会被切入,我们在controller层调用service的方法的时候,是可以被切入的,但是如果我们在service层 A方法中,调用B方法,切点切的是B方法,那么这时候是不会切入的,解决办法就是如上所示,在A方法中使用((Service)AopContext.currentProxy()).B() 来调用B方法,这样一来,就能切入了!

 

 

 

 

 

 

描述时可以加上应用场景,什么时候出现过事务失效 

package com.hmdp.service.impl;

import com.hmdp.dto.Result;
import com.hmdp.entity.SeckillVoucher;
import com.hmdp.entity.VoucherOrder;
import com.hmdp.mapper.VoucherOrderMapper;
import com.hmdp.service.ISeckillVoucherService;
import com.hmdp.service.IVoucherOrderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.utils.RedisIdWorker;
import com.hmdp.utils.UserHolder;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Collections;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Service
public class VoucherOrderServiceImpl extends ServiceImpl<VoucherOrderMapper, VoucherOrder> implements IVoucherOrderService {

    @Autowired
    private ISeckillVoucherService seckillVoucherService;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedissonClient redissonClient;

    private static final DefaultRedisScript<Long> SECKILL_SCRIPT;

    static {
        SECKILL_SCRIPT = new DefaultRedisScript<>();
        SECKILL_SCRIPT.setLocation(new ClassPathResource("seckill.lua"));
        SECKILL_SCRIPT.setResultType(Long.class);
    }

    @Override
    public Result seckillVoucher(Long voucherId) {
//        //查询秒杀时间
//        SeckillVoucher seckillVoucher = seckillVoucherService.getById(voucherId);
//        if (seckillVoucher==null){
//            return Result.fail("秒杀商品不存在");
//        }
//        if (seckillVoucher.getBeginTime().isAfter(LocalDateTime.now())){
//            return Result.fail("秒杀未开始");
//        }
//        if (seckillVoucher.getEndTime().isBefore(LocalDateTime.now())){
//            return Result.fail("秒杀已结束");
//        }
//        if (seckillVoucher.getStock()<1){
//            return Result.fail("库存不足");
//        }
//        Long userId = UserHolder.getUser().getId();
//        //加锁:单机下使用synchronized
        synchronized (userId.toString().intern()) {
        RedisLock redisLock=new RedisLock("order:"+userId,stringRedisTemplate);
        redisClient.getL
//        RLock lock = redissonClient.getLock("order:" + userId);
//        boolean b = lock.tryLock();
//        if (!b){
//            return Result.fail("每个用户只能购买一次");
//        }
//        //交给spring后实现事务
//        try {
//            IVoucherOrderService proxy = (IVoucherOrderService)AopContext.currentProxy();
//            return proxy.createOrder(voucherId);
//        } finally {
//            lock.unlock();
//        }
        Long userId = UserHolder.getUser().getId();
        Long redult = stringRedisTemplate.execute(SECKILL_SCRIPT,
                Collections.emptyList(),
                voucherId.toString(), userId.toString());
        int r = redult.intValue();
        if (r != 0) {
            return Result.fail(r == 1 ? "库存不足" : "不能重复下单");
        }
        RedisIdWorker redisIdWorker = new RedisIdWorker(stringRedisTemplate);

        long orderId = redisIdWorker.nextId("order");

        return Result.ok(0);
    }

    @Transactional
    public Result createOrder(Long voucherId) {
        RedisIdWorker redisIdWorker = new RedisIdWorker(stringRedisTemplate);
        long orderId = redisIdWorker.nextId("order");
        Long userId = UserHolder.getUser().getId();
        //实现一人一单
        Integer count = query().eq("user_id", userId)
                .eq("voucher_id", voucherId).select().count();
        if (count > 0) {
            return Result.fail("用户已经购买过一次了");
        }
        //扣减库存
        boolean b = seckillVoucherService.update()
                .setSql("stock=stock-1")
                .eq("voucher_id", voucherId)
                .gt("stock", 0)
                .update();
        if (!b) {
            return Result.fail("秒杀失败");
        }
        //添加订单信息
        VoucherOrder voucherOrder = new VoucherOrder();
        voucherOrder.setUserId(userId);
        voucherOrder.setVoucherId(voucherId);
        voucherOrder.setId(orderId);
        save(voucherOrder);
        return Result.ok(orderId);
    }
}

 spring中Bean的生命周期

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {

    public User() {
        System.out.println("User的构造方法执行了.........");
    }

    private String name ;

    @Value("张三")
    public void setName(String name) {
        System.out.println("setName方法执行了.........");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("setBeanName方法执行了.........");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("setBeanFactory方法执行了.........");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("setApplicationContext方法执行了........");
    }

    @PostConstruct
    public void init() {
        System.out.println("init方法执行了.................");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet方法执行了........");
    }

    @PreDestroy
    public void destory() {
        System.out.println("destory方法执行了...............");
    }

}

 

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("postProcessBeforeInitialization方法执行了->user对象初始化方法前开始增强....");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            System.out.println("postProcessAfterInitialization->user对象初始化方法后开始增强....");
            //cglib代理对象
            Enhancer enhancer = new Enhancer();
            //设置需要增强的类
            enhancer.setSuperclass(bean.getClass());
            //执行回调方法,增强方法
            enhancer.setCallback(new InvocationHandler() {
                @Override
                public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                    //执行目标方法
                    return method.invoke(method,objects);
                }
            });
            //创建代理对象
            return enhancer.create();
        }
        return bean;
    }

}

 输出结果:

User的构造方法执行了.........
setName方法执行了.........
setBeanName方法执行了.........
setBeanFactory方法执行了.........
setApplicationContext方法执行了........
postProcessBeforeInitialization方法执行了->user对象初始化方法前开始增强....
init方法执行了.................
afterPropertiesSet方法执行了........
postProcessAfterInitialization->user对象初始化方法后开始增强....
User的构造方法执行了.........
public java.lang.String java.lang.Object.toString()

 spring循环依赖

 

 

 

 

 

 spring MVC请求

 

 

 

 springboot自动配置

 

 

spring常见的注解 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#--调用Python(包含第三方库)

1. C# 调用 Python 常见的方法有4种 参考链接 1.1 Pythonnet &#xff08;推荐&#xff09; 可以很好的支持第三方库。 推荐这个&#xff0c;经本人验证这个很好用。 后文 2. 详细使用。 1.2 IronPython 如果使用第三方库就放弃这个吧&#xff0c;真的用不了&#xff0c;使…

大规模向量检索库Faiss学习总结记录

因为最近要使用到faiss来做检索和查询&#xff0c;所以这里只好抽出点时间来学习下&#xff0c;本文主要是自己最近学习的记录&#xff0c;来源于网络资料查询总结&#xff0c;仅用作个人学习总结记录。 Faiss的全称是Facebook AI Similarity Search&#xff0c;是FaceBook的A…

【C语言进阶篇】结构体都学完了,那么现造第一个通讯录呢?(内附源码)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言一 、 通讯录的简介1.1 联系人的类型定义1.2 通讯录的定义1.3 通讯录要实现的功能 二 、 如何…

Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

技术背景 我们在Android平台实现GB28181设备接入&#xff0c;把摄像头和麦克风数据&#xff0c;采集过去&#xff0c;用于移动单兵、智能车载、智慧安防、智能家居、工业仿真等行业时&#xff0c;发现大多场景对视频水印的要求越来越高&#xff0c;从之前的固定位置静态文字水…

Python(六十)字典的创建

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Kubernetes——理论基础

Kubernetes——理论基础 一、Kubernetes 概述1.K8S 是什么&#xff1f;2.为什么要用 K8S?3.Kubernetes 主要功能 二、Kubernetes 集群架构与组件三、Master 组件1.Kube-apiserver2.Kube-controller-manager3.Kube-scheduler4.配置存储中心——etcd 四、Node 组件1.Kubelet2.Ku…

城市供水管网水力模型的基本概念及理论

1.1引言 城市供水管网系统由大量管材各异、管径各异、铺设年代各异的管道&#xff0c;泵站&#xff0c;阀门&#xff0c; 水塔等多元素构成&#xff0c;因此决定了供水管网系统是一个拓扑结构庞杂、运行工况多变的巨系统。以前国内供水公司对铺设在地面以下的供水管网多以经验…

HCIP的mgre实验

题目 拓扑图 IP地址配置和缺省 R1 [r1]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 Aug 2 2023 20:38:20-08:00 r1 %%01IFNET/4/LINK_STATE(l)[0]:The line protocol IP on the interface GigabitEthernet0/0/1 has entered the UP state. [r1-GigabitEtherne…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

云环境中使用飞蛾火焰和萨尔普群算法组合的工作流调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

AcWing 202. 最幸运的数字

AcWing 202. 最幸运的数字 思路&#xff1a; Code: #include<bits/stdc.h> using namespace std; typedef long long LL; int gcd(LL n,int m) {return m?gcd(m,n%m):n; } LL get_euler(LL x) { //求欧拉函数LL resx;for(int i2;i<x/i;i) {if(x%i0) {while(x%i0)…

经典CNN(三):DenseNet算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 前言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为最主流的方法&#xff0c;比如GoogleNet&#xff0c;…

结算功能实现(小兔鲜儿)【Vue3】

退出登录 - 清空购物车列表 业务需求 在用户退出登录时,除了清除用户信息之外,也需要把购物车数据清空 // 清除购物车const clearCart () > {cartList.value []}// 退出时清除用户信息const clearUserInfo () > {userInfo.value {}// 执行清除购物车的actioncartS…

2023年攻防演练利器之必修高危漏洞合集(包含详细修复建议)

2023年攻防演练利器之必修高危漏洞合集&#xff08;包含详细修复建议&#xff09; 下载地址见盘&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WeCC7oXFieDs4tBOh7bmWA?pwd12u4 提取码&#xff1a;12u4

PyTorch 中的累积梯度

https://stackoverflow.com/questions/62067400/understanding-accumulated-gradients-in-pytorch 有一个小的计算图&#xff0c;两次前向梯度累积的结果&#xff0c;可以看到梯度是严格相等的。 代码&#xff1a; import numpy as np import torchclass ExampleLinear(torch…

MongoDB文档--基本安装-linux安装(mongodb环境搭建)-docker安装(挂载数据卷)-以及详细版本对比

阿丹&#xff1a; 前面了解了mongodb的一些基本概念。本节文章对安装mongodb进行讲解以及汇总。 官网教程如下&#xff1a; 安装 MongoDB - MongoDB-CN-Manual 版本特性 下面是各个版本的选择请在安装以及选择版本的时候参考一下&#xff1a; MongoDB 2.x 版本&#xff1a…

TensorRT学习笔记--基于YoloV8检测图片和视频

1--完整项目 完整项目地址&#xff1a;https://github.com/liujf69/TensorRT-Demo git clone https://github.com/liujf69/TensorRT-Demo.gitcd TRT_YoloV8 2--模型转换 cd yolov8python gen_wts.py 3--编译项目 mkdir buildcd build cmake .. # 需要更改 CMakeLists.txt…

postgresSQL Extended Query执行过程和sharding-proxy的处理

pg Extended Query PostgreSQL: Documentation: 15: 55.2. Message Flow 多个阶段&#xff0c;可复用 Parse → DESCRIBE statement → SYNC Parse 解析&#xff0c; 将 sql 文本字符串&#xff0c;解析成 named preparedStatement 语句&#xff08;生命周期随session&#x…

数据安全能力框架模型-详细解读(一)

8月30日&#xff0c;奇安信集团正式发布“数据安全能力框架”&#xff0c;以及“数据安全概念运行图”&#xff08;数据安全ConOps&#xff09;&#xff0c;旨在为数字化转型不断深入的大型政企客户以及业内伙伴&#xff0c;提供基于甲方视角的数据安全全面图景&#xff0c;以及…

GESP2023年6月C++一级客观题

一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 以下不属于计算机输出设备的有&#xff08; &#xff09;。 A. 麦克风 B. 音箱 C. 打印机 D. 显示器 ChatGPT 是 OpenAI 研发的聊天机器人程序&#xff0c;它能通过理解和学习人类的语言 来进行对话&#xf…