电商项目实战(架构三)——redis的启动,安装和运用(windows下)

一、前言

  Redis现在已经普遍应用于电商项目中,它是用C语言开发的一个高性能键值对数据库,用于数据缓存,主要用于处理大量数据的高访问负载,本文记录Redis的安装和启动,并以存储验证短信验证码为例。

二、在windows下的安装和启动

  1、下载redis:https://github.com/MicrosoftArchive/redis/releases

  

  2、下载完成后,解压到指定目录下

  

   3、启动redis

  打开cmd命令提示框进入redis的解压目录

  

   执行启动命令

  redis-server.exe redis.windows.conf

  

  至此,redis启动完成,默认启用6379端口。

  将redis服务添加到windows服务,以便在windows终端操作redis

  关闭已打开的cmd,重新打开一个并进入到redis安装目录执行添加服务命令:redis-server.exe --service-install redis.windows.conf ;

  执行启动服务命令:redis-server.exe --server-start

  执行连接redis命令:redis-cli.exe -h 127.0.0.1 -p 6379

  向redis添加数据测试:set name "zhaozhibin"

  获取添加的测试数据:get name

  

三、项目整合redis

  1、在pom.xml文件中添加redis所需要的依赖包

<!--redis依赖配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

  2、在配置文件application.yml中添加redis配置

#项目启动端口
server:
  port: 10077
spring:
  #连接mysql数据库
  datasource:
    url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root
  #连接redis缓存数据库
  redis:
    host: localhost    #redis服务器地址
    database: 0        #redis数据库索引(默认为0)
    port: 6379         #redis服务器连接端口
    password:          #redis连接密码(默认为空)
    #redis连接池
    jedis:
      pool:
        max-wait: -1ms  #连接池最大阻塞等待时间(使用负值表示没有限制)
        min-idle: 0     #连接池中的最小空闲连接
        max-idle: 8     #连接池中的最大空闲连接
        max-active: 8   #连接池最大连接数(使用负值表示没有限制)
    timeout: 3000ms     #连接超时时间(毫秒)
  #redis自定义key
redis:
  key:
    prefix:
      authCode: "portal:authCode:"
    expire:
      authCode: 120
#mybatis映射xml文件路径
mybatis:
  mapper-locations:
    classpath: com/zzb/test/admin/mapper/*.xml

  3、在service包下新建redis的操作接口

package com.zzb.test.admin.service;

/**
 * redis进行操作的Service
 * 对象和数组都已json形式进行存储
 * Created by zzb on 2019/11/19 18:53
 */
public interface RedisService {
    /**
     * 存储数据
     * @param key
     * @param value
     */
    void set(String key,String value);

    /**
     * 获取数据
     * @param key
     * @return
     */
    String get(String key);

    /**
     * 设置超期时间
     * @param key
     * @param expire
     * @return
     */
    boolean expire(String key, long expire);

    /**
     * 删除数据
     * @param key
     */
    void remove(String key);

    /**
     * 自增操作
     * @param key
     * @param delta 自增步长
     * @return
     */
    Long increment(String key, long delta);
}

  4、在impl包下新建RedisService接口的实现类RedisServiceImpl

package com.zzb.test.admin.service.impl;

import com.zzb.test.admin.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.concurrent.TimeUnit;

/**
 * RedisService的实现类
 * Created by zzb on 2019/11/19 19:01
 */
@Service
@Transactional
public class RedisServiceImpl implements RedisService {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void set(String key, String value) {
        stringRedisTemplate.opsForValue().set(key,value);
    }

    @Override
    public String get(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    @Override
    public boolean expire(String key, long expire) {
        return stringRedisTemplate.expire(key,expire, TimeUnit.SECONDS);
    }

    @Override
    public void remove(String key) {
        stringRedisTemplate.delete(key);
    }

    @Override
    public Long increment(String key, long delta) {
        return stringRedisTemplate.opsForValue().increment(key,delta);
    }
}

