| Redis的安装不懂的可前往 https://www.zeker.top/posts/9d3a5b2a/

网上搜到的代码很多,但大多都有点小毛病(方法不可用,逻辑错误等)

自己基于网上找到的代码进行修改补缺,基本符合投票系统的用户运行,只需改下面即可运行。

redis.ConnectionPool(host="ip地址", port=6379, password='', db=0)
  1. 改ip为服务器地址,本地就localhost;
  2. 有密码就填充密码,没有则忽略;
  3. redis默认有16个数据库,想在哪个数据库存储就设置一下数字(数据库以 0 起始)

直接贴代码

# -*- coding: utf-8 -*-
# @Time : 2022/5/17 14:30
# @Author : Ztop
# @Email : top.zeker@gmail.com
# @Link: https://www.zeker.top import redis
import time try:
ONE_WEEK_IN_SECONDS = 604800
VOTE_SCORE = 240.00
pool = redis.ConnectionPool(host="ip地址", port=6379, password='', db=0)
redis = redis.Redis(connection_pool=pool)
except Exception as err:
print(err) # 发布文章
def post(articleData, redis=redis):
articleId = str(redis.incr('article:')) # 自增文章id # try:
"""保存文章"""
article = 'article:' + articleId """hmset 新版本不维护"""
# redis.hmset(article, articleData) # redis.hmset('xx', {'k1':'v1', 'k2': 'v2'})
for k, v in articleData.items():
redis.hset(article, k, v) '#将文章与发布时间通过一个有序集合进行关联'
post_time = time.time()
# redis.zadd('time', dict(article=articleData['time'])) # r.zadd('xset1',{'m1':10,'m2':20})
redis.zadd('time', {article: post_time}) print("即将为自己投初始票!", articleData['poster'])
'#为自己投初始票'
vote(article, articleData['poster'], True)
'修改文章评分'
score(article, redis)
return article
# except Exception as err:
# print(err)
# return False # 为文章投票
def vote(article, user, posting, redis=redis):
global ONE_WEEK_IN_SECONDS
'#投票,和用户绑定'
voted = 'voted:' + article.partition(':')[-1] articleData = redis.hgetall(article)
if not bool(articleData):
print("%s该id无对应文章!!!%s\n" % (red, end))
return False postTime = redis.zscore('time', article)
# print(postTime)
# 一周之前的文章不能投票
tempTime = time.time() - ONE_WEEK_IN_SECONDS if postTime and postTime <= tempTime:
print("%s一周之前的文章不能投票!!!%s\n" % (red, end))
return False # 一个用户只能投一票,判断用户是否已经投过
if (redis.sismember(voted, user)):
print("%s你已投票过该文章!!!%s\n" % (red, end))
return False # print(articleData) if posting:
redis.sadd(voted, articleData[b'poster'])
else:
redis.sadd(voted, user)
score(article)
print("%s已成功为 %s 投票!%s\n" % (green, voted, end)) redis.expire(voted, ONE_WEEK_IN_SECONDS) # 设置超时时间 # 更新章的评分
def score(article, redis=redis):
global VOTE_SCORE '#将文章与评分通过一个有序集合进行关联'
redis.zincrby('score', VOTE_SCORE, article)
redis.hincrby(article, 'votes', 1)
aScore = redis.zscore('score', article)
print("%s已成功为 %s 加分!当前分为 %s%s\n" % (green, article, int(aScore), end)) # 按特定的方式(发布时间,评分)降序取出文章
def get_articles(order, page=1, limit=25, redis=redis):
start = (page - 1) * limit
end = start + limit - 1
articleIds = redis.zrange(order, start, end, desc=True)
articleList = {}; for id in articleIds:
articleData = redis.hgetall(id)
articleData['id'] = id
articleList[id] = articleData
return articleList # 设置,移除文章分组
def add_remove_group(article, add=[], remove=[], redis=redis):
if len(add) != 0:
for group in add:
groupKey = 'group:' + group
redis.sadd(groupKey, article)
print("%s已将该文章加入分组(%s)%s" % (green, add, end))
else:
for group in remove:
groupKey = 'group:' + group
redis.srem(groupKey, article)
print("%s已将该文章移除分组(%s)%s" % (green, remove, end)) # 按评分或时间排名取出分组下的文章
def get_group_articles(group, order, page=25, limit=25, redis=redis):
key = order + group if (not redis.exists(key)):
redis.zinterstore(key, ['group:' + group, order], aggregate='max') redis.expire(key, 5)
return get_articles(key, page, limit) # 删除文章
def deleteArticle(article, redis=redis):
id = article.partition(':')[-1]
# 文章是hash
if redis.exists(article):
redis.delete(article)
else:
print("%s对应文章不存在%s" % (red, end)) # 删除对应投票, voted 是 set 类型
voted = "voted:" + id
if redis.exists(voted):
redis.delete(voted)
else:
print("%s对应投票不存在%s" % (red, end)) # 删除对应时间,time 是 zset 类型
redis.zrem("time", article) # 删除对应文章分数, zset
redis.zrem("score", article) if redis.dbsize() == 1:
redis.flushdb() print("%s已删除文章%s%s\n" % (green, article, end)) if __name__ == '__main__':
global red, green, end
red = '\033[1m\033[31m'
green = '\033[1m\033[32m'
end = "\033[0m" statement = "原文地址: https://www.cnblogs.com/xiangdongsheng/p/13455921.html"
menu = """\033[1m\033[35m------------ redis简易文章投票系统(完善版 by Ztop)---------------
1. 发布文章 6. 查看指定文章分数
2. 查看指定文章 7. 文章添加、移除从指定分组
3. 以发布时间,评分获取文章 8. 按评分或时间排名取出分组下的文章
4. 为文章投票 9. 删除指定文章
5. 为指定文章加分 10.删库
0. 退出
--------------------------------------------------------------------\033[0m""" print(statement)
while True:
print(menu)
choice = int(input(">>"))
if choice == 1:
poster = input("发布人id(例001):")
title = input("标题:")
content = input("内容:") articleData = dict(poster="user:" + poster, title=title, content=content)
print(articleData, type(articleData))
# articleData 是字典
article = post(articleData)
if article:
print('%s文章发布成功!%s\n' % (green, end))
else:
print('%s文章发布失败%s\n' % (red, end))
# articleId = article.partition(':')[-1]
# add_remove_group(article, add=['redis']) elif choice == 2:
articleId = input("文章id(例1):")
article = "article:" + articleId
articleData = redis.hgetall(article)
if not bool(articleData):
print("%s该id无对应文章%s\n" % (red, end))
else:
print(articleData, "\n") elif choice == 3: # 以发布时间,评分获取文章
print("发布时间1 | 评分2")
choice = int(input('>>'))
if choice == 1:
print(get_articles(order='time'))
elif choice == 2:
print(get_articles(order='score')) elif choice == 4: # 为文章投票
article = "article:" + input("文章id(例87):")
userid = "user:" + input("你的id(例: 001):")
vote(article, userid, False) elif choice == 5: # 更新文章评分
article = "article:" + input("文章id(例87):")
score(article) elif choice == 6: # 查看指定文章分数
article = "article:" + input("文章id(例87):")
aScore = redis.zscore('score', article)
if score:
print("%s文章 %s 的当前分数为 %s \n%s" % (green, article, int(aScore), end))
else:
print("%s无该文章信息,请检查是否正确!\n%s" % (red, end)) elif choice == 7: # 文章添加、移除从指定分组
print("添加1 | 移除2")
choice = int(input('>>'))
if subChoice == 1:
article = "article:" + input("文章id(例87):")
group = input("分组名:")
add_remove_group(article, add=[group])
elif subChoice == 2:
article = "article:" + input("文章id(例87):")
group = input("分组名:")
add_remove_group(article, remove=[group]) elif choice == 8: # 按评分或时间排名取出分组下的文章
print("发布时间1 | 评分2")
subChoice = int(input('>>'))
group = input("分组名:")
if subChoice == 1:
get_group_articles(group=group, order='time')
elif subChoice == 2:
get_group_articles(group=group, order='score') elif choice == 9:
article = "article:" + input("文章id(例87):")
deleteArticle(article) elif choice == 10:
print("%s是否进行删库跑路? 是y/否n%s"% (red, end), end=" ")
subChoice = input().lower()
if subChoice == 'y':
redis.flushall()
print("%s删库成功,祝君平安%s\n" % (green, end))
else:
print("%s已取消删库%s\n" % (green, end))
continue else:
exit()

