热搜

参考:

https://blog.csdn.net/weixin_45683778/article/details/136320916

https://blog.csdn.net/qq_33449307/article/details/117396874

https://blog.csdn.net/qq_33449307/article/details/117396874

最近搜索

最近搜索即用户最近搜索的关键词的集合,应该是有一个数量限制的,并且可能也不存在过期的说法,例如5天前用户最后搜索过“ABC”,5天后他也不应该消失。同时,也不存在权重的说法,如果先搜一次“C”,再搜一次“A”,排序应该为“C",”A",再搜一次“A",则排序应该为”A“,”C"。

从以上特性考虑,维护一个栈即可,先入先出。但是又要考虑弹出可能搜索过的,存在的key进行弹出栈的操作,所以可以直接维护一个ArrayList即可。

最近搜索的功能可以仅在前端实现,也可以实现在后端。如果实现在前端,则不需要考虑redis的应用,如果在后端实现,或者前后端都实现,则需要考虑是否采用redis。如果不采用,则需要把最近搜索的数据保存到内存或者持久化到db,保存到内存则会遇到分布式无法共享的问题,持久化到db会存在查询较慢的问题,所以可以考虑存储到redis,依靠redis基于内存的特性,并且也无需开发者关心持久化的问题。

以java为例,设计一个简单的最近搜索功能:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;


@Service
public class LatestSearchKeyService {

    private static final String LATEST_SEARCH_STACK_KEY = "LATEST_SEARCH_STACK";

    private static final int LATEST_SEARCH_STACK_SIZE = 100;
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;


    public void set(String value) {
        List<String> list = get();
        list.remove(value);
        list.add(0, value);
        logger.info("set: {}", list);
        if(list.size() > LATEST_SEARCH_STACK_SIZE) {
            list = list.subList(0, LATEST_SEARCH_STACK_SIZE);
        }
        redisTemplate.opsForValue().set(LATEST_SEARCH_STACK_KEY, list);
    }

    public void clear() {
        redisTemplate.delete(LATEST_SEARCH_STACK_KEY);
        logger.info("clear all");
    }

    public void remove(String value) {
        List<String> list = get();
        list.remove(value);
        logger.info("remove value: {}", list);
        redisTemplate.opsForValue().set(LATEST_SEARCH_STACK_KEY, list);
    }


    public List<String> get() {
        List<String> stack = (List<String>) redisTemplate.opsForValue().get(LATEST_SEARCH_STACK_KEY);
        if (stack == null) {
            stack = new ArrayList<>();
        }
        return stack;
    }

}

参考:

https://blog.csdn.net/weixin_45683778/article/details/136320916