Java简单使用redis-zset实现排行榜

简单使用redis-zset实现排行榜

此方法实现一个根据某字段的查询次数进行排行,查询的次数越多排行越前(从大到小排序),适用于初学者

1.添加依赖

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>

2.注入RedisTemplate方法

@Autowired
public RedisTemplate redisTemplate;

3.创建对象,用来接收redis数据

@Data
public class RangeVo implements Serializable {

 private String shopName;

 private Double shopPrice;

}

4.添加十条redis数据

 @Test
 public void getzset4(){

  String keyModel = "testList";
  for (int i = 0; i < 10 ; i++) {
   int score = new Random().nextInt(50);
   String ss = "shop"+i;
   redisTemplate.opsForZSet().add(keyModel,ss,score);
  }
 }

5.根据某个key查询并每次查询score都会加1

@Test
 public void setOneValue(){
  String keyModel = "testList";
  String ss = "shop8";

  Double aDouble = redisTemplate.opsForZSet().incrementScore(keyModel, ss, 1);

  System.out.println(aDouble);
 }

6.查询redis中所有数据,zset会根据score自动排序

@Test
 public void getList(){

  String key = "testList";

  List<RangeVo> list = new ArrayList<>();
  /** 从小到大排序 返回value 和 score* 参数注释 key 为有序集合的key,1,50 是分数范围 1-50,0 是偏移量即从哪条数据开始排序, 5是取5条满足条件的数据*/
  Set<ZSetOperations.TypedTuple<Object>> set = redisTemplate.opsForZSet().rangeByScoreWithScores(key,1,50,0,5);
  Iterator<ZSetOperations.TypedTuple<Object>> iterator = set.iterator();
  while (iterator.hasNext()){
   ZSetOperations.TypedTuple<Object> next = iterator.next();
   RangeVo rangeVo = new RangeVo();
   rangeVo.setShopName((String) next.getValue());
   rangeVo.setShopPrice(next.getScore());
   list.add(rangeVo);
  }

  System.out.println(list);
 }

