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快速解决在实际生产中的 ...
随机推荐
- 20175320 2018-2019-2 《Java程序设计》第5周学习总结
20175320 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 本周学习了教材的第六章的内容.在这章中介绍了接口与实现,着重讲了接口是如何定义并实现以及如何 ...
- linux 强制删除杀死进程 sudo pkill uwsgi -9 杀死uwsgi 关闭防火墙 iptables -F
sudo pkill -f uwsgi -9 四.关闭防火强 iptables -F #清空规则 systemctl stop firewalld #关闭防火墙服务 ...
- Gym 101194C / UVALive 7899 - Mr. Panda and Strips - [set][2016 EC-Final Problem C]
题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...
- 报错解决——xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
一般在遇到这个问题的时候都是想用git或者svn,结果发现用不了并报错xcrun: error: invalid active developer path (/Library/Developer/C ...
- Spring中bean标签的属性和值:
Spring中bean标签的属性和值: <bean name="user" class="com.pojo.User" init-method=" ...
- Keras序列模型学习
转自:https://keras.io/zh/getting-started/sequential-model-guide/ 1.顺序模型是多个网络层的线性堆叠. 你可以通过将网络层实例的列表传递给 ...
- 如何用VSCode手动编译Ace Editor
对于习惯微软VS的用户,可能很不习惯开源社区兴起的前端开发流程.随着NodeJs的兴起,JavaScript已经成为Github上开源项目最多的语言.使用微软提供的VSCode可以很好地利用这些开源项 ...
- redis----------windows下安装redis以及PHP的redis扩展
1.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...
- C# Newtonsoft.Json JsonSerializerSettings 全局序列化设置
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings(); JsonC ...
- caffe-ssd的GPU在make runtest的时候报错:BatchReindexLayerTest/2.TestGradient,where TypeParam=caffe::GPUdevice(<float>)(<double>)
make runtest报错:BatchReindexLayerTest/2.TestGradient,where TypeParam=caffe::GPUdevice<float> Ba ...