当前位置: 首页 > news >正文

实战:Redis实现排行榜、点赞和关注功能的基本操作

Redis是一款高性能的内存数据库,以其极快的读写速度和丰富的数据结构广泛应用于各种互联网服务中。本文将介绍如何基于Redis实现排行榜、点赞和关注功能,并提供相应的代码示例。

实战:Redis性能测试、调优和使用规范-CSDN博客

规范:Redis规范-CSDN博客

实战:搞懂Redisson、分布式锁、限流器_redisson分布式限流-CSDN博客

实践:Redis6.0配置文件解读_redis 6.0-CSDN博客

科普文:深入理解Redis-CSDN博客

1. Redis简介

Redis(Remote Dictionary Server)是一种开源的内存数据结构存储系统,通常用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、散列、列表、集合、有序集合等,并提供持久化选项。

主要特点:

  • 高速读写性能

  • 丰富的数据结构

  • 主从复制和高可用性

  • 持久化支持

这些特性使得Redis非常适合用于实现实时性要求较高的功能,比如排行榜、点赞和关注。

2. 环境配置

在开始之前,我们需要配置开发环境。本文使用Jedis库来与Redis进行交互。首先,在你的项目中引入Jedis库。对于Maven项目,可以在pom.xml中添加以下依赖:

<dependency>    <groupId>redis.clients</groupId>    <artifactId>jedis</artifactId>    <version>3.7.0</version></dependency>

接下来,确保你的系统已经安装并运行Redis服务器。

3. 排行榜功能的实现

概述

排行榜功能是许多应用中的常见需求,比如游戏中的积分排名、网站上的热门文章排行等。Redis提供的有序集合(Sorted Set)数据结构非常适合实现排行榜功能,因为它可以自动根据分数排序,并支持范围查询。

实现步骤

  1. 数据结构选择:使用有序集合(Sorted Set),其中成员是用户ID或项目ID,分数是对应的积分或权重。

  2. 添加和更新分数:使用ZADD命令添加或更新成员的分数。

  3. 获取排行榜:使用ZRANGE命令获取排行榜中的成员及其分数。

  4. 获取成员排名:使用ZRANK命令获取成员在排行榜中的排名。

代码示例

import redis.clients.jedis.Jedis;import redis.clients.jedis.Tuple;
import java.util.Set;
public class Leaderboard {
    private static final String LEADERBOARD_KEY = "leaderboard";    private Jedis jedis;
    public Leaderboard(Jedis jedis) {        this.jedis = jedis;    }
    // 添加或更新用户积分    public void addScore(String userId, double score) {        jedis.zadd(LEADERBOARD_KEY, score, userId);    }
    // 获取排行榜前N名    public Set<Tuple> getTopN(int n) {        return jedis.zrevrangeWithScores(LEADERBOARD_KEY, 0, n - 1);    }
    // 获取用户排名    public long getRank(String userId) {        Long rank = jedis.zrevrank(LEADERBOARD_KEY, userId);        return rank != null ? rank + 1 : -1;    }
    public static void main(String[] args) {        try (Jedis jedis = new Jedis("localhost")) {            Leaderboard leaderboard = new Leaderboard(jedis);
            leaderboard.addScore("user1", 100);            leaderboard.addScore("user2", 150);            leaderboard.addScore("user3", 120);
            Set<Tuple> top3 = leaderboard.getTopN(3);            for (Tuple tuple : top3) {                System.out.println(tuple.getElement() + ": " + tuple.getScore());            }
            System.out.println("user1's rank: " + leaderboard.getRank("user1"));        }    }}

4. 点赞功能的实现

概述

点赞功能常用于社交平台或内容网站,用于表示用户对某个内容的喜爱。Redis的集合(Set)数据结构可以有效地实现点赞功能,每个被点赞的内容对应一个集合,集合中存储点赞用户的ID。

实现步骤

  1. 数据结构选择:使用集合(Set),集合名为内容ID,集合中存储点赞用户的ID。

  2. 添加点赞:使用SADD命令将用户ID添加到集合中。

  3. 取消点赞:使用SREM命令将用户ID从集合中移除。

  4. 获取点赞数:使用SCARD命令获取集合中的元素数量。

  5. 检查用户是否点赞:使用SISMEMBER命令检查集合中是否包含用户ID。

代码示例

import redis.clients.jedis.Jedis;
public class LikeService {
    private Jedis jedis;
    public LikeService(Jedis jedis) {        this.jedis = jedis;    }
    // 点赞    public void like(String contentId, String userId) {        jedis.sadd("likes:" + contentId, userId);    }
    // 取消点赞    public void unlike(String contentId, String userId) {        jedis.srem("likes:" + contentId, userId);    }
    // 获取点赞数    public long getLikes(String contentId) {        return jedis.scard("likes:" + contentId);    }
    // 检查用户是否点赞    public boolean hasLiked(String contentId, String userId) {        return jedis.sismember("likes:" + contentId, userId);    }
    public static void main(String[] args) {        try (Jedis jedis = new Jedis("localhost")) {            LikeService likeService = new LikeService(jedis);
            likeService.like("post1", "user1");            likeService.like("post1", "user2");            likeService.unlike("post1", "user1");
            System.out.println("post1 likes: " + likeService.getLikes("post1"));            System.out.println("user1 has liked post1: " + likeService.hasLiked("post1", "user1"));        }    }}