到此这篇关于Java简单使用redis-zset实现排行榜的文章就介绍到这了,更多相关redis-zset排行榜内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Redis实现微信步数排行榜功能

    1. 前言 之前写过一篇博客,讲解的是Redis的5种数据结构及其常用命令,当时有读者评论,说希望了解下这5种数据结构各自的使用场景,不过一直也没来得及写. 碰巧,在3月份找工作面试时,有个面试官先问了我Redis有哪几种数据结构,在我讲完后,面试官又问了我以下问题: 如何用Redis实现微信步数排行榜? 相信很多小伙伴都知道,可以使用Redis的有序集合ZSET来实现,本篇博客就基于此面试题,来讲解下ZSET的使用场景,以及微信步数排行榜的大致实现思路. 2. ZSET的使用场景 ZSET的经

  • redis实现排行榜的简单方法

    1 前言 实现一个排版榜,我们通常想到的就是mysql的order by 简单粗暴就撸出来了.但是这样真的优雅吗? 数据库是系统的瓶颈,这是众所周知的.如果给你一张百万的表,让你排序做排行榜,花费的时间是十分可怕的. 不如缓存吧,order by的时候强制使用索引.但是这样真的优雅吗? 2 Redis的排行榜 我们分析一下排行榜,一个用户一个排名,意味着要去重,这时我们会想到Java的一种数据结构Set.不过Set又是无序的.有没有一种结构是可以保住元素唯一以及有序的呢. 幸运的是,还真的有.R

  • 利用redis实现排行榜的小秘诀

    前言 排行榜作为互联网应用中几乎必不可少的一个元素,其能够勾起人类自身对比的欲望,从而来增加商品的销量. 对于排行榜的需求,redis有一个数据结构非常适合做这件事,那就是有序集合(sorted set). 在日常一些简单的活动开发中,我经常会碰到需要对用户的分值等进行排行,此时一般会选择redis的有序集合对用户的分数进行存储,但是不同的场景排行榜的方式也略有不同,以下根据自己日常的开发进行了一下归纳总结 Redis 有序集合(sorted set) 首先简单介绍下什么是有序集合. Redis

  • 基于redis实现世界杯排行榜功能项目实战

    题外话: 小编先给大家推荐一个不错的微信公众号: 感兴趣的朋友可以关注小编的微信公众号[码农那点事儿],更多网页制作特效源码及学习干货哦!!! 需求 前段时间,做了一个世界杯竞猜积分排行榜.对世界杯64场球赛胜负平进行猜测,猜对+1分,错误+0分,一人一场只能猜一次. 1.展示前一百名列表. 2.展示个人排名(如:张三,您当前的排名106579). 分析 一开始打算直接使用mysql数据库来做,遇到一个问题,每个人的分数都会变化,如何能够获取到个人的排名呢?数据库可以通过分数进行row_num排

  • 利用Redis的有序集合实现排行榜功能实例代码

    前言 游戏中存在各种各样的排行榜,比如玩家的等级排名.分数排名等.玩家在排行榜中的名次是其实力的象征,位于榜单前列的玩家在虚拟世界中拥有无尚荣耀,所以名次也就成了核心玩家的追求目标. 一个典型的游戏排行榜包括以下常见功能: 能够记录每个玩家的分数: 能够对玩家的分数进行更新: 能够查询每个玩家的分数和名次: 能够按名次查询排名前N名的玩家: 能够查询排在指定玩家前后M名的玩家. 更进一步,上面的操作都需要在短时间内实时完成,这样才能最大程度发挥排行榜的效用. 由于一个玩家名次上升x位将会引起x+

  • 使用Redis实现用户积分排行榜的教程

    排行榜功能是一个很普遍的需求.使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择. 一般排行榜都是有实效性的,比如"用户积分榜".如果没有实效性一直按照总榜来排,可能榜首总是几个老用户,对于新用户来说,那真是太令人沮丧了. 首先,来个"今日积分榜"吧,排序规则是今日用户新增积分从多到少. 那么用户增加积分时,都操作一下记录当天积分增加的有序集合. 假设今天是 2015 年 04 月 01 日,UID 为 1 的用户因为某个操作,增加了 5 个积分. Re

  • Java简单使用redis-zset实现排行榜

    简单使用redis-zset实现排行榜 此方法实现一个根据某字段的查询次数进行排行,查询的次数越多排行越前(从大到小排序),适用于初学者 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.注入RedisTemplat

  • Java简单实现session保存到redis的方法示例

    本文实例讲述了Java简单实现session保存到redis的方法.分享给大家供大家参考,具体如下: 在负载均衡情况下,如果用户访问不同的机器,如果没有做session同步,用户就会被提出,这样用户体验非常不好,所以我们很有必要做session同步,把session放到reids缓存服务器就能很好的解决问题.下面是代码简单的实现. 一.配置web.xml过滤器: <filter> <filter-name>sessionFilter</filter-name> <

  • Java利用redis zset实现延时任务详解

    目录 一.实现原理 二.准备工作 三.代码实现 四.优缺点 所谓的延时任务给大家举个例子:你买了一张火车票,必须在30分钟之内付款,否则该订单被自动取消.「订单30分钟不付款自动取消,这个任务就是一个延时任务.」   我之前已经写过2篇关于延时任务的文章: <通过DelayQueue实现延时任务> <基于netty时间轮算法实战> 这两种方法都有一个缺点:都是基于单体应用的内存的方式运行延时任务的,一旦出现单点故障,可能出现延时任务数据的丢失.所以此篇文章给大家介绍实现延时任务的第

  • 使用Redis实现实时排行榜功能

    游戏中存在各种各样的排行榜,比如玩家的等级排名.分数排名等.玩家在排行榜中的名次是其实力的象征,位于榜单前列的玩家在虚拟世界中拥有无尚荣耀,所以名次也就成了核心玩家的追求目标. 一个典型的游戏排行榜包括以下常见功能: 1. 能够记录每个玩家的分数: 2. 能够对玩家的分数进行更新: 3. 能够查询每个玩家的分数和名次: 4. 能够按名次查询排名前N名的玩家: 5. 能够查询排在指定玩家前后M名的玩家. 更进一步,上面的操作都需要在短时间内实时完成,这样才能最大程度发挥排行榜的效用. 由于一个玩家

  • Java手写Redis服务端的实现

    目录 零,起因 一,redis通讯与Netty 1,tcp 2,协议 3,编解码 4,命令处理 二,redis 的数据结构 1,底层主结构 2,key 3,list 4,set 5,hash 6,zset 三,redis AOF 持久化 1,aof线程与tcp线程解耦,即写缓冲 2,aof持久化协议 3,aof的加载与存储实现 4,内存文件映射与面向对象 四,redis 的集群特性 1,主从 2,主从复制 3,分片集群 五,redis 的压测与调优 1,aof内存泄漏 2,内存复用提升性能 3,

  • java语言描述Redis分布式锁的正确实现方式

    分布式锁一般有三种实现方式:1.数据库乐观锁:2.基于Redis的分布式锁:3.基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁. 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性.在任意时刻,只有一个客户端能持有锁. 不会发生死锁.即使有一个客户端在持有锁的期间

  • 为Java项目添加Redis缓存的方法

    Redis的安装 Redis一般有Linux和Windows两种安装方式,Windows的最高版本为3.2,Linux的最高版本为5.0,大家可以根据自己的需要添加 Linux 首先在linux下安装docker,在docker环境下安装redis5.0的镜像 docker pull redis:5.0 然后使用Docker命令启动Redis容器 docker run -p 6379:6379 --name redis \ -v /mydata/redis/data:/data \ -d red

  • Java手动实现Redis的LRU缓存机制

    前言 最近在逛博客的时候看到了有关Redis方面的面试题,其中提到了Redis在内存达到最大限制的时候会使用LRU等淘汰机制,然后找了这方面的一些资料与大家分享一下. LRU总体大概是这样的,最近使用的放在前面,最近没用的放在后面,如果来了一个新的数,此时内存满了,就需要把旧的数淘汰,那为了方便移动数据,肯定就得使用链表类似的数据结构,再加上要判断这条数据是不是最新的或者最旧的那么应该也要使用hashmap等key-value形式的数据结构. 第一种实现(使用LinkedHashMap) pub

  • Java Socket实现Redis客户端的详细说明

    Redis是最常见的缓存服务中间件,在java开发中,一般使用 jedis 来实现. 如果不想依赖第三方组件,自己实现一个简单的redis客户端工具,该如何实现呢?本文就是介绍这样一种方法. Redis的协议非常简单,而且输入数据和输出数据都遵循统一的协议,具体规则参考这里: http://redisdoc.com/topic/protocol.html Redis的命令协议: $参数数量n $参数1的值的字节数组长度 $参数1的值的字符串表示 $参数2的值的字节数组长度 $参数2的值的字符串表

  • 浅谈java如何实现Redis的LRU缓存机制

    目录 LRU概述 使用LinkedHashMap实现 使用LinkedHashMap简单方法实现 双链表+hashmap LRU概述 最近使用的放在前面,最近没用的放在后面,如果来了一个新的数,此时内存满了,就需要把旧的数淘汰,那为了方便移动数据,肯定就得使用链表类似的数据结构,再加上要判断这条数据是不是最新的或者最旧的那么应该也要使用hashmap等key-value形式的数据结构. 使用LinkedHashMap实现 package thread; import java.util.Link

随机推荐