热搜
参考:
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