获得问题标签列表

该博客讨论了如何在客服端高效获取Question的Tag信息。通过在服务器端添加一个ConcurrentHashMap来缓存Tag,实现了并发安全且高性能的查询。在Question类型中添加tags属性,不映射到数据库,避免了额外的查询。在获取Tag信息时,先检查缓存,如果为空则同步加载并填充缓存。这种方法提高了系统的响应速度和并发处理能力。
摘要由CSDN通过智能技术生成

在这里插入图片描述
考虑到一个问题相关到标签一旦选定就很少更改,所以在Question设计一个冗余类tag_names,储存当前问题相关名称,这样查询标签的时候就不用进行复杂关联查询了。

  • 但是客服端如何做到完整的Tag信息呢,可以在服务器端利用缓存的tag信息组装一个信息。

首先为Question类型添加tags属性,表示当前Question完整Tag信息利用注解@TableField(exist = false)通知MyBatisPlus,这个属性不来自数据库。避免发生映射故障。

为了提高查询性能,在TagServiceImpl中添加一个散列表,缓存全部Tag信息。这里为了解决散列表被并发访问的问题,采用ConcurrentHashMap类型散列表,这个类来自Java并发包,相对于HashMap提供了并发安全功能。并且其内部分段式加锁机制,可以保证并且安全情况下具有更好的访问性能。这个散列表在加载Tag数据时候一同被初始化。

接口

Map<String, Tag> getName2TagMap();

实现

//注入map,key是String类型,value是tag类型
private final Map<String,Tag> name2TagMap = new ConcurrentHashMap<>();

    @Override
    public List<Tag> getTags() {
        if(tags.isEmpty()){
            //进行同步
            synchronized (tags){
                //再次检查
                if (tags.isEmpty()){
                    //list() 是Mybatis plus提供的方法,在ServiceImpl中定义
                    //继承与ServiceImpl的方法,方法的作用就是返回数据库中Tag对象
                    tags.addAll(list());
                    //tag的name作为key,把tag放进去
                    tags.forEach(tag -> name2TagMap.put(tag.getName(),tag));
                    log.debug("加载tag列表{}",tags);
                    log.debug("加载了Map{}",name2TagMap);
                }
            }
        }
        return tags;
    }

    @Override
    public Map<String, Tag> getName2TagMap() {
        if (tags.isEmpty()){
            getTags();
        }

        return name2TagMap;
    }

测试方法

@Test
    public void getName2TagMap(){
        Map<String,Tag > tagMap = tagService.getName2TagMap();
        tagMap.forEach((name,tag) -> System.out.println(name + ":" + tag));
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值