《Redis应用实例》Java实现(21):投票


支持和反对,点赞等在互联网上大量存在,我们常用的APP普遍都有此功能,比如抖音、京东、微信等,成为搜集用户意见的一个重要手段。
本例通过redis来实现投票功能。
 

package com.foxbill.redisinaction;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import java.util.List;

/**
 * 投票
 */
public class Chapter21 {
    static String key_prefix_up="Chapter21:vote:topic:up";
    static String key_prefix_down ="Chapter21:vote:topic:down";

    static public void start(Jedis jedis) {

        cleanData(jedis);

        //
        String target="10086";

        String user1="user1";
        String user2="user2";
        String user3="user3";

        //支持10086:user1,user3
        up(jedis, target,user1);
        up(jedis, target,user3);
        //反对10086:user2
        down(jedis, target,user2);
        //支持者数量
        long upCount = upCount(jedis, target);
        //反对者数量
        long downCount = downCount(jedis, target);
        //投票总数
        long totalCount = total(jedis, target);
        //user1是否参与了投票
        boolean votedUser1 = isVoted(jedis, target, user1);
        //userXXX是否参与了投票
        boolean votedUserXXX = isVoted(jedis, target, "userXXX");

        System.out.printf("upCount:%d,downCount:%d,totalCount:%d,votedUser1:%b ,votedUserXXX:%b",upCount,downCount,totalCount,votedUser1,votedUserXXX);
    }
    //清理数据,便于反复测试
    private static void cleanData(Jedis jedis) {
        RedisUtils.deleteKeysWithPrefix(jedis,key_prefix_up);
        RedisUtils.deleteKeysWithPrefix(jedis,key_prefix_down);
    }

    //支持
    public static boolean up(Jedis jedis, String target, String user) {
        String keyUp = String.format("%s:%s",key_prefix_up,target);
        String keyDown = String.format("%s:%s",key_prefix_down,target);

        Pipeline pipelined = jedis.pipelined();
        pipelined.sadd(keyUp,user);
        pipelined.srem(keyDown,user);
        List<Object> results = pipelined.syncAndReturnAll();
        Object o1 = results.get(0);
        Object o2 = results.get(1);
        boolean lenientSuccess = (Long)o1 == 1;
        return lenientSuccess;
    }

    //反对
    public static boolean down(Jedis jedis, String target, String user) {
        String keyUp = String.format("%s:%s",key_prefix_up,target);
        String keyDown = String.format("%s:%s",key_prefix_down,target);
        Pipeline pipelined = jedis.pipelined();
        pipelined.sadd(keyDown,user);
        pipelined.srem(keyUp,user);
        List<Object> results = pipelined.syncAndReturnAll();
        Object o1 = results.get(0);
        Object o2 = results.get(1);
        boolean lenientSuccess = (Long)o1 == 1;
        return lenientSuccess;
    }

    //是否已投票
    public static boolean isVoted(Jedis jedis, String target, String user) {
        String keyUp = String.format("%s:%s",key_prefix_up,target);
        String keyDown = String.format("%s:%s",key_prefix_down,target);
        Pipeline pipelined = jedis.pipelined();
        Response<Boolean> sismemberUp = pipelined.sismember(keyUp, user);
        Response<Boolean> sismemberDown = pipelined.sismember(keyDown, user);
        pipelined.sync();
        return sismemberUp.get() || sismemberDown.get();
    }

    //取消投票
    public static boolean unVote(Jedis jedis, String target, String user) {
        String keyUp = String.format("%s:%s",key_prefix_up,target);
        String keyDown = String.format("%s:%s",key_prefix_down,target);
        Pipeline pipelined = jedis.pipelined();
        pipelined.srem(keyDown,user);
        pipelined.srem(keyUp,user);
        List<Object> results = pipelined.syncAndReturnAll();
        Object o1 = results.get(0);
        Object o2 = results.get(1);
        boolean lenientSuccess = (Long)o1 == 1 || (Long)o2 == 1;
        return lenientSuccess;
    }

    //支持的数量
    public static long upCount(Jedis jedis, String target) {
        String keyUp = String.format("%s:%s",key_prefix_up,target);
        long scard = jedis.scard(keyUp);
        return scard ;
    }

    //反对的数量
    public static long downCount(Jedis jedis, String target) {
        String keyDown = String.format("%s:%s",key_prefix_down,target);
        long scard = jedis.scard(keyDown);
        return scard ;
    }

    //投票合计
    public static long total(Jedis jedis, String target) {
        String keyUp = String.format("%s:%s",key_prefix_up,target);
        String keyDown = String.format("%s:%s",key_prefix_down,target);
        Pipeline pipelined = jedis.pipelined();
        pipelined.scard(keyUp);
        pipelined.scard(keyDown);
        List<Object> results = pipelined.syncAndReturnAll();
        Object o1 = results.get(0);
        Object o2 = results.get(1);
        return (long)o1+(long)o2;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值