支持和反对,点赞等在互联网上大量存在,我们常用的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;
}
}
5254

被折叠的 条评论
为什么被折叠?



