springboot整合redis分页,消息中间件使用

该博客介绍了如何在业务场景中使用Redis进行学生信息的存储和分页操作,以及消息中间件的使用。通过查询数据、存储到Redis并进行分页显示,同时展示了删除数据的方法。此外,还提供了将数组转换为集合的工具类。另外,实现了Redis的消息监听,包括消息实体类、配置类和消息接收类。
摘要由CSDN通过智能技术生成

业务场景:将班级下的学生信息存储进缓存,同时也是方便于对其进行分页操作
具体的流程:将符合条件的数据查询出来,在查询出来之后,再将数据存储进缓存中进行,例如按照报名时间,学生年龄倒序或者是顺序进行进行存储,
具体的代码实现流程: 先从缓存中查找,没有就从数据库中查询,查询出来的数据在保存到redis中,以后分页的情况都是从redis中拿取,主要涉及的代码就是redis的操作,一个是存,一个是取区间范围,一个删除redis区间的数据,都是用Zset中进行的

/**
     * 将元素添加进指定的key,并且指定元素的分值----这是存数据的方法
     * @param key
     * @param obj
     * @param score
     * @return
     */
    public boolean hZSet(String key, Object obj, double score){
        return  redisTemplate.opsForZSet().add(key, obj, score);
    }


/**
     * 对数据库中的元素进行分页处理-------这是取数据的操作
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Set hZget(String key, double start, double end){
       return redisTemplate.opsForZSet().rangeByScore(key, start, end);
    }


 /**
     * 根据指定的数据来删除掉数据-------这是删除数据的方法
     * @param key
     * @param start
     * @param end
     * @return
     */
    public Long hZDel(String key, double start, double end){
        return  redisTemplate.opsForZSet().removeRangeByScore(key, start, end);
    }

由于只是实验性质的,所以我在controller层中做缓存的操作:

/**
     * 关于 List<?>与List<Object> 以及 List</Object>
     * List<?>只能与List进行转换它与List<Object>是没有关系的
     * @return
     * @throws Exception
     */
    @DataSource("master")
    @RequestMapping(value = "page")
    public List<Student> redisPage(Integer page1, Integer pageSize){
//        List<Student> students = studentMapper.queryDatas();

        //redis中的数据进行分页数据
        Set studentPage = redisUtil.hZget("studentPage", (page1 - 1) * pageSize + 1, page1 * pageSize);
        Object[] objects = studentPage.toArray();
//        List<?> objects1 = CollectionUtils.arrayToList(objects);
//        List<Object> objects2 = Arrays.asList(objects);
        List<Student> students = new ArrayList<Student>(studentPage);
        //将redis中的数据进行删除操作
        redisUtil.hZDel("studentPage",(page1 - 1) * pageSize + 1, page1 * pageSize);
        return students;
    }

由于涉及到数组与集合之间的转换,所以我在这里编写了一个工具类:

@Component
public class ArraysUtils {


    /**
     * 将数组转换为集合的方法
     * @param arrays
     * @return
     */
    private static List arraysToList(Object[] arrays){
        return Arrays.asList(arrays);
        //另外一种转换方法,这个方法不是静态的方法
        //List<?> objects = CollectionUtils.arrayToList(arrays);
    }


    /**
     * 将数组转换为Set类型
     * @param arrays
     * @return
     */
    private static Set arraysToSet(Object[] arrays){
        return new HashSet(Arrays.asList(arrays));
    }


    /**
     * 将集合转换为数组
     * @param list
     * @return
     */
    private static Object[] listToArrays(List list){
        return list.toArray();
    }

    /**
     * 将list转换为Set
     * @param list
     * @return
     */
    private static Set listToSet(List list){
        return new HashSet(list);
    }


    /**
     * set转换为数组
     * @param set
     * @return
     */
    private static Object[] setToArray(Set set){
        return set.toArray();
    }

    /**
     * set转换为list
     * @param set
     * @return
     */
    private static List setToList(Set set){
        return new ArrayList(set);
    }

redis中的消息中间件的使用:
主要的流程就是:定义一个消息实体类, 在redis配置中配置好配置消息监听类, 定义一个消息接收类
消息实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message implements Serializable {

    //会话id
    private String sessionId;

    //消息体
    private String message;
}

redis配置类:

/**
     * redis消息监听器
     * 可以添加多个监听不同话题的redis监听器
     * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
     * @param connectionFactory
     * @param listenerAdapter
     * @return
     */
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //订阅通道的地方
        container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
        //这个container 可以添加多个 messageLister
        return container;
    }


    /**
     * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
     * @param receiveMessage
     * @return
     */
    @Bean
    MessageListenerAdapter  listenerAdapter(MessageReceive receiveMessage){
        //作用是给messageListernerAdater传入一个消息接收的处理器,利用反射调用方法
        return new MessageListenerAdapter(receiveMessage, "receive");
    }

消息接收类:

@Slf4j
@Component
public class MessageReceive {


    /**
     * 接收消息並且将他转换为一个Map类型
     * @param message
     * @return
     */
    public void receive(String message){
        Map<String, String> map = JSON.parseObject(message, Map.class);
        log.info("获取到的信息为:{}", map);
        String sessionId = map.get("sessionId");
        String message1 = map.get("message");
        log.info("其中会话id为:{}, 消息数据为:{}", sessionId, message1);
    }
}

访问controller层,调用方法中来调用方法中作用:

 	@DataSource("master")
    @RequestMapping("redisMessage")
    public void sendMessage(){
        List<UserLogConfig> all = userLogConfigService.findAll();
        Message message = new Message("122", JSON.toJSONString(all));
        messageSend.messageSend(message);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值