使用Redis构建简易社交网站(1)-创建用户与动态界面

news2025/1/12 4:05:27
目的

本文目的:实现简易社交网站中创建新用户和创建新动态功能。(完整代码附在文章末尾)

相关知识

本文将教会你掌握:1.redis基本命令,2.python基本命令。

redis基本命令

hget:从哈希中获取指定域的值。

conn = redis.Redis()
conn.hget("testhash", "field1")

执行结果:2

incr:将 key 中储存的数字值增一。

conn = redis.Redis()
conn.incr("testcount")

执行前:不存在 testcount 键。

执行后:

testcount 1

hset:将哈希中域 field 的值设为 value

conn = redis.Redis()
conn.hset("testhash", "field1", 2)
conn.hset("testhash", "field2", 4)

执行前:

{'field1': '1'}

执行后:

{'field1': '2', 'field2': '4'}

hmset:同时将多个域-值对设置到哈希表中。

conn = redis.Redis()
conn.hmset("test_hash", {
'id': 1,
'name': 'educoder',
'age': 2,
})

执行后:

{'age': '2', 'id': '1', 'name': 'educoder'}

hincrby:为哈希中指定域的值增加增量 increment,用于统计。

conn = redis.Redis()
conn.hincrby("testhash", "field1", 1)

执行前:

{'field1': '1'}

执行后:

{'field1': '2'}

pipeline:将多条命令按照先后顺序放进一个队列中,一般配合execute一同使用,原子性(atomic)地执行队列里的命令。

conn = redis.Redis()
pipe = conn.pipeline(True) # 事务开始
pipe.incr("counter")
pipe.incr("counter")
pipe.incr("counter")
pipe.execute() # 事务执行

执行结果:[1, 2, 3],通过下标即可获取对应命令的执行结果。

python基本命令

将字符串全小写化:

'Hello, Educoder'.lower()

执行结果:'hello, educoder'

返回当前时间的时间戳。

time.time()

使用格式化拼接字符串:

"My name is %s, I'm %i years old"%('educoder', 2)

执行结果:"My name is educoder, I'm 2 years old"

实战例题:

编写 create_user(login_name, real_name) 函数,实现创建新用户的功能,具体参数与要求如下:

  • 方法参数login_name为用户登录名,real_name为用户真名;
  • 用户登录名预处理的实现:将用户登录名转换成全小写格式;
  • 重名检测的实现:查询哈希键users中是否存在与用户登录名同名的域,若存在,则不允许重新创建该用户,返回None
  • 分配用户编号的实现:对计数器user:id递增1,并将递增后的值作为新用户的编号;
  • 存储用户信息的实现:使用事务一次性提交:
    • 存储登录名的实现:将用户登录名记录到哈希键users当中,值为该用户编号;
    • 存储详情的实现:按照如下示意将用户信息存储到哈希键user:{id}中:

  • 返回创建结果的实现:返回新创建用户的编号。

编写 create_post(uid, content) 函数,实现创建新动态的功能,具体参数与要求如下:

  • 方法参数uid为发布动态的用户编号,content为要发布的动态内容;
  • 用户合法性检测的实现:查找用户编号对应详情信息哈希user:{uid}是否存在login_name域,若存在,则记录,若不存在,则不允许创建新动态,返回None
  • 分配动态编号的实现:对计数器post:id递增1,并将递增后的值作为新动态的编号;
  • 存储动态信息的实现:按照如下示意将动态信息存储到哈希键post:{id}中:

  • 更新用户动态数的实现:为该用户编号对应的详情信息哈希user:{uid}中的posts域的值加1
  • 返回创建结果的实现:返回新创建动态的编号。

 code.py

#code.py
#-*- coding:utf-8 -*-

import re
import time
import redis

conn = redis.Redis()

# 创建新用户
def create_user(login_name, real_name):
    # 请在下面完成要求的功能
    #********* Begin *********#
    login_name = login_name.lower()
    if conn.hget("users", login_name):
        return None

    uid = conn.incr("user:id")
    pipe = conn.pipeline(True)
    pipe.hset("users", login_name, uid)
    pipe.hmset("user:%i"%(uid), {
        'login_name': login_name,
        'id': uid,
        'real_name': real_name,
        'followers': 0,
        'following': 0,
        'posts': 0,
        'last_signup': time.time(),
    })
    pipe.execute()

    return uid
    #********* End *********#

# 为用户创建新动态
def create_post(uid, content):
    # 请在下面完成要求的功能
    #********* Begin *********#
    pipe = conn.pipeline(True)
    pipe.hget("user:%i"%(uid), 'login_name')
    pipe.incr("post:id")
    login_name, pid = pipe.execute()

    if not login_name:
        return None

    pipe.hmset("post:%i"%(pid), {
        'id': pid,
        'uid': uid,
        'content': content,
        'posted': time.time(),
        'user_name': login_name,
    })
    pipe.hincrby("user:%i"%(uid), 'posts')
    pipe.execute()

    return pid
    #********* End *********#

