AliCloudDB for redis应用场景之实现帖子排序

简介:

AliCloudDB for redis应用场景之实现帖子排序

场景介绍

各大论坛帖子通常会有各种排序方式方便用户查看,比如按发帖时间排序,按回复时间排序,按回复数排序等,这种场景对响应时间要求较高,因此可以选择AliCloudDB for redis来缓存排序信息。对这种TOP N 的场景,使用AliCloudDB for redis的zset结构存储比较合适

业务设计

假设论坛某版块需要按发帖时间和按回复时间两种排序方式,那么对于第一个种按发帖时间的数据结构可以这样设计:

key:帖子版块id(唯一标识)+ 排序type
score:发帖时间
member:帖子id

同理按回复时间的数据结构将score改回回复时间即可

当有新帖子时,用zadd接口写入,获取帖子列表时,用zrangebyscore接口展示帖子,删除帖子时,用zrem

代码示例

package com.aliyun; 
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import redis.clients.jedis.Jedis;

public class SamplePostsRank {
    static int POST_NUM = 20;

    public void SAMPLE_PostsRank()
    {
        String host = "127.0.0.1";
        int port = 6728;
        try {
            Jedis jedis = new Jedis(host, port);
            String authString = jedis.auth("INSTANCEID:PASSWORD");
            if (!authString.equals("OK"))
            {
                //log.error("AUTH Failed: " + authString);
                return;
            }
            String key = "Test-Board";
            List<String> postList = new ArrayList<String>();
            for (int i = 0; i < POST_NUM; ++i)
            {
                postList.add(UUID.randomUUID().toString());
            }
            String postType ="RepNum";
            //Set Score
            for (int i = 0; i < postList.size(); i++)
            {
                String postId = postList.get(i);
                String member = postId + "-" + postType;
                int score = (int)(Math.random() % 100);
                jedis.zadd(key, score, member);
                System.out.println("POST: " + postId + " ReplyNumber: " +             score);
            }
            Set<String> scoreList = jedis.zrangeByScore(key, 80, 100);
            for (String str : scoreList) {  
                System.out.println(str);  
            }  
            jedis.quit();
            jedis.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}
目录
相关文章
|
canal NoSQL 关系型数据库
Redis应用—7.大Value处理方案
本文介绍了一种用于监控Redis大key的方案设计及其实现步骤。主要内容包括:方案设计、安装与配置环境、binlog数据消费者。
799 29
Redis应用—7.大Value处理方案
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
651 86
|
监控 NoSQL Java
场景题:百万数据插入Redis有哪些实现方案?
场景题:百万数据插入Redis有哪些实现方案?
393 1
场景题:百万数据插入Redis有哪些实现方案?
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
639 4
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
1104 61
Redis应用—6.热key探测设计与实践
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
981 2
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
619 0
|
NoSQL 网络协议 Java
【Azure Redis】Redis服务端的故障转移(Failover)导致客户端应用出现15分钟超时问题的模拟及解决
在使用 Azure Cache for Redis 服务时,因服务端维护可能触发故障转移。Linux 环境下使用 Lettuce SDK 会遇到超时 15 分钟的已知问题。本文介绍如何通过重启 Primary 节点主动复现故障转移,并提供多种解决方案,包括调整 TCP 设置、升级 Lettuce 版本、配置 TCP_USER_TIMEOUT 及使用其他 SDK(如 Jedis)来规避此问题。
574 1
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
1254 16
Redis应用—8.相关的缓存框架
|
NoSQL 算法 安全
redis分布式锁在高并发场景下的方案设计与性能提升
本文探讨了Redis分布式锁在主从架构下失效的问题及其解决方案。首先通过CAP理论分析,Redis遵循AP原则,导致锁可能失效。针对此问题,提出两种解决方案:Zookeeper分布式锁(追求CP一致性)和Redlock算法(基于多个Redis实例提升可靠性)。文章还讨论了可能遇到的“坑”,如加从节点引发超卖问题、建议Redis节点数为奇数以及持久化策略对锁的影响。最后,从性能优化角度出发,介绍了减少锁粒度和分段锁的策略,并结合实际场景(如下单重复提交、支付与取消订单冲突)展示了分布式锁的应用方法。
1254 3