用redis实现一个投票(java版)

代码

import java.util.*;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ZParams;

public class Vote {
    private static final int ONE_WEEK_IN_SECONDS = 7 * 86400;
    private static final int VOTE_SCORE = 432;
    private static final int ARTICLES_PER_PAGE = 25;

    public String postArticle(Jedis conn,String user,String title,String link){//发表文章
        String articleId=String.valueOf(conn.incr("article:"));//自动匹配一个文章id号
        String voted="voted:"+articleId;
        conn.sadd(voted, user);  //表示该用户已为这篇文章投票。
        conn.expire(voted, ONE_WEEK_IN_SECONDS);//给这篇文章设定投票期限
        long now=System.currentTimeMillis()/1000;
        String article="article:"+articleId;
        HashMap<String, String> articleData=new HashMap<>();//对文章的信息进行封装
        articleData.put("title",title);
        articleData.put("link", link);
        articleData.put("user", user);
        articleData.put("now", String.valueOf(now));
        articleData.put("votes", "1");
        articleData.put("againsts", "0");
        conn.hmset(article, articleData);//hmset用于同时将多个键值对存储于一个哈希表内
        conn.zadd("score:", now+VOTE_SCORE,article);//将文章添加到根据评分排序的有序集合
        conn.zadd("time:", now, article);//将文章添加到根据时间排序的有序集合中
        return articleId;
    }
    public void articleVote(Jedis conn,String user,String article,boolean against){//投票或者投反对票
        long cutoff=(System.currentTimeMillis()/1000);//
        if(conn.zscore("time:", article)+ONE_WEEK_IN_SECONDS<cutoff){//判读文章是否过期
            return;
        }
        String articleId=article.substring(article.indexOf(":")+1);
        if(against){ //投反对票
            if(conn.sadd("against:"+articleId, user)==1){
                conn.hincrBy(article, "against", 1);  //给反对票数组自增1
            }
        }
        else if(conn.sadd("voted:"+articleId, user)==1){//判读该用户是否对这篇文章投过票
            conn.zincrby("score:", VOTE_SCORE, article);//为score:表中的article自增分数
            conn.hincrBy(article, "votes", 1);//为article:表中"votes"自增1
        }
    }
    public void addGroups(Jedis conn,String articleId,String[] toAdd){
        String article="article:"+articleId;
        for(String group:toAdd){
            conn.sadd("group:"+group, article);
        }
    }
    public void removeGroups(Jedis conn,String articleId,String[] toRemove){
        String article="article:"+articleId;
        for(String group:toRemove){
            conn.srem("group:"+group, article);
        }
    }
    public List<Map<String, String>> getArticles(Jedis conn,int page){
        return getArticles(conn, page, "score:");
    }
    public List<Map<String, String>> getArticles(Jedis conn,int page,String order){//根据页数和排序方式返回所有文章
        int start=(page-1)*ARTICLES_PER_PAGE;
        int end=start+ARTICLES_PER_PAGE-1;
        Set<String> ids=conn.zrevrange(order, start, end);//获取从大到小的顺序的集合
        List<Map<String, String>> articles=new ArrayList<>();
        for(String id:ids){
            Map<String, String> articleData=conn.hgetAll(id);
            articleData.put("id", id);
            articles.add(articleData);  
        }
        return articles;
    }
    public List<Map<String, String>> getGroupArticles(Jedis conn,String group,int page){
        return getGroupArticles(conn, group, page, "score:");
    }
    public List<Map<String, String>> getGroupArticles(Jedis conn,String group,int page,String order){
        String key=order+group;
        if(!conn.exists(key)){
            ZParams params=new ZParams().aggregate(ZParams.Aggregate.MAX);
            conn.zinterstore(key, params,"group:"+group,order);
            conn.expire(key, 60);                                    
        }
        return getArticles(conn, page, key);
    }
    private void printArticles(List<Map<String, String>> articles){
        for(Map<String, String> article:articles){
            System.out.println("  id: "+article.get("id"));
            for(Map.Entry<String, String> entry:article.entrySet()){
                if(entry.getKey().equals("id"))
                    continue;
                System.out.println("    "+entry.getKey()+": "+entry.getValue());
            }       
        }
    }
}
首先,需要使用Java Redis客户端连接到Redis数据库。可以使用Jedis或Lettuce等客户端库。 接下来,假设我们要实现一个简单的投票系统,其每个用户可以对特定主题进行投票。可以使用Redis的Hash数据结构来存储投票信息。 为此,可以使用以下代码来实现投票: ```java import redis.clients.jedis.Jedis; public class Vote { private Jedis jedis; public Vote() { jedis = new Jedis("localhost"); } public void voteForTopic(String topic, String user) { String key = "votes:" + topic; jedis.hincrBy(key, user, 1); } public long getVotesForTopic(String topic) { String key = "votes:" + topic; return jedis.hlen(key); } public long getVotesForUser(String topic, String user) { String key = "votes:" + topic; String votes = jedis.hget(key, user); return (votes != null) ? Long.parseLong(votes) : 0; } } ``` 在上面的代码,我们首先初始化了Jedis客户端连接到Redis数据库。然后,我们定义了三个方法: - `voteForTopic`方法用于让用户对特定主题进行投票。我们使用Redis的`HINCRBY`命令将用户的投票数加1,并将其存储在Redis的Hash数据结构。 - `getVotesForTopic`方法用于获取特定主题的总投票数。我们使用Redis的`HLEN`命令来获取Hash数据结构键值对的数量。 - `getVotesForUser`方法用于获取特定用户对特定主题的投票数。我们使用Redis的`HGET`命令来获取指定键的值,并将其转换为long类型。 使用以上代码,我们可以轻松地实现一个简单的投票系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值