Spring Data Redis

5.2.Redis

5.2.1.安装

参考课前资料中的:《centos下的redis安装配置.md》

5.2.2.Spring Data Redis

官网:http://projects.spring.io/spring-data-redis/


Spring Data Redis,是Spring Data 家族的一部分。 对Jedis客户端进行了封装,与spring进行了整合。可以非常方便的来实现redis的配置和操作。 

5.2.3.RedisTemplate基本操作

Spring Data Redis 提供了一个工具类:RedisTemplate。里面封装了对于Redis的五种数据结构的各种操作,包括:

- redisTemplate.opsForValue() :操作字符串 
- redisTemplate.opsForHash() :操作hash
- redisTemplate.opsForList():操作list
- redisTemplate.opsForSet():操作set
- redisTemplate.opsForZSet():操作zset

其它一些通用命令,如expire,可以通过redisTemplate.xx()来直接调用

5种结构:

- String:等同于java中的,Map<String,String>
- list:等同于java中的Map<String,List<String>>
- set:等同于java中的Map<String,Set<String>>
- sort_set:可排序的set
- hash:等同于java中的:`Map<String,Map<String,String>>

5.2.4.StringRedisTemplate

RedisTemplate在创建时,可以指定其泛型类型:

- K:代表key 的数据类型
- V: 代表value的数据类型

注意:这里的类型不是Redis中存储的数据类型,而是Java中的数据类型,RedisTemplate会自动将Java类型转为Redis支持的数据类型:字符串、字节、二进制等等。

不过RedisTemplate默认会采用JDK自带的序列化(Serialize)来对对象进行转换。生成的数据十分庞大,因此一般我们都会指定key和value为String类型,这样就由我们自己把对象序列化为json字符串来存储即可。

因为大部分情况下,我们都会使用key和value都为String的RedisTemplate,因此Spring就默认提供了这样一个实现: 

5.2.5.测试

我们在项目中编写一个测试案例,把课前资料中的redisTest.java导入到项目中

 

需要在项目中引入Redis启动器:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

然后在配置文件中指定Redis地址:

    spring:
      redis:
        host: 192.168.56.101

5.3.在项目中实现

需要三个步骤:

- 生成随机验证码
- 将验证码保存到Redis中,用来在注册的时候验证
- 发送验证码到leyou-sms-service服务,发送短信

因此,我们需要引入Redis和AMQP:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>

添加RabbitMQ和Redis配置:

    spring:
      redis:
        host: 192.168.56.101
      rabbitmq:
        host: 192.168.56.101
        username: leyou
        password: leyou
        virtual-host: /leyou

另外还要用到工具类,生成6位随机码,这个我们封装到了leyou-common中,因此需要引入依赖:

    <dependency>
        <groupId>com.leyou.common</groupId>
        <artifactId>leyou-common</artifactId>
        <version>${leyou.latest.version}</version>
    </dependency>

NumberUtils中有生成随机码的工具方法:

    /**
     * 生成指定位数的随机数字
     * @param len 随机数的位数
     * @return 生成的随机数
     */
    public static String generateCode(int len){
        len = Math.min(len, 8);
        int min = Double.valueOf(Math.pow(10, len - 1)).intValue();
        int num = new Random().nextInt(
            Double.valueOf(Math.pow(10, len + 1)).intValue() - 1) + min;
        return String.valueOf(num).substring(0,len);
    }

5.3.1.UserController

在leyou-user-service工程中的UserController添加方法:

    /**
     * 发送手机验证码
     * @param phone
     * @return
     */
    @PostMapping("code")
    public ResponseEntity<Void> sendVerifyCode(String phone) {
        Boolean boo = this.userService.sendVerifyCode(phone);
        if (boo == null || !boo) {
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<>(HttpStatus.CREATED);
    }

5.3.2.UserService

在Service中添加代码:

    @Autowired
    private StringRedisTemplate redisTemplate;
    
    @Autowired
    private AmqpTemplate amqpTemplate;
    
    static final String KEY_PREFIX = "user:code:phone:";
    
    static final Logger logger = LoggerFactory.getLogger(UserService.class);
    
    public Boolean sendVerifyCode(String phone) {
        // 生成验证码
        String code = NumberUtils.generateCode(6);
        try {
            // 发送短信
            Map<String, String> msg = new HashMap<>();
            msg.put("phone", phone);
            msg.put("code", code);
            this.amqpTemplate.convertAndSend("leyou.sms.exchange", "sms.verify.code", msg);
            // 将code存入redis
            this.redisTemplate.opsForValue().set(KEY_PREFIX + phone, code, 5, TimeUnit.MINUTES);
            return true;
        } catch (Exception e) {
            logger.error("发送短信失败。phone:{}, code:{}", phone, code);
            return false;
        }
    }

注意:要设置短信验证码在Redis的缓存时间为5分钟

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值