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实现文章投票功能的更多相关文章

  1. 使用redis构建文章投票系统

    首先,我得说明这篇博客基本上就是<<redis in action>>第一章内容的读书笔记. 需求 首先,说明一下,我们的需求 用户可以发表文章,发表时,自己就默认的给自己的文 ...

  2. 使用Redis构建文章投票网站

    涉及到的key: 1. article_time, 记录文章的发布时间,zset结构 2. article_score, 记录文章的得分, zset结构 得分 = 发布时间 + 投票用户数 X 432 ...

  3. thinkphp redis实现文章点赞功能并同步入mysql

    <?php namespace app\common\controller; use think\App; use think\facade\Cache; use think\facade\Db ...

  4. .Net Redis实战——实现文章投票并排序

    本系列文章为学习Redis实战一书记录的随笔. 软件和环境版本:Redis:5.0.7  .Net 5.0 文中不会对Redis基础概念做过多介绍. Redis数据类型和命令可在菜鸟教程学习:http ...

  5. redis 实例2 构建文章投票网站后端

    redis 实例2 构建文章投票网站后端   1.限制条件 一.如果网站获得200张支持票,那么这篇文章被设置成有趣的文章 二.如果网站发布的文章中有一定数量被认定为有趣的文章,那么这些文章需要被设置 ...

  6. Redis 实战 —— 02. Redis 简单实践 - 文章投票

    需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...

  7. Redis in Action 文章投票

    原书用 Python 与 Redis 进行交互,我用 PHP 来实现. 环境:LNMP(CentOS 6.6 + Nginx 1.8.0 + MySQL 5.6.23 + PHP 5.6.9)+ Re ...

  8. PHP+Ajax实现文章心情投票功能实例

    一个PHP+Ajax实现文章心情投票功能实例,可以学习了解实现投票的基本流程:通过ajax获取心情图标及柱状图相关数据,当用户点击其中的一个心情图标时,向Ajax.php发送请求,PHP验证用户coo ...

  9. Redis构建文章聚合信息分类网站

    本系列教程内容提要 Java工程师之Redis实战系列教程教程是一个学习教程,是关于Java工程师的Redis知识的实战系列教程,本系列教程均以解决特定问题为目标,使用Redis快速解决在实际生产中的 ...

随机推荐

  1. POJ 2187 - Beauty Contest - [凸包+旋转卡壳法][凸包的直径]

    题目链接:http://poj.org/problem?id=2187 Time Limit: 3000MS Memory Limit: 65536K Description Bessie, Farm ...

  2. python扫描端口脚本

    # -*- coding:utf8 -*- # # Python: 2.7.8 # Platform: Windows # Authro: wucl # Program: 端口扫描 # History ...

  3. linux之cp和scp的使用

    cp 基本介绍 cp主要用于同一台服务器上,目录和文件的复制 表达式 cp [OPTIONS] SOURCE DEST --- 从源路径copy文件到目的路径 常用参数 -a same as -dpR ...

  4. 学习gstreamer

    1. 对gst 的框架认识. 第一篇文章有结构图说明,清楚易懂:第二篇文章介绍了gst的简单使用 http://www.cnblogs.com/jingzhishen/p/3709639.html h ...

  5. windows 2008R2部署网站后出现 ‘PageHandlerFactory-Integrated’ 的解决办法

    原因:运行4.0的网站,需要用aspnet_regiis注册4.0框架,然后用4.0的Class池,就可以运行4.0的web项目了. 解决方法:1.在cmd中切换到4.0所在的目录,命令如下:cd C ...

  6. ORACLE——存储过程

    存储过程procedure 被内容来自<oracle从入门到精通——明日科技>一书 存储过程是一种命名的PL/SQL程序快,存储过程被保存在数据库中,它不可以被SQL语句直接执行或调用,只 ...

  7. 本地node启动服务步骤

    启动node服务: 1.git bash here (node server-run.js) 2.如果第一次启动node服务,要根据提示装依赖文件npm install 依赖文件名 3.启动成功提示: ...

  8. 20175211 2018-2019-2 《Java程序设计》第二周学习总结

    目录 教材学习内容总结 第二章 第三章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题总结 其他(感悟.思考等,可选) 学习进度条 参考资料 教材学习内容总结 第二章 ...

  9. php判断是否为命令行模式

    function is_cli(){ : ; }

  10. javascript笔记——源生js实现each方法

    出处:http://www.lovejavascript.com/#!zone/blog/content.html?id=48 jquery里面有个each方法,将循环操作简化.便捷. 随后es出了个 ...