read.py

#read.py
#-*- coding:utf-8 -*-

import os
import sys
import time
import redis
import pprint
from code import *

conn = redis.Redis()
retry_time = 0
while True:
    try:
        conn.ping()
        break
    except redis.exceptions.ConnectionError:
        os.system("redis-server > /dev/null 2>&1 &")
        retry_time += 1
        if retry_time > 3:
            break

pipe = conn.pipeline(True)
pipe.delete("users", "user:id", "post:id")
keys = conn.keys("user:*") + conn.keys("post:*")
for key in keys:
    pipe.delete(key)
pipe.execute()

print "测试 create_user 方法..."
print "第一次创建登录名为 TestUser 的用户"
result1 = create_user('TestUser', 'Test User')
print "创建的用户ID为: " + str(result1)
print "当前分配的用户ID为: " + conn.get("user:id")
user_info = conn.hgetall("user:%i"%(result1))
user_info.pop("last_signup", "404")
print "创建的用户信息为: " + str(user_info)
print

print "第二次创建登录名为 TestUser 的用户"
result2 = create_user('TestUser', 'Test User2')
print "创建的用户ID为: " + str(result2)
print "当前分配的用户ID为: " + conn.get("user:id")
print

print "测试 create_post 方法..."
print "为用户 1 创建一条动态"
pid = create_post(1, "First POST!")
print "创建的动态ID为: " + str(pid)
print "当前分配的动态ID为: " + conn.get("post:id")
post_info = conn.hgetall("post:%i"%(pid))
post_info.pop("posted", "404")
print "创建的动态信息为: " + str(post_info)
user_info = conn.hgetall("user:1")
user_info.pop("last_signup", "404")
print "对应用户信息中更新为: " + str(user_info)
print

print "为不存在的用户 9 创建一条动态"
pid2 = create_post(9, "Illegal POST!")
print "创建的动态ID为: " + str(pid2)

pipe.delete("users", "user:id", "post:id")
keys = conn.keys("user:*") + conn.keys("post:*")
for key in keys:
    pipe.delete(key)
pipe.execute()

测试输入:无;

预期输出:

测试 create_user 方法...
第一次创建登录名为 TestUser 的用户
创建的用户ID为: 1
当前分配的用户ID为: 1
创建的用户信息为: {'login_name': 'testuser', 'posts': '0', 'real_name': 'Test User', 'followers': '0', 'following': '0', 'id': '1'}

第二次创建登录名为 TestUser 的用户
创建的用户ID为: None
当前分配的用户ID为: 1

测试 create_post 方法...
为用户 1 创建一条动态
创建的动态ID为: 1
当前分配的动态ID为: 1
创建的动态信息为: {'content': 'First POST!', 'uid': '1', 'user_name': 'testuser', 'id': '1'}
对应用户信息中更新为: {'login_name': 'testuser', 'posts': '1', 'real_name': 'Test User', 'followers': '0', 'following': '0', 'id': '1'}

为不存在的用户 9 创建一条动态
创建的动态ID为: None

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1281956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

h5进行svga动画礼物特效播放的代码实现队列按顺序播放

需求描述: 在直播场景中,有很多的礼物特效动画,如采用Svga动画的播放方案,则会遇到以下问题; 1.svga文件的预加载, 2.动画的顺序播放队列。即前一个动画播放完了,才会播放下一个动画。 1.svg…

沉浸式观影怎么能少得了投影仪?极米轻薄投影极米Z7X了解一下

近段时间,各个平台好剧不断,《以爱为营》《宁安如梦》《乐源游》《无所畏惧》等优质好剧陆续开播,让剧迷们直呼看不过来。优质好剧已经开场,看好剧的装备当然也不能落下。现如今,大屏追剧已成潮流,极米Z7X陪大家一起开…

【笔记】Clion 中运行 C/C++11 之 CMakeLists.txt 的配置

该文章记录第一次使用 Clion 时,对 CMakeLists 的配置,使其能够运行 C/C11 的代码。 一. CMakeLists.txt 的配置 1、首先我们在需要新建一个项目 2、填写新建项目相关的信息 3、修改 CMakeLists.txt 文件内容 替换文本: # 使用此 CMakeLis…

两道面试题秒杀你的C++基础!

大家好,我是光城,今天发两个非常重要的面试题,可以留言区说出你的答案,这两个题目都比较重要,看你能答对不? 1.C中初始化变量有几种方式,各自有什么区别? 或者说Initialization分为哪…

数学建模-数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度

