优化------聊聊缓存

目录

1.创建仓库

2.提交到远程仓库

3.创建分支

4.环境配置

5.缓存

1.短信验证码缓存

2.数据缓存

1.对数据进行缓存

2.清除缓存

6.合并分支

方法一:使用git命令合并

方法二:

7.qq邮箱实现验证码的发送

1.在qq邮箱开启POP3/SMTP服务

2.添加邮箱依赖

3.创建发送邮箱工具类

4.创建随机生成验证码的工具类

5.创建IndexController

6.简单的view

7.简单的测试页面login.html

8.最近总结


对数据进行缓存,降低数据库被查询的压力

在高并发的情况下,频繁查询数据库会导致系统性能下降,服务端响应时间增长,所以需要对方法进行优化,提高系统的性能。

下面关于git分支类的大家可以直接省略

1.创建仓库

码云:Gitee - 基于 Git 的代码托管和研发协作平台

优化------聊聊缓存_第1张图片

2.提交到远程仓库

  • 来到本地仓库

优化------聊聊缓存_第2张图片

  •  选择要提交的项目即可
  • 先看一下要提交的项目有没有.gitignore文件
  • 没有的话在git添加一个
  • 这个是我的:
.git
logs
rebel.xml
target/
!.mvn/wrapper/maven-wrapper.jar
log.path_IS_UNDEFINED
.DS_Store
offline_user.md

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
generatorConfig.xml

### nacos ###
third-party/nacos/derby.log
third-party/nacos/data/
third-party/nacos/work/

file/

因为项目git初始化之后源码文件会都变成红色,所以在根目录右键点击添加(如下) 

之后进行正常的commit和push就OK了,详解见提交到远程仓库_雾喔的博客-CSDN博客_提交到远程仓库 

刷新码云仓库界面,就可以看到项目成功提交上去了。

3.创建分支

  • 因为项目优化是在分支上做的,所以最后优化完成之后会将分支合并到主分支上
  • 右键
  • 或者点击idea右下角

 优化------聊聊缓存_第3张图片

  • 就可以新建一个分支了
  • 之后再将分支push上去就OK啦
  • 刷新页面会看到

 优化------聊聊缓存_第4张图片

4.环境配置

导入依赖:

        
            org.springframework.boot
            spring-boot-starter-data-redis
            2.7.5
        

 大家可以去maven仓库找最新版本

https://mvnrepository.com/

  • 在项目的application.yml中加入redis相关配置:
spring:
  redis:
    host: ip地址(本地的话就是localhost)
    port: 6379(端口号)
    password: redis密码
    database: redis仓库
  • 在config下新建一个配置类
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author a1002
 */
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }
}

5.缓存

1.短信验证码缓存

  • 发送手机验证码的controller层
  • 注入RedisTemplate
  •     @Autowired
        private RedisTemplate redisTemplate;

    发送验证码的接口:

  • //将生成的验证码缓存到redis,并且设置有效期为五分钟
                redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);

  • 验证码有效期为五分钟,所以为

    TimeUnit.MINUTES

优化------聊聊缓存_第5张图片

 在登录接口加上:

//从redis获取缓存的验证码
Object codeInSession = redisTemplate.opsForValue().get(phone);

如果登录成功:

            //如果用户登录成功,删除redis中缓存的验证码
            redisTemplate.delete(phone);

2.数据缓存

对数据进行缓存,降低数据库被查询的压力,有数据被执行save或update方法时要清理缓存。

在使用缓存过程中,要注意保证数据库中的数据和缓存中的数据一致,如果数据库中的数据发生变化,需要及时清理缓存。

1.对数据进行缓存

在查询数据库中数据的接口加上(Get):

        List dishDtoList = null;

        String key = "dish_" + dish.getCategoryId() + "_" + dish.getStatus();

        //先从redis中获取数据
        dishDtoList = (List) redisTemplate.opsForValue().get(key);

        if (dishDtoList != null) {
            //如果存在,无需再查询数据库
            return R.success(dishDtoList);
        }

下面的步骤是正常的从数据库查询数据

