前言

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

优雅的使用ZSet实现搜索排行榜相关推荐

  1. 谷歌发布2018年度搜索排行榜

    近日,谷歌正式发布2018年的年度搜索报告,揭示了今年主宰这一搜索引擎的最火爆潮流.谷歌说,这些榜单"是基于今年(的搜索量)较前一年涨幅最大的搜索词"得出的. 从全球来看,&quo ...

  2. Redis ZSet数据结构实现排行榜功能

    Redis ZSet数据结构实现排行榜功能 一. 使用场景 公司新项目要求, 实现每日排行榜以及各省排行榜 二. 功能实现(Java) 1. 排行榜数据插入及更新 /*** @date: 2022/1 ...

  3. 雅虎2011热门词汇搜索排行榜

    全球著名的互联网公司雅虎公布了2011年度十大最热搜索词,iPhone超越众多新闻事件人物和大牌明星傲居榜首.这是继2002年PlayStation2游戏机折桂后,该排行榜再次由电子产品领头. 这是雅 ...

  4. 谷歌发布2015年度搜索排行榜

    继百度.Bing之后,今天谷歌官方也发布了2015年的热搜榜单排行榜,用热词呈现今年人们最关心的热点事件和社会潮流.本年谷歌并没有针对中国地区发布榜单. 谷歌表示,从新年伊始的那条到底是蓝黑相间还是白 ...

  5. 百度2018年度搜索排行榜发布

    百度正式发布了百度2018年度榜单.通过八个不同的子榜单,百度向人们展示了过去一年中中国人关心的是什么.根据榜单显示,2018年度关键词为:世界杯.中美贸易争端.台风山竹.苹果发布会.延禧攻略.创造1 ...

  6. 基于Spring-Data-Elasticsearch 优雅的实现 多字段搜索 + 高亮 + 分页 + 数据同步✨

    持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情 系列说明 本系列文章基于我的开源微服务项目[校园博客]进行分析和讲解,所有源码均可在GitHub仓库上 ...

  7. Redis的list,set,zset类型应用及排行榜的实现

    Redis数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)等 List类型 简介 ​ Lis ...

  8. 作为一名程序员如何优雅的使用谷歌搜索技术(Google)?

    作为一名程序员如何优雅的使用谷歌搜索技术(Google)? 大家都知道作为一名程序员Google的作用很大,但是Google又很难优雅的使用.需要轻功高明.当然也有一些人做Google的镜像,但是发展 ...

  9. redis mysql排行榜实现_redis实现排行榜

    1 前言 实现一个排版榜,我们通常想到的就是mysql的order by 简单粗暴就撸出来了.但是这样真的优雅吗? 数据库是系统的瓶颈,这是众所周知的.如果给你一张百万的表,让你排序做排行榜,花费的时 ...

最新文章

  1. 0基础小白学好JAVA的5个方法
  2. 让node.js支持es6的词法
  3. Quartus和Modelsim中使用`include包含头文件的对比
  4. C# Monitor 使用 多线程通信
  5. 3、Python 基础类型 -- List 列表类型
  6. 百度大脑“乘风”新基建,“破浪”产业智能化落地
  7. 在计算机网络中为了保证正确传输,计算机网络试卷B
  8. linux循环处理脚本命令,后端开发必须掌握的Linux命令[Shell脚本篇]
  9. PDOStatement::bindParam的一个陷阱
  10. angularjs 模块化
  11. JDK集合源码解析剖析
  12. C# 批量修改文件名称
  13. Debian修改IP地址
  14. EfficientNet网络结构详解
  15. OAuth2 oauth_client_details表字段的详细说明
  16. 使用ngrok实现内网穿透,免费在本地发布项目
  17. 有关程序员的几则冷笑话
  18. telnet 不是内部或外部命令,也不是可运行的程序解决方案
  19. 前端项目运行错误提示及解决proble (1 error, 0 warnings) m1 error and 0 warnings potentially fixable with the `--fi
  20. 惠普打印机常用墨盒加墨方法

热门文章

  1. C#图片处理之:在图片上画框(圈)
  2. The requested URL /lastid was not found on this server.
  3. Kotlin协程:CoroutineScope 作用域
  4. 再看桥水基金的资产再平衡策略
  5. 你可以在虚拟世界里过上美好生活吗?
  6. html2canvas 部分iPhone手机无效
  7. 浙大首届AI本科专业9月入学 据悉毕业起薪50万很正常
  8. 【MVO三维路径规划】基于matlab多元宇宙算法多无人机避障三维航迹规划【含Matlab源码 2579期】
  9. STM8L10x环境搭建
  10. WordPress去掉页面左侧导航的方法