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

1. 前言

之前写过一篇博客,讲解的是Redis的5种数据结构及其常用命令,当时有读者评论,说希望了解下这5种数据结构各自的使用场景,不过一直也没来得及写。

碰巧,在3月份找工作面试时,有个面试官先问了我Redis有哪几种数据结构,在我讲完后,面试官又问了我以下问题:

如何用Redis实现微信步数排行榜?

相信很多小伙伴都知道,可以使用Redis的有序集合ZSET来实现,本篇博客就基于此面试题,来讲解下ZSET的使用场景,以及微信步数排行榜的大致实现思路。

2. ZSET的使用场景

ZSET的经典使用场景是用来实现排行榜,举几个常见的例子,比如百度热榜:

比如微博热搜榜:

比如微信步数排行榜:

3个场景的实现思路基本一致,接下来,我们以微信步数排行榜为例,了解下如何使用Redis的ZSET,实现微信步数排行榜。

3. 微信步数排行榜的大致实现思路

注意事项:本文的重点是Redis的ZSET的使用,因此只是分析了微信步数排行榜的大致实现思路,实际实现肯定比文中分析的复杂的多。

首先,我们来分析下微信步数排行榜的需求:

  • 排行榜是以日期为单位的,历史日期的排行榜是可以查看的
  • 排行榜可能并不会显示所有好友的步数,比如我的微信有349位好友,但排行榜从来没有显示过这么多,假设最多只显示步数前200的好友
  • 步数是异步更新的,所以每隔一段时间步数同步后,排行榜都会变化
  • 排行榜中,好友头像和微信昵称可以理解为不变的(变动的几率小,就像热搜榜中的标题和Url),但步数和点赞数是可变的

基于以上分析的需求,大致实现思路如下:

  • 使用Redis的ZSET数据结构
  • 设置key时,基于微信号和日期,比如我的微信是zwwhnly,今天的日期是2020-06-01,那么key就可以设计为:StepNumberRanking:zwwhnly:20200601
  • 设置value时,将好友的昵称作为成员member,将好友的步数作为分值score,如下所示:

使用Redis的HASH数据结构,其中key为第2步的key+第3步的成员member,value分别存储好友头像、昵称、步数、点赞数,如下所示:

获取微信步数排行榜时,分为以下2步:

1)先查询出微信步数排行榜中的好友昵称,也就是查询StepNumberRanking:zwwhnly:20200601的值

2)根据获取到的好友昵称,查询好友步数信息,也就是查询StepNumberRanking:zwwhnly:20200601:yst的值

4. 使用到的Redis命令

上面分析出了大致的实现思路,接下来我们讲解下使用到的Redis命令。

4.1 ZADD

执行如下命令初始化微信步数排行榜,以上面图片中的9个好友为例,分2次初始化:

ZADD StepNumberRanking:zwwhnly:20200602 25452 yst 23683 zq 23599 ljx 20391 yyq 19628 XxZz

ZADD StepNumberRanking:zwwhnly:20200602 18261 lxx 16636 zcc 16555 clc 16098 fl

执行完的效果如下图所示:

可以看到,默认是以score正序排列的,也就是步数从少到多排列。

4.2 HMSET

因为展示步数排行榜时,需要展示昵称、头像、步数、点赞数,所以可以借助于Redis的HASH 数据结构来存储,这时就要用到HMSET命令:

执行完的效果如下图所示:

4.3 ZINCRBY

每隔一段时间,好友的步数是会更新的,此时可以使用ZINCRBY命令来更新好友步数,假设我们只更新步数位于前2位好友的步数,给他们的步数增加10,就可以执行以下命令:

ZINCRBY StepNumberRanking:zwwhnly:20200602 10 yst
ZINCRBY StepNumberRanking:zwwhnly:20200602 10 zq

执行完的效果如下图所示:

更新完排行榜里的步数后,不要忘记执行HMSET命令更新好友的步数:

4.4 HINCRBY

当我们在步数排行榜里给好友点赞时,可以使用HINCRBY命令,把上图中的likeNum加1:

HINCRBY StepNumberRanking:zwwhnly:20200602:zq likeNum 1

4.5 ZRANGE

在所有的数据就绪后,剩下的就是查询了,我们可以使用ZRANGE命令获取排行榜里的好友信息:

ZRANGE StepNumberRanking:zwwhnly:20200602 0 -1