在方法最后面加上:

        //如果不存在,需要查询数据库,将查询到的数据缓存到Redis中
        redisTemplate.opsForValue().set(key, dishDtoList, 60, TimeUnit.MINUTES);

设置的有效时间为一个小时。

2.清除缓存

在使用缓存过程中,要注意保证数据库中的数据和缓存中的数据一致,如果数据库中的数据发生变化,需要及时清理缓存数据。

方法一:

清除所有的同类缓存

//清理所有的菜品的缓存数据
Set keys=redisTemplate.keys("dish_*");
redisTemplate.delete(keys);

方法二:

精确清理某个分类下的菜品缓存

String key="dish_"+dishDto.getCategoryId()+"_1";
redisTemplate.delete(key);

关于缓存的进一步了解的话大家可以去了解一下Spring Cache

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单的加一个注解,就能实现缓存功能。

spring cache提供了一层抽象,底层可以切换不同的cache实现,具体就是通过CacheManager接口来统一不同的缓存技术。

6.合并分支

合并分支之前需要保证分支没有问题

方法一:使用git命令合并

  • 优化------聊聊缓存_第6张图片 切换到master分支上
git checkout master
  • 确保master代码是最新的代码
git pull origin master
  • 然后我们把v1.0分支的代码合并到master上
git merge v1.0
  • 然后查看状态及执行提交命令
git status

方法二:

  • 点击右下角

优化------聊聊缓存_第7张图片

  • 切换到master
  • 拉取项目 

 时把v1.0分支选上

  • 合并分支后也就是把分支的更新存到了本地仓库,还需要将master push到远程仓库
  • 点击push
  • 参考:项目优化Day1-09-Spring Cache_框架介绍&常用注释_哔哩哔哩_bilibili

---------------------------------------------------------------------------------------------------------------------------------

 --------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------我是可爱的分割线--------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

 --------------------------------------------------------------------------------------------------------------------------------

7.qq邮箱实现验证码的发送

1.在qq邮箱开启POP3/SMTP服务

QQ邮箱

优化------聊聊缓存_第8张图片

 按照指示操作获取授权码

2.添加邮箱依赖

        
            org.springframework.boot
            spring-boot-starter-mail
            2.7.4
        

这个是大致目录:

优化------聊聊缓存_第9张图片

3.创建发送邮箱工具类


import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;


public class MailUtils {
    //发送第二封验证码邮件
    public static void sendMail(String to, String vcode) throws Exception {

        //设置发送邮件的主机  smtp.qq.com
        String host = "smtp.qq.com";

        //1.创建连接对象,连接到邮箱服务器
        Properties props = System.getProperties();

        //Properties 用来设置服务器地址,主机名 。。 可以省略

        //设置邮件服务器
        props.setProperty("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");

        //SSL加密
        MailSSLSocketFactory sf = new MailSSLSocketFactory();

        sf.setTrustAllHosts(true);

        props.put("mail.smtp.ssl.enable", "true");

        props.put("mail.smtp.ssl.socketFactory", sf);

        //props:用来设置服务器地址,主机名;Authenticator:认证信息

        Session session = Session.getDefaultInstance(props, new Authenticator() {

            @Override

            //通过密码认证信息

            protected PasswordAuthentication getPasswordAuthentication() {

                //new PasswordAuthentication(用户名, password);

                //这个用户名密码就可以登录到邮箱服务器了,用它给别人发送邮件

                return new PasswordAuthentication("[email protected]", "thklbwsdgtkpdghb");

            }

        });

        try {

            Message message = new MimeMessage(session);

            //2.1设置发件人:

            message.setFrom(new InternetAddress("[email protected]"));

            //2.2设置收件人 这个TO就是收件人

            message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));

            //2.3邮件的主题

            message.setSubject("来自黑客星球网站验证码邮件");

            //2.4设置邮件的正文 第一个参数是邮件的正文内容 第二个参数是:是文本还是html的连接