数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度 整体求解过程概述(摘要) 伴随着数据要素化进程的不断加深,对于数据如何作用于经济发展,数据与其他要素结合产生的动能应该如何测度的研究愈发重要。本文将数据新动能分…

MySQL性能调优-1-实际优化案例

关于SQL优化的思路,一般都是使用执行计划看看是否用到了索引,主要可能有两大类情况: 对业务字段建立了二级联合索引,但是MySQL错误地觉得走主键聚族索引全表扫描效率更高,而没有走二级索引 走二级索引,但…

LLM | 一文了解大语言模型中的参数高效微调(PEFT)

Parameter Efficient Fine Tuning(PEFT)也就是参数高效微调,是一种用于微调大型语言模型 (LLM) 的方法,与传统方法相比,它有效地降低了计算和内存需求。PEFT仅对模型参数的一小部分进行微调,同时冻结大部分…

9款热门API接口分享,值得收藏!

电商API接口 干货分享 开始 “ API是什么? API的主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象…

使用PCSS实现的实时阴影效果

PCSS的技术可以使得阴影呈现出近硬远软的效果,并且能够实时实现。 其核心理念是通过模拟光源的面积来产生更自然、更柔和的阴影边缘。 具体步骤: 1、生成shadowmap 2、在进行阴影的比较时候进行平均,并非之前的shadow map 或者之后完全的阴影…

Xshell全局去除提示音

使用Xshell的时候经常会按TAB或者一些操作指令的时候的时候听到提示音,非常的烦 通常来说在Xshell中可以单独修改每一个会话的属性,将提示音关闭,但是新增的会话依然带有提示音,还得一个个的关闭,非常麻烦,…

【risc-v】易灵思efinix FPGA riscv 时钟配置的一些总结

系列文章目录 分享一些fpga内使用riscv软核的经验,共大家参考。后续内容比较多,会做成一个系列。 本系列会覆盖以下FPGA厂商 易灵思 efinix 赛灵思 xilinx 阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 文章目录 系列文章目录前言一、pan…

spring boot 事件机制

目录 概述实践监听spring boot ready事件代码 源码初始化流程调用流程 结束 概述 spring boot 版本为 2.7.17 。 整体看一下spring及spring boot 相关事件。 根据下文所给的源码关键处,打上断点,可以进行快速调试。降低源码阅读难度。 实践 spring…

EasyRecovery易恢复2024最新免费版电脑数据恢复软件功能介绍

EasyRecovery从(易恢复2024)支持恢复不同存储介质数据,在Windows中恢复受损和删除文件,以及能检索数据格式化或损坏卷,甚至还可以从初始化磁盘。同时,你只需要最简单的操作就可以恢复数据文件,如&#xff1…

Ubuntu常用必会Nslookup指令

文章目录 Nslookup是什么?Ubuntu Nslookup工具安装方法Nslookup工具语法常用Nslookup指令为什么必会Nslookup指令Nslookup的平行替代工具Nslookup和ping的区别推荐阅读 Nslookup是什么? 它是一个很小但功能非常强大的网络管理命令行软件。Nslookup命令可…

音频处理关键知识点

1 引言 现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。 目前我们在计算机上进行音频播放都需要依赖于音频文件。音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号…

POJ 3734 Blocks 动态规划(矩阵的幂)

一、题目大意 我们要给排成一行的区块涂颜色,可以选择红、绿、蓝、黄四种,要求红和绿的块都必须是偶数个,求出最终的涂色方式,对10007取余。 二、解题思路 我们设三个数列A,B和C: 1、A代表红色和绿色都…

SSL证书价格一年多少钱?

SSL证书价格一年多少钱并没有一个固定的答案,它取决于多种因素,包括您选择的证书类型、品牌、提供商以及您希望保护的域名数量等。 首先,我们需要了解SSL证书的种类。根据品牌和类型,SSL证书大致可分为域名认证SSL证书&#xff08…

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题。

学习目标: 动态规划五部曲: ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录! 60天训练营打卡计划! 学习内容: 二维数组处理01背包问题 听起来…

成品短视频app源码开发,你需要知道的最新动向

随着移动互联网的快速发展,短视频行业正迅速崛起。越来越多的创业者和开发者将目光投向了成品短视频app源码开发领域。下面我们将深入探讨这一领域的最新动向,带您了解成品短视频app源码开发的趋势与前景 成品短视频app源码开发的前景和机遇 短视频内容…

Latex正文引用图片编号,防止某张图片删除或调整导致正文序号对应错误

一、背景 Latex真的是非常好用的论文排版工具,虽然不像word一样是“所见即所得”的可视化方式,但完全不用管格式,包括图片的排版,文字的缩进等等。这在word里调整起来真的是非常麻烦,特别是某个段落、图片修改后&…