可以看出,查询出的好友信息是按步数从少到多排序的,而排行榜应该按步数从多到少排序,这就用到了下面的ZREVRANGE命令。

4.6 ZREVRANGE

ZREVRANGE命令和ZRANGE命令类似,不过是按score倒序的,刚好符合排行榜的场景。

比如执行命令:

ZREVRANGE StepNumberRanking:zwwhnly:20200602 0 -1 WITHSCORES

可以看出,查询出的好友信息按步数从大到小排序,刚好就是在排行榜要展示的顺序。

不过,排行榜一般都不展示所有的数据,这里我们的数据比较少,如果只获取步数top5的好友,就可以执行如下命令:

ZREVRANGE StepNumberRanking:zwwhnly:20200602 0 4 WITHSCORES

如果你要获取top200,就将上面的4修改为199。

4.7 HGETALL

获取到了排行榜里的好友信息,最后一步就是获取这些好友的步数、点赞数、头像、昵称这些信息,也就是我们之前使用HASH数据结构存储的信息,此时我们可以使用HGETALL命令,如下所示:

HGETALL StepNumberRanking:zwwhnly:20200602:yst

如果对这些命令不是很熟悉,可以看下我之前发布的一篇博客:Redis系列(二):Redis的5种数据结构及其常用命令

5. 总结

Redis的ZSET数据结构非常适合用在排行榜的场景,比如百度热搜、微博热搜榜、游戏排行榜、微信步数排行榜,面试官肯定不会问你ZSET都有哪些命令,每个命令的细节等等,但问你如何使用Redis实现微信步数排行榜,就可以了解到你对Redis数据结构的掌握程度。

所以,学习好Redis的5种数据结构的基础很重要,但更重要的是要知道这些数据结构如何使用,每种数据结构用在什么场景最为合适,毕竟要学以致用嘛。

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

(0)

相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  • 微信小程序实现运动步数排行功能(可删除)

    效果图如下所示: wxml <!-- 向左滑动删除功能 --> <view class="item-box"> <view class="items"> <view wx:for="{{list}}" wx:key="{{index}}" class="item"> <view bindtouchstart="touchS" bind

  • redis实现排行榜功能

    redis的zset可以很方便地用来实现排行榜功能,下面简单介绍python如何使用redis实现排行榜功能 加入排行榜 获取redis实例 import redis main_rds = redis.StrictRedis(host='localhost',port=6379,db=0,password='') 全量加入排行榜 注意根据redis包的版本不同,zadd和zincby的传参方式也不同 对于redis 3.0(python的redis包)以下的版本 # 向key为name的zset

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

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

  • Redis 实现“附近的人”功能

    针对"附近的人"这一位置服务领域的应用场景,常见的可使用PG.MySQL和MongoDB等多种DB的空间索引进行实现.而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率.本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度. 操作命令 自Redis 3.2开始,Redis基于geohash和有序集合提供了地理位置相关功能. Redis Geo模块包含了以下6个命令: GEOADD: 将给定的位置对象(纬度.经度.名字)添加

  • 微信js-sdk分享功能接口常用逻辑封装示例

    本文实例讲述了微信js-sdk分享功能接口常用逻辑封装.分享给大家供大家参考,具体如下: 微信js-sdk 1.0,分享说明: 1.目前支持的分享接口5个,其中分享腾讯微博基本可以忽略 2.接口只是定义分享时的数据,没有提供触发分享功能 一.在ready事件使用使用示例 //分享对象使用 var shareData={ title:'分享标题', desc:'分享描述', link:'http://www.gongjuji.net', imgUrl:'http://www.gongjuji.ne

  • iOS高仿微信表情输入功能代码分享

    最近项目需求,要实现一个类似微信的的表情输入,于是把微信的表情扒拉出来,实现了一把.可以从这里下载源码.看起来表情输入没有多少东西,不外乎就是用NSTextAttachment来实现图文混排,结果在实现的过程中遇到了很多小问题,接下来会一一介绍遇到过的坑.先上一张效果图: 一.实现表情选择View(WKExpressionView) 具体的实现就不细说了,主要功能就是点击表情时,将对应表情的图片名称通知给delegate. 二.实现表情textView(WKExpressionTextView)

  • IOS实现微信授权登录功能

    微信是一个在开发中经常会使用到的平台,比如微信登录.授权.支付.分享.今天我们来看看如何在自己的应用里面集成微信授权. 1.微信授权的定义 微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等. 2.微信授权的步骤 第三方发

随机推荐