Redis实现微博后台业务逻辑系列(四)

保存微博用户之间的关系:

import redis

class RelatoinShip(object):
    """使用无序集合键保存用户关系"""
    def __init__(self, client):
        self.client = client
        
    def follow(self, fans, target):
        """关注某人"""
        # 将用户添加到目标用户粉丝集合中
        target_fans_set = "weibo::user::" + str(target) + "::fans"
        self.client.sadd(target_fans_set, fans)
        # 将目标用户id添加到用户自身的关注集合中
        self_following_set = "weibo::user::" + str(fans) + "::following"
        self.client.sadd(self_following_set, target)
        
    def is_following(self, fans, target):
        """检查fans用户是否关注了target用户"""
        self_following_set = "weibo::user::" + str(fans) + "::following"
        return self.client.sismember(self_following_set, target)
        
    def is_following_each_other(self, user_a, user_b):
        """检查两个用户是否已互相关注"""
        return self.is_following(user_a, user_b) and self.is_following(user_b, user_a)
        
    def get_all_following(self, user):
        """返回用户关注的所有人"""
        self_following_set = "weibo::user::" + str(user) + "::following"
        return self.client.smembers(self_following_set)
        
    def get_all_fans(self, user):
        """返回用户的所有粉丝"""
        target_fans_set = "weibo::user::" + str(user) + "::fans"
        if not self.client.exists(target_fans_set):
            return False
        else:
            return self.client.smembers(target_fans_set)
        
    def common_following(self, user_a, user_b):
        """返回两个用户共同关注的人"""
        user_a_following = "weibo::user::" + str(user_a) + "::following"
        user_b_following = "weibo::user::" + str(user_b) + "::following"
        return self.client.sinter(user_a_following, user_b_following)

if __name__ == "__main__":
    redis_client = redis.StrictRedis()
    relation = RelatoinShip(redis_client)
    relation.follow(10086, 12345)
    relation.follow(10010, 12345)
    print(relation.is_following(10086, 12345))
    print(relation.get_all_following(10086))
    print(relation.get_all_fans(12345))
    print(relation.common_following(10086, 10010))

关注集合,用于存储用户关注的人的ID,“weibo::user::<id>::following”

粉丝集合,用于存储用户的粉丝的ID,“weibo::user::<id>::fans”

我们在微博中看到喜欢的人可以点击关注,当然我们自己也可以被人关注,我们可以看到自己所有的粉丝,也可以看到自己关注的所有人,有显示是否已互相关注,微博也会显示自己和好友共同关注的人。

在这个类中我们使用无序集合来保存用户的关系,集合的特性是去重,绝对没有重复值。无序集合这种数据结构特别适合保存不能有重复值,并且不在乎存储顺序的数据。就像我们在朋友圈点赞时,先点赞的人不一定排在前面,后点赞的人不一定排在后面显示,他们的显示顺序是无序的,但又是唯一的。后面我们在实现点赞(投票)功能时,也使用的无序集合这种数据结构来存储。

时间: 2024-10-16 12:25:42

Redis实现微博后台业务逻辑系列(四)的相关文章

Redis实现微博后台业务逻辑系列(一)

今天我们开始用Redis数据库实现类似微博的后台业务逻辑,我会带领大家一步步的实现类似微博的各种功能效果.这里我所使用的环境是Python3.5+Redis3.2.1,Python2和Python3有很多命令不相同,请大家注意. import redis class UniqueSet(object):     """使用集合键保存用户名和邮箱地址,检查是否已经使用"""     def __init__(self, key, client):

Redis实现微博后台业务逻辑系列(三)

新建用户功能: import redis class User(object):     """使用Redis散列键保存用户信息,并尝试登陆"""     def __init__(self, client):         self.client = client         self.key = "weibo::email_to_uid"          def create(self, name, passwd,

Redis实现微博后台业务逻辑系列(二)

import redis class IdGenerator(object):     """生成用户ID并返回"""     def __init__(self, key, client):         self.key = key         self.client = client     def init(self, n):         self.client.set(self.key, n)     def gen(self

AngularJS之使用控制器封装业务逻辑

控制器的作用 我们知道,在AngularJS中,实现数据绑定的核心是scope对象.那么控制器又有什么用呢? 简单地说,没有控制器/controller,我们没有地方定义业务模型. 回忆下ng-init指令.我们可以使用ng-init指令在scope对象上定义数据,比如: <div ng-init="sb={name:'somebody',gender:'male',age:28}"> </div> 但是,ng-init的值是一个AngularJS表达式,没有办

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(4)-业务逻辑层的封装 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程 前言:前面几篇博客我们基本已经介绍完了搭建整个项目和数据库访问层以及一些业务逻辑层的实现,当然了,我们的数据库访问层这样还是可以在进行封装的,但是我到这里就行了吧,项目也不大,不需要那么麻烦的,那么我们今天开始介绍我们需要介绍的内容,那就是我

【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)

前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不断的维护和拓展中,比如最近重构了dashboard,加入了全屏功能,新增了tabs-view等等.所以项目会越来越复杂,不太适合很多初用vue的同学来构建后台.所以就写了这个基础模板,它没有复杂的功能,只包含了一个后台需要最基础的东西.vueAdmin-template 主要是基于vue-cli w

redis+php微博功能的redis数据结构设计总结(四)

概述: 1.完全采用redis作为数据库实现微博的登录2.发布3.微博的显示4.实现整个功能使用了redis的string,list,hashes四个数据类型,以及string类型的数值自增功能 一.用户信息 将数据以string类型存储 incr global:userid  (存储用户自增id)set user:userid:1:username zhangshanset user:userid:1:password 1212121212set user:username:zhangshan

登录模块业务逻辑

页面一:手机快速登录 业务逻辑:不需要注册,直接输入你的手机号,然后获取一条验证码(当你点击获取验证码的时候,会请求一个接口,后台会获取到手机号,然后随机生成6位或其他位数的数字,然后 ‘手机号’+'生成的验证码' 保存到redis 缓存里,过期时间可以是一分钟),然后填上你收到的验证码,然后连同手机号一起发送给后台,然后后台 根据你填写的手机号,和填写的验证码,跟之前在redis缓存里保存的值进行对比,相同则通过. 注意: ---有的时候会在快速登录页面之后让你输入用户名和上传头像(如下图),

从分享机制反观产品形态与业务逻辑

本文不是我写的,转载出处:http://www.woshipm.com/pd/273760.html “分享”是一个在App中特别常见的功能,从运营层面它满足了推广需求,从用户层面则满足了用户对外塑造自我形象.分享自我点滴.宣扬价值观等需求.这次我将分析五类常见应用(社交类.内容类.电商类.美化类.打车类)的分享机制,从中反推出不同产品的产品目标.业务逻辑对分享机制的影响:接着,从用户体验的角度分析几种分享机制下不同操作流程的优缺点. 一.每类产品分享的内容形式 不同种类的产品会因为不同的产品性