            message.setContent("

来自黑客星球的网站验证码邮件,请接收你的成神验证码:

你的验证码是:" + vcode + ",请妥善保管好你的验证码!

", "text/html;charset=UTF-8"); //3.发送一封激活邮件 Transport.send(message); } catch (MessagingException mex) { mex.printStackTrace(); } } }

4.创建随机生成验证码的工具类

import java.util.Random;

/**
 * 随机生成验证码工具类
 *
 * @author a1002
 */
public class ValidateCodeUtils {
    /**
     * 随机生成验证码
     *
     * @param length 长度为4位或者6位
     * @return
     */
    public static Integer generateValidateCode(int length) {
        Integer code = null;
        if (length == 4) {
            code = new Random().nextInt(9999);//生成随机数,最大为9999
            if (code < 1000) {
                code = code + 1000;//保证随机数为4位数字
            }
        } else if (length == 6) {
            code = new Random().nextInt(999999);//生成随机数,最大为999999
            if (code < 100000) {
                code = code + 100000;//保证随机数为6位数字
            }
        } else {
            throw new RuntimeException("只能生成4位或6位数字验证码");
        }
        return code;
    }

    /**
     * 随机生成指定长度字符串验证码
     *
     * @param length 长度
     * @return
     */
    public static String generateValidateCode4String(int length) {
        Random rdm = new Random();
        String hash1 = Integer.toHexString(rdm.nextInt());
        String capstr = hash1.substring(0, length);
        return capstr;
    }
}

5.创建IndexController

import com.mailredistest.utils.MailUtils;
import com.mailredistest.utils.ValidateCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.maven.surefire.shade.org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import java.util.concurrent.TimeUnit;

/**
 * @author a1002
 */
@Controller
@RequestMapping("/user")
@Slf4j
public class IndexController {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 用户登录
     */
    @PostMapping("/login")
    public ModelAndView login(String mail, String code) {
        ModelAndView mv = new ModelAndView();
        //   log.info(code.toString());

        //从Session中获取保存的验证码
        // Object codeInSession = session.getAttribute(phone);

        //从redis获取缓存的验证码
        Object codeInSession = redisTemplate.opsForValue().get(mail);

        //进行验证码的比对(页面提交的验证码和Session中保存的验证码比对)
        if (codeInSession != null && codeInSession.equals(code)) {
            //如果能够比对成功,说明登录成功

            //如果用户登录成功,删除redis中缓存的验证码
            redisTemplate.delete(mail);

            log.info("==================登录成功!====================");

            mv.setViewName("index");
            return mv;
        }
        mv.setViewName("login");
        return mv;
    }


    /**
     * 发送手机短信验证码
     */
    @PostMapping("/sendMsg")
    public ModelAndView sendMsg(String mail) throws Exception {
        log.info("============{}========", mail);

        ModelAndView mv = new ModelAndView();

        if (StringUtils.isNotEmpty(mail)) {
            //生成随机的4位验证码
            String code = ValidateCodeUtils.generateValidateCode(4).toString();
            log.info("code={}", code);

            MailUtils.sendMail(mail, code);

            //将生成的验证码缓存到redis,并且设置有效期为30秒
            redisTemplate.opsForValue().set(mail, code, 30, TimeUnit.SECONDS);
        }

        mv.setViewName("login");
        return mv;
    }

}

6.简单的view

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author a1002
 */
@Controller
public class View {

    @RequestMapping("/index")
    public String q2() {
        return "/index";
    }

    @RequestMapping("/login")
    public String q1() {
        return "/login";
    }

}

7.简单的测试页面login.html




    
    login


---------------------------------------------------------------------------------------------------------------------------------

 --------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------我是可爱的分割线鸭-----------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

 --------------------------------------------------------------------------------------------------------------------------------

8.最近总结

很开心小组新增了很多大一的孩子。

最近也发生一个比较有意思的事情,当然最后这些都会成为回忆。

最近也挺烦恼的,拿不了快递。

最近惰性有点强。

最近有了一个新的体悟,假如在某件事或某个人上投入太多的精力,事后后劲虽然会有一段时间挺大,但之后的很长一段时间后劲就会变得异常绵长和断断续续,就是那种以为自己忘了,实则不然。

最后祝我越来越好

---------------------------------------------------------------------------------------------------------------------------------

 --------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------我是可爱的分割线鸭-----------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------

 --------------------------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(笔记,git,java,github,redis,intellij-idea)