Redis实现文章投票功能
Redis的具体操作这里就不说了,说一下需求和设计思路。
需求:自己实现一个文章投票的功能
1.能够按照时间分页倒叙查看文章信息
2.能够给文章投票,一个用户给一篇文章只能投票一次
3.需要记录分值。每次投票后就+10分
思路:
1.设计一个Hash,用于存储文章的基本信息(标题、内容、创建人)。键:article:1
2.设计一个Set,用于记录一篇文章被哪些用户投过票。键:vole:1
3.设计一个ZSet,用于记录每一篇文章的分值。键:score
RedisUtil.java
package cn.duanjt; import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; /**
* Redis公共操作类
* @author 段江涛
* @date 2018-12-29
*/
public class RedisUtil {
JedisPool pool = null; public RedisUtil(String host, int port) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(5);
config.setMaxWaitMillis(100);
config.setTestOnBorrow(true); pool = new JedisPool(config, host, port);
} public Jedis getJedis(){
return pool.getResource();
} public void dispose(Jedis jedis){
pool.returnResourceObject(jedis);
}
}
AppTest.java (测试代码)
package cn.duanjt; import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set; import org.junit.Before;
import org.junit.Test; import redis.clients.jedis.Jedis; public class AppTest {
RedisUtil redis = null;
int userId = 200;//用户编号,可修改后执行下面的相关方法
int artId = 3;//文章编号,可修改后执行下面的相关方法 /**
* 初始化
*/
@Before
public void load() {
String host = "172.23.88.107";
int port = 6379;
redis = new RedisUtil(host, port);
} /**
* 发表文章
* 逻辑:
* 1.文章编号采用incr方法自增长
* 2.定义Redis的Hash类型存放文章信息,键采用 "article:"+文章编号的方式
* 3.定义Set用于记录哪些用户给这篇文章投过票,键采用 "vole:"+文章编号的方式
* 4.定义ZSet用于记录每篇文章的分值,方便排序,键使用"score"
*/
@Test
public void addArticle() {
Jedis jedis = redis.getJedis();
// 定义发布文章:编号、标题、内容、创建人 Hash
HashMap<String, String> map = new HashMap<String, String>();
long id = jedis.incr("article:");// 文章id,自增长
map.put("title", "文章标题->" + id);
map.put("content", "文章内容->" + id);
map.put("user_id", String.valueOf(userId));
map.put("create_time", getDate());
jedis.hmset("article:" + id, map); // 自己给自己投上一票 Set
jedis.sadd("vole:" + id, userId + "");
// 给自己+10分 ZSet
jedis.zadd("score", 10, id + ""); printArticle(jedis, id); redis.dispose(jedis);
} /**
* 给文章投票
* 逻辑:
* 1.记录文章投票用户集合的Set新增一条数据sadd,如果返回1表示新增成功,返回0表示已存在
* 2.记录分值的ZSet调用zincrby方法加10分
*/
@Test
public void voteArticle() {
Jedis jedis = redis.getJedis();
try {
// 查找文章
if (!jedis.exists("article:" + artId)) {
System.out.println("文章:" + artId + " 不存在.");
return;
}
// 用户投票
if (jedis.sadd("vole:" + artId, userId + "") == 0) {
System.out.println("用户:" + userId + " 已对文章:" + artId + " 进行过投票,不可重复投票");
return;
}
// +10分
jedis.zincrby("score", 10, artId + "");
printArticle(jedis, artId);
} finally {
redis.dispose(jedis);
}
} /**
* 查看文章信息
* 逻辑:就是简单的Hash的数据获取hmget
*/
@Test
public void detailArticle() {
Jedis jedis = redis.getJedis();
try {
printArticle(jedis, artId);
} finally {
redis.dispose(jedis);
}
} /**
* 按分值从高到低排序
* 1.调用ZSet的zrevrange方法根据分值倒序,获得一个集合
* 2.循环集合去Hash中查询文章信息
*/
@Test
public void allArticle() {
Jedis jedis = redis.getJedis();
try {
Set<String> set = jedis.zrevrange("score", 0, 1000);// 返回的是文章编号
for (String aId : set) {
System.out.println("<<=================================================>>");
printArticle(jedis, Integer.parseInt(aId));
} } finally {
redis.dispose(jedis);
}
} /**
* 打印文章信息,参数是文章的id
* @param jedis
* @param id
*/
private void printArticle(Jedis jedis, long id) {
/* 打印日志 */
System.out.println("***********************");
List<String> list = jedis.hmget("article:" + id, "title", "content", "user_id", "create_time");
System.out.println("文章编号:" + id);
System.out.println("文章标题:" + list.get(0));
System.out.println("文章内容:" + list.get(1));
System.out.println("发布用户:" + list.get(2));
System.out.println("发布时间:" + list.get(3));
System.out.println("***********************");
double card = jedis.zscore("score", id + "");
System.out.println("文章分值:" + card); Set<String> set = jedis.smembers("vole:" + id);
System.out.println("给文章投票的用户有:" + String.join(",", set));
} /**
* 获取当前时间
* @return
*/
private String getDate() {
java.text.DateFormat format1 = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = format1.format(new Date());
return s;
} }
总结:
1.使用Redis之前一定要先设计好,写代码才能保证思路清晰。
2.设计和思路文档一定要保存好,不然其它同事接手会很懵逼。
3.上面的两个类,拷过去就可以执行,看效果。
Redis实现文章投票功能的更多相关文章
- 使用redis构建文章投票系统
首先,我得说明这篇博客基本上就是<<redis in action>>第一章内容的读书笔记. 需求 首先,说明一下,我们的需求 用户可以发表文章,发表时,自己就默认的给自己的文 ...
- 使用Redis构建文章投票网站
涉及到的key: 1. article_time, 记录文章的发布时间,zset结构 2. article_score, 记录文章的得分, zset结构 得分 = 发布时间 + 投票用户数 X 432 ...
- thinkphp redis实现文章点赞功能并同步入mysql
<?php namespace app\common\controller; use think\App; use think\facade\Cache; use think\facade\Db ...
- .Net Redis实战——实现文章投票并排序
本系列文章为学习Redis实战一书记录的随笔. 软件和环境版本:Redis:5.0.7 .Net 5.0 文中不会对Redis基础概念做过多介绍. Redis数据类型和命令可在菜鸟教程学习:http ...
- redis 实例2 构建文章投票网站后端
redis 实例2 构建文章投票网站后端 1.限制条件 一.如果网站获得200张支持票,那么这篇文章被设置成有趣的文章 二.如果网站发布的文章中有一定数量被认定为有趣的文章,那么这些文章需要被设置 ...
- Redis 实战 —— 02. Redis 简单实践 - 文章投票
需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...
- Redis in Action 文章投票
原书用 Python 与 Redis 进行交互,我用 PHP 来实现. 环境:LNMP(CentOS 6.6 + Nginx 1.8.0 + MySQL 5.6.23 + PHP 5.6.9)+ Re ...
- PHP+Ajax实现文章心情投票功能实例
一个PHP+Ajax实现文章心情投票功能实例,可以学习了解实现投票的基本流程:通过ajax获取心情图标及柱状图相关数据,当用户点击其中的一个心情图标时,向Ajax.php发送请求,PHP验证用户coo ...
- Redis构建文章聚合信息分类网站
本系列教程内容提要 Java工程师之Redis实战系列教程教程是一个学习教程,是关于Java工程师的Redis知识的实战系列教程,本系列教程均以解决特定问题为目标,使用Redis快速解决在实际生产中的 ...
随机推荐
- 使用Xshell调用linux的图形界面!
环境说明: OS: centos 6.5 64位,最小化安装. Xmanager: 17.0.0.714 1.设置Xshell 2.将操作系统安装如下包 yum install xclock xte ...
- Java随机字符串:随机数字字符串,工具类
Java中生成随机数,字符串的工具类 1. 调用方法需要传入生成字符串的长度和需要的类型 生成随机数字 生成随机字母字符串 生成随机字符串+数字等 ......... 2. 总共8种类型,具体看工具类 ...
- linux之tail和head的使用
tail 基本介绍 用于显示文件的结尾的内容.在默认情况下,taild命令显示文件的后10行内容 表达式 tail [options] [filenames] 常用参数 -c:输出最后N个字节 -f: ...
- 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树
正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...
- maven工程下添加oracle驱动包
maven工程手动安装oracle驱动包到本地仓库 下载ojdbc.jar包 这个当然是最好去官网下载了.http://mvnrepository.com这个仓库上有,具体页面地址为: http:// ...
- [js]面向对象1
数据赋值拷贝 1,值得赋值是独立的 num1=12; num1=num2 将存储值赋值一份存储. 2, var age=22; age2=age; age=24 console.log(age); a ...
- Centos7下安装Docker(详细的新手装逼教程)
早就听说过Docker,一直不清楚是个啥,今天捣鼓了一下,这里做个记录. --------------------------------------------------------------- ...
- ThinkPHP数据库操作相关
- This Debug perspective is designed to support application debugging.it incorporates views for displaying the debug stack,variables and breakpoint mamagement
使用IDE(Eclipse Version:Neon.2 Release (4.6.2)),出现以下提示信息: This kind of launch is configured to openthe ...
- Form数据迁移
--------------------------------------添加linkserver--------------------------------------- --EXEC mas ...