5. 关注功能的实现

概述

关注功能是社交网络中的核心功能,用户可以关注其他用户以获取其动态。Redis的集合(Set)数据结构也适合实现关注功能,分别用两个集合存储每个用户的关注列表和粉丝列表。

实现步骤

  1. 数据结构选择:使用集合(Set),一个集合存储关注列表,一个集合存储粉丝列表。

  2. 关注用户:使用SADD命令将被关注用户ID添加到关注列表,将关注者ID添加到粉丝列表。

  3. 取消关注:使用SREM命令将被关注用户ID从关注列表移除,将关注者ID从粉丝列表移除。

  4. 获取关注列表和粉丝列表:使用SMEMBERS命令获取集合中的所有元素。

  5. 检查是否关注:使用SISMEMBER命令检查集合中是否包含用户ID。

代码示例

import redis.clients.jedis.Jedis;
import java.util.Set;
public class FollowService {
    private Jedis jedis;
    public FollowService(Jedis jedis) {        this.jedis = jedis;    }
    // 关注用户    public void follow(String userId, String targetId) {        jedis.sadd("following:" + userId, targetId);        jedis.sadd("followers:" + targetId, userId);    }
    // 取消关注    public void unfollow(String userId, String targetId) {        jedis.srem("following:" + userId, targetId);        jedis.srem("followers:" + targetId, userId);    }
    // 获取关注列表    public Set<String> getFollowing(String userId) {        return jedis.smembers("following:" + userId);    }
    // 获取粉丝列表    public Set<String> getFollowers(String userId) {        return jedis.smembers("followers:" + userId);    }
    // 检查是否关注    public boolean isFollowing(String userId, String targetId) {        return jedis.sismember("following:" + userId, targetId);    }
    public static void main(String[] args) {        try (Jedis jedis = new Jedis("localhost")) {            FollowService followService = new FollowService(jedis);
            followService.follow("user1", "user2");            followService.follow("user1", "user3");            followService.unfollow("user1", "user2");
            System.out.println("user1 is following: " + followService.getFollowing("user1"));            System.out.println("user2's followers: " + followService.getFollowers("user2"));            System.out.println("user1 is following user2: " + followService.isFollowing("user1", "user2"));        }    }}

结论

本文介绍了如何使用Java语言和Redis实现排行榜、点赞和关注功能。通过Jedis库,我们可以轻松地与Redis进行交互,利用其高性能和丰富的数据结构来实现这些常见的功能。希望这些代码示例能帮助你更好地理解和实现相关功能。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 谷粒商城实战笔记-59-商品服务-API-品牌管理-使用逆向工程的前后端代码
  • mysql中You can’t specify target table for update in FROM clause错误
  • Android SurfaceFlinger——GraphicBuffer内存申请(三十)
  • 基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码
  • 从json到protobuf,接口效率的提升
  • 领略诗词之妙,发觉生活之美。
  • 机器学习课程学习周报五
  • 初学Mybatis之 Lombok 篇
  • 微信小程序安装vant组件库和使用
  • Python3网络爬虫开发实战(6)异步爬虫
  • 速盾:cdn加速能不能防御攻击?
  • 掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了
  • 02 Redis安装与启动
  • 【c++刷题笔记-图论】day52: 101.孤岛的总面积 、102.沉没孤岛 、103.水流问题 、104.建造最大岛屿
  • C# 多线程Paralle使用
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【node学习】协程
  • 5、React组件事件详解
  • Java 最常见的 200+ 面试题:面试必备
  • JS+CSS实现数字滚动
  • js操作时间(持续更新)
  • linux安装openssl、swoole等扩展的具体步骤
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • nodejs实现webservice问题总结
  • Spark RDD学习: aggregate函数
  • v-if和v-for连用出现的问题
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 今年的LC3大会没了?
  • 判断客户端类型,Android,iOS,PC
  • 如何用vue打造一个移动端音乐播放器
  • 微信小程序开发问题汇总
  • 小程序开发中的那些坑
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ​flutter 代码混淆
  • #162 (Div. 2)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (12)Linux 常见的三种进程状态
  • (3)(3.5) 遥测无线电区域条例
  • (55)MOS管专题--->(10)MOS管的封装
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (javascript)再说document.body.scrollTop的使用问题
  • (JS基础)String 类型
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (转)树状数组
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Core 中间件与过滤器
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net mvc部分视图
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 流——流的类型体系简单介绍
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET正则基础之——正则委托