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快速解决在实际生产中的 ...
随机推荐
- 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree
题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...
- BeeHive小思考
事件分发和事件处理 将所有行为注册为不同的时间类型,配置Module,让他们在事件发生时,响应这些事件(除了系统的事件,还可以注册自定义事件,触发自定义事件) Module注册之后应当会生成单例对象, ...
- javascript 窗口宽高滚动
//不加window IE不支持 console.info(window.screenLeft);//IE支持火狐不支持 console.info(window.screenX);//火狐支持,IE不 ...
- [redis] 与redis cluster有关的学习笔记
主要是以下三个官方文档,只略读了前两个,第三个还没有读. <redis cluster tutorial> <redis sentinel> <redis cluster ...
- 部署WEB项目到服务器(四)部署WEB项目Forum到linux服务器(Ubuntu)详解
突发奇想,想在自己电脑上部署一个web网站. 1,使用Navicat for MYSQL客户端创建WEB项目数据库: Navicat for MYSQL连接虚拟机中的mysql数据库 启动mysql数 ...
- 最全的MonkeyRunner自动化测试从入门到精通(3)
一.eclipse的下载安装与配置成安卓开发环境 步骤一:在官网上面进行下载eclipse,官网的网址:https://www.eclipse.org/downloads/ 步骤二:下载完成后可以在你 ...
- Python_环境部署及报错汇总(0)
一.安装Anaconda Anaconda是一个开源的包.环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换. Anaconda包括Conda.Python以及 ...
- vue 之组件递归;
在开发一个 PC 端的项目时,需要开发一个树状结构,直接上效果图如下:点击 "+" 号的时候则展开下一级,点击 "-" 号的时候则收起: 之所以写这篇博客,因为 ...
- 小程序 切换到tabBar页面不刷新问题
小程序跳转的几种方式有wx.navigateTo,wx.redirectTo,wx.reLaunch,wx.switchTab等.下面我们重点研究切换到tabBar的两种方式. wx.switchTa ...
- Django框架详细介绍---ORM---图书信息系统专题训练
from django.db import models # Create your models here. # 书 class Book(models.Model): title = models ...