实战: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进行交互,利用其高性能和丰富的数据结构来实现这些常见的功能。希望这些代码示例能帮助你更好地理解和实现相关功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT vs2019编译报错LNK2019无法解析的外部符号

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "public: __cdecl Dialog_Setting::Dialog_Setting(class QWidget *)" (??0Dialog_SettingQEAAPEAVQWidgetZ)&#xff0c;函数 "public: __cdecl QtWid…

工业现场实测,焦化厂导烟车与装煤车风机实现无人作业

一、项目背景 作为我国重要的能源行业之一&#xff0c;焦化行业在国民经济中扮演着重要角色&#xff0c;焦化工艺是高温、高压、有毒物质等因素共同作用下进行的&#xff0c;因此存在着安全隐患&#xff0c;并伴有环境污染&#xff0c;改善焦化工艺的安全和环保问题是当前亟待…

Golang | Leetcode Golang题解之第287题寻找重复数

题目&#xff1a; 题解&#xff1a; func findDuplicate(nums []int) int {slow, fast : 0, 0for slow, fast nums[slow], nums[nums[fast]]; slow ! fast; slow, fast nums[slow], nums[nums[fast]] { }slow 0for slow ! fast {slow nums[slow]fast nums[fast]}return s…

分布式搜索引擎ES-DSL搜索详解

1.DSL搜索-入门语法 建立索引&#xff1a; xxx(自定义名称) 自定义mapping: POST /shop/_mapping {"properties": {"id": {"type": "long"},"age": {"type": "integer"},"username": {&quo…

Springboot 多数据源事务

起因 在一个service方法上使用的事务,其中有方法是调用的多数据源orderDB 但是多数据源没有生效,而是使用的primaryDB 原因 spring 事务实现的方式 以 Transactional 注解为例 (也可以看 TransactionTemplate&#xff0c; 这个流程更简单一点)。 入口&#xff1a;ProxyTransa…

Java语言程序设计——篇九(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 内部类 概述内部类—内部类的分类成员内部类实战演练 局部内部类实战演练 匿名内部类实战演练 静态内部类实战演练 概述 内部类或嵌套类&#…

sheng的学习笔记-AI-公式-指数加权移动平均(EWMA)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 指数加权移动平均&#xff08;Exponential Weighted Moving Average&#xff09;&#xff0c;是一种常用的序列处理方式 看例子&#xff0c;首先这是一年365天的温度散点图&#xff0c;以天数为横坐标&#xff0…

【学一点儿前端】本地或jenkins打包报错:getaddrinfo ENOTFOUND registry.nlark.com.

问题 今天jenkins打包一个项目&#xff0c;发现报错了 error An unexpected error occurred: "https://registry.nlark.com/xxxxxxxxxx.tgz: getaddrinfo ENOTFOUND registry.nlark.com". 先写解决方案 把yarn.lock文件里面的registry.nlark.com替换为registry.npmmi…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十八章 中断下文之tasklet

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

全球性“微软蓝屏”事件及其对网络安全和系统稳定性的深远影响

近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件源于美国电脑安全技术公司“众击”提供的一个带有“缺陷”的软件更新&#xff0c;它如…

女人内裤怎么洗才是最干净?内衣裤洗衣机怎么样?哪个牌子更好?

最近刚好用到一款比较好用的洗内衣裤洗衣机&#xff01;如果你也和我一样有洗内衣裤烦恼的&#xff0c;或者可以看看&#xff01; 内衣裤作为贴身穿的衣服&#xff0c;我是不会把它和外衣一起清洗的&#xff0c;而家里面的大洗衣机已经担起了清洗外衣的工作&#xff01; 朋友们…

JVM 内存分析工具 Memory Analyzer Tool(MAT)入门(一)

一、打开 jvisualvm &#xff08;VisualVM 是一款集成了 JDK 命令行工具和轻量级剖析功能的可视化工具。 设计用于开发和生产。&#xff09; 打开 jvisualvm.exe 工具会出现如下一些监控指标 二、VisualVM可以根据需要安装不同的插件&#xff0c;每个插件的关注点都不同&#x…

uniapp vue3 使用画布分享或者收藏功能

使用HBuilder X 开发小程序&#xff0c;大多数的画布插件很多都是vue2的写法&#xff0c;vue3的很少 我自己也试了很多个插件&#xff0c;但是有一些还是有问题&#xff0c;不好用 海报画板 - DCloud 插件市场 先将插件导入项目中 自己项目亲自用过&#xff0c;功能基本是完善…

谷粒商城-性能压测

1.压力测试 在项目上线前对其进行压力测试(以每个微服务为单元) 目的:找到系统能承载的最大负荷,找到其他测试方法更难发现的错误(两种类型:内存泄漏,并发与同步). 1.性能指标 响应时间(Response Time (RT)): 响应时间 指用户从客户端发起一个请求开始,到客户端接收到从服务…

【第五天】HTTPS和HTTP有哪些区别,HTTPS的工作原理

HTTPS和HTTP的区别&#xff1a; 1.安全性&#xff1a; HTTP是明文传输协议&#xff0c;数据在传输的过程中不加密&#xff0c;容易被窃听和篡改。HTTPS通过使用SSL或TLS协议对数据进行加密&#xff0c;确保传输的数据在网络上是安全的&#xff0c;不容易被窃取和篡改。 2.加…

leetcode-104. 二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,n…

自动化测试 pytest 中 scope 限制 fixture使用范围!

导读 fixture 是 pytest 中一个非常重要的模块&#xff0c;可以让代码更加简洁。 fixture 的 autouse 为 True 可以自动化加载 fixture。 如果不想每条用例执行前都运行初始化方法(可能多个fixture)怎么办&#xff1f;可不可以只运行一次初始化方法&#xff1f; 答&#xf…

一招就能轻松解决猫咪浮毛?最新值得买的浮毛空气净化器汇总分享

那次逛街后去朋友家&#xff0c;她家猫哈基米特别热情&#xff0c;一开门就扑过来&#xff0c;朋友直接给了个大拥抱加亲亲。汗水和猫毛全粘身上了&#xff0c;看着都让人头皮痒。好多铲屎官都抱怨&#xff0c;就算天天梳毛&#xff0c;家里还是到处都是毛&#xff0c;毕竟家里…

理解文件系统(上)

模拟实现文件库 创建文件以便理解 自己想实现的文件接口&#xff0c;进行模拟实现 模拟的头文件要准备的头文件 open接口的实现 write接口的实现fflush接口的实现 flose接口的实现 文件实现 stdio.h stdio.c test.c makefile 创建makefile 编译运行 执行后输出log.txt,看…

【虚拟机】 VMware截图版详细安装教程

VMware-workstation-full-17.5.1-23298084 的安装&#xff0c;详细安装过程。 1.以管理员身份运行安装包 点击文件&#xff0c;右键打开&#xff0c;以管理员身份运行&#xff1b; 2.根据安装提示&#xff0c;重启电脑&#xff1b; &#xff08;重启与否看自己电脑情况&…