云计算:基于Redis的文章投票系统(Python完整版)的更多相关文章

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

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

  2. 基于Redis的限流系统的设计

    本文讲述基于Redis的限流系统的设计,主要会谈及限流系统中限流策略这个功能的设计:在实现方面,算法使用的是令牌桶算法来,访问Redis使用lua脚本.   1.概念 In computer netw ...

  3. 如何实现基于ssh框架的投票系统的的质量属性

    如何实现基于ssh框架的投票系统的的质量属性: 项目 :网上考试系统 我做的是网上考试系统,因为标准化的考试越来越重要,而通过计算机进行标准化判卷,系统会自动判卷出成绩,组织考试的人不用组织人员打印试 ...

  4. Spring+Shiro搭建基于Redis的分布式权限系统(有实例)

    摘要: 简单介绍使用Spring+Shiro搭建基于Redis的分布式权限系统. 这篇主要介绍Shiro如何与redis结合搭建分布式权限系统,至于如何使用和配置Shiro就不多说了.完整实例下载地址 ...

  5. 基于Opencv快速实现人脸识别(完整版)

    无耻收藏网页链接: 基于OpenCV快速实现人脸识别:https://blog.csdn.net/beyond9305/article/details/92844258 基于Opencv快速实现人脸识 ...

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

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

  7. Redis实现文章投票功能

    Redis的具体操作这里就不说了,说一下需求和设计思路. 需求:自己实现一个文章投票的功能1.能够按照时间分页倒叙查看文章信息2.能够给文章投票,一个用户给一篇文章只能投票一次3.需要记录分值.每次投 ...

  8. 安装单机Hadoop系统(完整版)——Mac

    在这个阴雨绵绵的下午,没有睡午觉的我带着一双惺忪的眼睛坐在了电脑前,泡上清茶,摸摸已是略显油光的额头(笑cry),,奋斗啊啊啊啊!!%>_<% 1.课程回顾. 1.1 Hadoop系统运行 ...

  9. php+redis 简易的实现文章发布系统(用户投票系统)

    /** * @data 文章发布 * 文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周 * 讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中 * ...

  10. Redis in Action 文章投票

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

随机推荐

  1. 深入探讨Function Calling:在Semantic Kernel中的应用实践

    引言 上一章我们熟悉了 OpenAI 的 function calling 的执行原理,这一章节我们讲解一下 function calling 在 Semantic Kernel 的应用. 在Open ...

  2. idea 使用 mvn clean package 报错 Could not create local repository at

    使用 mac 版本的 idea 打包使用打包命令 mvn clean package 总是报错: [ERROR] Could not create local repository at /Repos ...

  3. v-once指令 v-if和v-show

    v-once指令 只渲染元素和组件一次,之后元素和组件将失去响应式功能 v-if和v-show 根据表达式的布尔值(true/false)进行判断是否渲染该元素 注:v-if 有更高的切换开销,而 v ...

  4. Vue TypeScript 实战:掌握静态类型编程

    title: Vue TypeScript 实战:掌握静态类型编程 date: 2024/6/10 updated: 2024/6/10 excerpt: 这篇文章介绍了如何在TypeScript环境 ...

  5. 任意树遍历,可以使用 goto 跳记号标注的

    先顺序进入到最后一个根的根部,完后扫描同级 同级扫描完用 goto跳代码改层数到倒数地二层 之后操作就是倒着往上搜索的,有难度,但是还是能做到的嘛 用 lisit 好像不需要别的,全用 list 连接 ...

  6. golang sync.Map 与使用普通的 map 的区别

    使用sync.Map与普通的Go map主要有以下几点区别: 1. 并发安全性 普通map: 在没有外部同步的情况下,不是并发安全的.在多goroutine访问时,如果没有适当的锁或其他同步机制保护, ...

  7. redis 锁

    demo1 public ErrorCode initDemo1(@RequestParam("orderNo") String orderNo) throws IOExcepti ...

  8. LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning、Lora、Prefix tuing等]

    LLM微调方法(Efficient-Tuning)六大主流方法:思路讲解&优缺点对比[P-tuning.Lora.Prefix tuing等] 由于LLM参数量都是在亿级以上,少则数十亿,多则 ...

  9. C#如何创建一个可快速重复使用的项目模板

    写在前面 其实很多公司或者资深的开发都有自己快速创建项目的脚手架的,有的是魔改代码生成器实现,有的直接基于T4,RazorEngine等模板引擎打造:但无论如何,其最终目的其实就是搭建一个自定义项目模 ...

  10. nginx 反向代理(proxy)与负载均衡(upstream)应用实践

    集群介绍 集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可以彼此通信,协同向 ...