redisService:
/** * 针对热门搜索的redis操作 */ @Service public class RedisService { @Autowired private RedisTemplate redisTemplate; /** * 获得key数组里面key2元素的索引 * @param key * @param key2 * @return */ public Long rank(String key, Object key2) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rank(key, key2); } /** * 有序集合添加 * @param key * @param value * @param scoure */ public void zAdd(String key, Object value, double scoure) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key, value, scoure); } /** * 获得key数组里面key2元素的排序值 * @param key * @param key2 * @return */ public double score(String key, Object key2) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.score(key, key2); } /** * 从高到低的排序集中获取从头(start)到尾(end)内的元素。 * @param key * @param start * @param end * @return */ public Set<Object> reverseRange(String key, long start, long end) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.reverseRange(key, start, end); } /** * 根据分数保留指定个数,其余的元素删除 * @param key * @param number * @return */ public Boolean remove(String key, Integer number) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); Long size = zset.size(key); if (size > number) { //获取变量指定区间的元素 Set<ZSetOperations.TypedTuple<Object>> typedTuples = zset.rangeWithScores(key, 0, (size - 1) - number); Set set = new HashSet(); for (ZSetOperations.TypedTuple<Object> o : typedTuples) { set.add(o.getValue()); } for (Object o : set) { Long aLong = zset.remove(key, o); if (aLong == null) { return false; } } return true; }else { return true; } } }key: redis中的key(建议写在配置文件中)、number: 展示词条个数(建议写在配置文件中)、name: 词条
向redis中添加词条
Long rank = redisService.rank(key, name); // 如果rank为null,则缓存里面不存在该值 if (null == rank) { // 不存在,则添加,默认排序为1 redisService.zAdd(key, name, 1.0); } else { // 如果存在,则获取排序值 并且+1 int score = (int) redisService.score(key, name); redisService.zAdd(key, name, score + 1); }查询热门词条
public Set<Object>hotSearch() { Set<Object> strSet = redisService.reverseRange(ZSET, 0, number - 1); //正确个数为下标-1 return ResultMap.getSuccessfulResult("获取热门列表成功", 0, strSet); }删除不显示的热门词条(建议使用定时器,每隔一段时间删除一次)
boolean b = redisService.remove(key, number);