  5、在controller包下新建会员登录注册管理类UmsMemberController

package com.zzb.test.admin.controller;

import com.zzb.test.admin.common.CommonResult;
import com.zzb.test.admin.service.UmsMemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 会员登录注册管理controller
 * Created by zzb on 2019/11/19 19:13
 */
@Api(tags = "UmsMemberController", description = "会员登录注册管理")
@Controller
public class UmsMemberController {

    @Autowired
    private UmsMemberService umsMemberService;

    @ApiOperation("获取手机验证码")
    @RequestMapping(value = "/admin/member/getSmsCode", method = RequestMethod.POST)
    @ResponseBody
    public CommonResult getSmsCode(String telephone){
        String smsCode = umsMemberService.generateSmsCode(telephone);
        if (!StringUtils.isEmpty(smsCode)) {
            return CommonResult.success(smsCode,"获取验证码成功");
        }
        return CommonResult.failed("获取验证码失败");
    }

    @ApiOperation("校验输入验证码")
    @RequestMapping(value = "/admin/member/validSmsCode",method = RequestMethod.POST)
    @ResponseBody
    public CommonResult validSmsCode(String telephone,String smsCode){

        return umsMemberService.validSmsCode(telephone,smsCode);
    }
}

  6、在service包下新建会员管理接口UmsMemberService

package com.zzb.test.admin.service;

import com.zzb.test.admin.common.CommonResult;

/**
 * 会员管理接口service
 * Created by zzb on 2019/11/19 19:44
 */
public interface UmsMemberService {
    /**
     * 根据手机生成手机验证码
     * @param telephone
     * @return
     */
    String generateSmsCode(String telephone);

    /**
     * 校验输入的手机验证码
     * @param telephone
     * @param smsCode
     * @return
     */
    CommonResult validSmsCode(String telephone, String smsCode);
}

  7、在impl包下新建UmsMemberService接口的实现类UmsMemberServiceImpl

package com.zzb.test.admin.service.impl;

import com.zzb.test.admin.common.CommonResult;
import com.zzb.test.admin.service.RedisService;
import com.zzb.test.admin.service.UmsMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.Random;

/**
 * UmsMemberService的实现类
 * Created by zzb on 2019/11/19 19:47
 */
@Service
@Transactional
public class UmsMemberServiceImpl implements UmsMemberService {

    @Autowired
    private RedisService redisService;
    @Value("${redis.key.prefix.authCode}")
    private String REDIS_KEY_PREFIX_AUTH_CODE;
    @Value("${redis.key.expire.authCode}")
    private Long AUTH_CODE_EXPIRE_SECONDS;

    @Override
    public String generateSmsCode(String telephone) {
        //生成随机的6位数验证码
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i=0;i<6;i++) {
            sb.append(random.nextInt(10));
        }
        //将生成的验证码存入redis缓存数据库
        redisService.set(REDIS_KEY_PREFIX_AUTH_CODE + telephone,sb.toString());
        //设置过期时间
        redisService.expire(REDIS_KEY_PREFIX_AUTH_CODE + telephone,AUTH_CODE_EXPIRE_SECONDS);
        return sb.toString();
    }

    @Override
    public CommonResult validSmsCode(String telephone, String smsCode) {
        //从redis缓存数据库中取出验证码
        String realSms = redisService.get(REDIS_KEY_PREFIX_AUTH_CODE + telephone);
        if (StringUtils.isEmpty(realSms)) {
            return CommonResult.failed("验证码已过期");
        }
        if (smsCode.equals(realSms)) {
            return CommonResult.success("校验成功");
        }
        return CommonResult.failed("输入验证码不正确");
    }
}

  8、测试接口获取手机验证码

  

   

  手机验证码为862061

  9、测试接口校验手机验证码

  输入正确的验证码返回

  

  输入错误的验证码返回

   

  两分钟以后验证码过期,输入正确的验证码返回

  

  项目github地址:https://github.com/18372561381/shoptest

原文地址:https://www.cnblogs.com/zzb-yp/p/11896455.html