Python操作redis数据库

北山啦 发表于 2021/06/09 00:04:56 2021/06/09
【摘要】 Python操作redis数据库

Redis简介
Python 如何操作 redis,redis 是一个 Key-Value 数据库,Value 支持 string(字符串),list(列表),set(集合),zset(有序集合),hash(哈希类型)等类型。。Redis是一个开源的使用C语言编写、支持网络访问、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

image.png

Redis支持多种数据结构:

  • String: 字符串
  • Hash: 散列
  • List: 列表
  • Set: 集合
  • Sorted Set: 有序集合

使用场景:

  • 完全可以作为唯一的数据存储库,不需要MySQL
  • 如果搭配使用,因为性能比MySQL快,常常作为Web应用服务的缓存层,先访问Redis,访问不到再访问MySQL,同时更新到Redis

演示场景,一个文章展示的网站怎样存储数据:

  1. 使用Hash存储文章的(ID、标题)数据;
  2. 使用String存储每个文章的访问次数,可以每次加1计数(或者存储文章ID的标签、作者等附加属性都可以);
  3. 使用List存储每个用户的访问文章的历史,按顺序记录;
  4. 使用Set存储访问网站的所有用户ID的集合;
  5. 使用Sorted Set存储网站的热榜,排序分数就是权重;

使用pip install redis可以安装

import redis
redis_conn = redis.Redis(host='192.168.0.119', port=6379)   
# 清理所有现在的数据,方便测试
for key in redis_conn.keys():
    redis_conn.delete(key)

1. 给网站新增几篇文章

# 使用hash,类似map的形式,存储(Id、标题)数据
for idx in range(101, 106):
    redis_conn.hset("articles", str(idx), f"this is {idx} article title")

2. 给用户展示文章列表

# 展示所有的文章列表
for article_id, article_title in redis_conn.hgetall("articles").items():
    # 分隔符
    print("#"*30)
    # 默认返回bytes类型
    print(article_id, article_title)
    # 转换成str类型
    print(article_id.decode("utf-8"), article_title.decode("utf-8"))
##############################
b'101' b'this is 101 article title'
101 this is 101 article title
##############################
b'102' b'this is 102 article title'
102 this is 102 article title
##############################
b'103' b'this is 103 article title'
103 this is 103 article title
##############################
b'104' b'this is 104 article title'
104 this is 104 article title
##############################
b'105' b'this is 105 article title'
105 this is 105 article title
# 展示单个文章的标题
redis_conn.hget("articles", "105")
b'this is 105 article title'

3. 用户访问文章则产生行为记录

def user_visit(uid, article_id):
    """产生了行为:uid访问了article_id"""
    # 1. String结构,文章的访问次数加1
    redis_conn.incr(f"article_counter_{article_id}")
    # 2. List结构,记录uid的访问列表
    redis_conn.lpush(f"user_visit_{uid}", str(article_id))
    # 3. Set结构,记录uid的全站集合
    redis_conn.sadd(f"all_visit_uids", str(uid))
    # 4. SortedSet结构,文章的热度加1
    redis_conn.zincrby("article_hots", 1, str(article_id))

# 模拟3个用户的访问记录
user_visit("uid_01", "101")
user_visit("uid_01", "102")
user_visit("uid_01", "103")

user_visit("uid_02", "102")
user_visit("uid_02", "103")
user_visit("uid_02", "104")

user_visit("uid_03", "103")
user_visit("uid_03", "104")
user_visit("uid_03", "105")

4. 查询文章的访问次数

redis_conn.get(f"article_counter_104")

b'2'
redis_conn.get(f"article_counter_105")

b'1'

5. 展示一个用户的访问历史

redis_conn.lrange("user_visit_uid_01", 0, -1)

[b'103', b'102', b'101']
redis_conn.lrange("user_visit_uid_03", 0, -1)

[b'105', b'104', b'103']

6. 展示访问全站的用户集合

redis_conn.smembers("all_visit_uids")

{b'uid_01', b'uid_02', b'uid_03'}

7. 展示文章热榜以及热度

redis_conn.zrange("article_hots", 0, -1, withscores=True, desc=True)

[(b'103', 3.0), (b'104', 2.0), (b'102', 2.0), (b'105', 1.0), (b'101', 1.0)]

到这里就结束了,如果对你有帮助你,欢迎点赞关注,你的点赞对我很重要

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。