优雅的使用ZSet实现搜索排行榜

前言

最近开始因为公司一个业务需求接触到了ZSet,使用到了ZSet的自带排序。
需求是这样的公司自己开发的平台每次用户点击菜单都需要找;并没有快捷一点的操作方法,所以需要根据用户常点击的一些菜单保存下来进行推荐,这就像是实时排行榜一样的。
我的思路是:用户每次点击菜单都将菜单的数据按用户来保存更新,然后再推荐出用户经常点击Top10来让用户快捷操作,实现起来其实很简单用mysql这些都是分分钟的事情但是可能会涉及到频繁的操作数据库所以这里我用的是Redis的ZSet(其实操作起来也是很顺手的)

介绍

  • sorted set,有序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
  • 说明:没有修改操作

RedisTemplate操作方法介绍

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

开始实现业务

编写操作ZSet类

// 初始值
static Double num = 1d;




/**
* 获取Zset 排名
*
* @param key
* @return
*/
protected Set<T> getZSet(String key, int start, int end) {
    // 获取排名前十的菜单点击数,start代表开始score,end代表结束score,范围区间
    return zSet().reverseRangeByScoreWithScores(key, start, end, 0, 10);
}




/**
* 添加对象到set,并返回列表长度
*
* @param key
* @param value
* @return
*/
protected Double zAdd(String key, T value) {
    if (value == null) return 0.0;
    // 当key没有时添加有时就更新,num是设置初始自增值
    Double length = zSet().incrementScore(key, value, num);
    return length;
}




private ZSetOperations zSet() {
    // 返回ZSet操作对象
    return redisTemplate.opsForZSet();
}

编写业务层代码

@Component
public class MenuUserCache extends ZSetCacheTemplate<MenuUser> {

// 设置缓存统一key(‘’:‘’代表文件夹)
private final static String KEY = "menu:users:";
// 设置默认最高score
private final static int MAXSOCRE = 99999999;

/**
* 查询排名前十的点击菜单
*
* @param userId
* @return
*/
public Set<MenuUser> getRank(String userId) {
    Set<MenuUser> zSet = getZSet(KEY.concat(userId), 0, MAXSOCRE);
    return zSet;
}


/**
* 新增菜单点击记录
*
* @param userId
* @param menuUser
* @return
*/
public Double add(String userId, MenuUser menuUser) {
    return zAdd(KEY.concat(userId), menuUser);
}
}

查看结果

在这里插入图片描述

Java学习群:QQ:1037465137

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值