python中如何使用Redis存储好友关系

  I'
ve been thinking lately about how perfect Redis would be for storing a

  simple social graph. I posited that it would be relatively few lines of code,

  and that it'
d be clean code too. So here it is: a basic social graph built on Redis.

Python技巧:Redis如何存储好友关系

  "
"
"

  class FriendGraph(object):

  def __init__(self, ring):

  self.ring = ring

  # These keys are intentionally short, so as to save on memory in redis

  self.FOLLOWS_KEY = '
F'

  self.FOLLOWERS_KEY = '
f'

  self.BLOCKS_KEY = '
B'

  self.BLOCKED_KEY = '
b'

  def follow(self, from_user, to_user):

  forward_key = '
%s:%s'
% (self.FOLLOWS_KEY, from_user)

  forward = self.ring.sadd(forward_key, to_user)

  reverse_key = '
%s:%s'
% (self.FOLLOWERS_KEY, to_user)

self.ring.sadd(reverse_key, from_user) = reverse

  return forward and reverse

  怎样用Redis存储好友关系-python版

  def unfollow(self, from_user, to_user):

  forward_key = '
%s:%s'
% (self.FOLLOWS_KEY, from_user)

  forward = self.ring.srem(forward_key, to_user)

  reverse_key = '
%s:%s'
% (self.FOLLOWERS_KEY, to_user)

下面是一种重写的方式:

从环中删除指定用户,操作后的环称为“reverse”,并返回删除的用户。

```python
removed_user = self.ring.srem(reverse_key, from_user)
reverse = self.ring # 将删除操作后的环赋值给 reverse
```

  return forward and reverse

  def block(self, from_user, to_user):

  forward_key = '
%s:%s'
% (self.BLOCKS_KEY, from_user)

  forward = self.ring.sadd(forward_key, to_user)

  reverse_key = '
%s:%s'
% (self.BLOCKED_KEY, to_user)

self.ring.sadd(reverse_key, from_user) = reverse

  return forward and reverse

  def unblock(self, from_user, to_user):

  forward_key = '
%s:%s'
% (self.BLOCKS_KEY, from_user)

  forward = self.ring.srem(forward_key, to_user)

  reverse_key = '
%s:%s'
% (self.BLOCKED_KEY, to_user)

下面是一种重写的方式:

从环中删除指定用户,操作后的环称为“reverse”,并返回删除的用户。

```python
removed_user = self.ring.srem(reverse_key, from_user)
reverse = self.ring # 将删除操作后的环赋值给 reverse
```

  return forward and reverse

  def get_follows(self, user):

  follows = self.ring.smembers('
%s:%s'
% (self.FOLLOWS_KEY, user))

  blocked = self.ring.smembers('
%s:%s'
% (self.BLOCKED_KEY, user))

  return list(follows.difference(blocked))

  def get_followers(self, user):

  followers = self.ring.smembers('
%s:%s'
% (self.FOLLOWERS_KEY, user))

  blocks = self.ring.smembers('
%s:%s'
% (self.BLOCKS_KEY, user))

  return list(followers.difference(blocks))

  def get_blocks(self, user):

  return list(self.ring.smembers('
%s:%s'
% (self.BLOCKS_KEY, user)))

  def get_blocked(self, user):

  return list(self.ring.smembers('
%s:%s'
% (self.BLOCKED_KEY, user)))



在开发社交应用时,好友关系是一个非常重要的概念。如何高效地存储好友关系成为了一个迫切需要解决的问题。Redis是一个非常好的选择,本文将介绍如何使用Python和Redis来存储好友关系。
一、Redis介绍
Redis是一个键值存储系统,其数据完全存储在内存中,提供了快速的读写和高并发性能。Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。Redis还提供了各种方式的数据持久化,将数据存储到磁盘上。
二、Redis中的哈希表
哈希表是Redis中一个非常重要的数据结构。哈希表是一个键值对集合,其中每个键对应一个值。Redis中一个哈希表的结构如下:
```
{
key1: value1,
key2: value2,
...
}
```
三、使用哈希表存储好友关系
在Redis中,我们可以使用哈希表来存储好友关系。我们可以定义一个哈希表,其中哈希表的键是用户ID,值是一个集合,集合中存储了该用户的好友ID。这样,我们就可以使用Redis提供的高效的集合操作来管理好友关系。
在Python中,我们可以使用Redis的Python客户端库redis-py来连接Redis服务器并进行操作。
```python
import redis
redis_client = redis.Redis()
# 添加好友关系
def add_friend(user_id, friend_id):
redis_client.sadd(user_id, friend_id)
# 删除好友关系
def remove_friend(user_id, friend_id):
redis_client.srem(user_id, friend_id)
# 获取好友列表
def get_friends_list(user_id):
friends = redis_client.smembers(user_id)
return list(map(int, friends))
```
四、好友关系的双向性
在社交应用中,好友关系是双向的,即如果A是B的好友,那么B也是A的好友。因此,在存储好友关系时,需要同时存储A和B之间的关系。这可以通过在Redis中存储两条记录来实现。
```python
def add_friend(user_id, friend_id):
redis_client.sadd(user_id, friend_id)
redis_client.sadd(friend_id, user_id)
```
五、好友关系的常用操作
在社交应用中,经常需要对好友关系进行一些常用的操作,例如添加好友、删除好友、查找好友等。可以使用Redis提供的集合操作来实现这些操作。
```python
# 判断是否是好友
def is_friend(user_id, friend_id):
return redis_client.sismember(user_id, friend_id)
# 获取好友数量
def get_friends_count(user_id):
return redis_client.scard(user_id)
# 查找共同好友
def get_mutual_friends(user_id1, user_id2):
return redis_client.sinter(user_id1, user_id2)
```
六、好友关系的存储方式
在存储好友关系时,我们可以使用不同的方式。一种方式是,对于每个用户,存储一个哈希表,其中包含用户的好友列表。另一种方式是,对于每对好友关系,存储一个哈希表。
这两种方式各有优缺点。第一种方式可以较为方便地进行用户级别的好友管理,但在执行某些操作时可能会涉及到较大的数据量。第二种方式则可以更为高效地执行一些操作,但在对用户级别的好友管理时可能不太方便。
七、总结
本文介绍了如何使用Python和Redis来存储好友关系。通过使用Redis提供的高效的集合操作,我们可以很方便地进行好友关系的管理,并且在性能方面也有一定的保证。在实际应用开发中,可以根据实际情况选择不同的存储方式。