IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 使用Redis的key的有效期特性模拟订单超时无法支付 -> 正文阅读

[大数据]使用Redis的key的有效期特性模拟订单超时无法支付

????????Redis的key可以设置有效期,过期之后在Redis中就无法查到这个key了,当key失效之后,就会出发Redis的监听回调函数onMessage,在回调函数里面将订单的状态改为无法支付就可以了。

直接看代码吧,懒得废话了:

配置文件

开启Redis回调监听需要设置redis.conf配置文件中的notify-keyspace-events Ex给放开(更改redis.conf配置文件之后一定要重启Redis)

MySQL和Redis的连接都是最基本的,可以看往期文章。这里就省略了,直接上Java代码了:

实体类,这里的实体类是和MySQL数据库中的表对应的:

import lombok.Data;

@Data
public class Order {
    private Integer id;
    private String orderId;
    private String tokenId;
}

?dao,将一条数据插入到MySQL数据库:

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface OrderDao {

    @Insert("insert into redis_order values ( #{id}, #{orderId}, #{tokenId})")
    int insertData(@Param("id") Integer id, @Param("orderId") String orderId, @Param("tokenId") String tokenId);

}

Redis工具类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Component
public class RedisUtils {

    /**
     * 获取redis模板
     */
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 存入String类型
     * @param key
     * @param value
     * @param timeOut
     */
    public void setString(String key, String value, Long timeOut){
        stringRedisTemplate.opsForValue().set(key, value);
        if (timeOut != null){
            //设置Redis的key的有效期
            stringRedisTemplate.expire(key, timeOut, TimeUnit.SECONDS);
        }
    }
    /**
     * 获取String类型
     * @param key
     * @return
     */
    public String getString(String key){
        return stringRedisTemplate.opsForValue().get(key);
    }
}

?控制层,这里设置了5秒钟的过期时间,然后随机生成了一个tokenId和一个orderId,先将数据存到Redis缓存中,tokenId当key,orderId当value,再将数据存入到MySQL

import javax.annotation.Resource;
import java.util.UUID;

@RestController
public class OrderController {

    @Resource
    private OrderDao orderDao;
    @Resource
    private RedisUtils redisUtils;

    @GetMapping("/insertOrderData")
    public String insertOrderData(){
        //随机生成一个tokenId
        String  tokenId = UUID.randomUUID().toString();
        //随机生成一个订单id
        String orderId = UUID.randomUUID().toString();
        //将数据缓存到redis
        redisUtils.setString(tokenId, orderId, 5l);
        return orderDao.insertData(1, orderId, tokenId) > 0 ? "success" : "fail";
    }
}

监听回调函数:

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

@Component
public class RedisOrderListener extends KeyExpirationEventMessageListener {

    public RedisOrderListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * key的监听回调时间
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String key = message.toString();
        System.out.println(key + " 失效了");
        //key失效了之后,利用这个key去MySQL数据库中将订单改为无法支付即可
        //这里的逻辑省略 主要模拟一下key失效的效果
    }
}

这里使用到的RedisMessageListenerContainer需要手动注入一下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

访问一下地址:

http://localhost:8080/insertOrderData

看看效果:

看看Redis前后的变化,当我们点击url执行时,redis会出现缓存,将存入数据库的key,也就是tokenId拿出来去Redis中去查询,查询出来的数据就是orderId。

?当数据失效之后:

这个key就是上面的tokenId,再利用这个key去查询一下Redis:

已经为空了,key失效了,Redis就查询不到了。?

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:46:25  更:2022-05-09 12:50:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:28:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码