前言
最近开始因为公司一个业务需求接触到了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