精华内容
下载资源
问答
  • 大家都用过各种各样的社交软件,像国人用的最多的就是QQ、微信、微博等,国外用的多的就是推特、脸书等,这些社交软件都是建立在人与人相互之间关系的基础。 做过类似项目的同学,应该知道此类项目中好友之间的...

    一、引言

    大家都用过各种各样的社交软件,像国人用的最多的就是QQ、微信、微博等,国外用的多的就是推特、脸书等,这些社交软件都是建立在人与人相互之间关系的基础上。

    做过类似项目的同学,应该知道此类项目中好友之间的关系设计比较复杂,如果用传统的关系型数据库来设计,比如MySQL,那好友之间的关系需要用一张中间表来表示,如下表所示:

    user_id follow_id
    1 5
    2 3
    3 4
    4 4
    5 2

    上面这个好友关系表你可以把它看成一个二维矩阵,其实就是我们前面所学数据结构中的图。图实际上研究的是由顶点和边组成的一种数学模型,这种数学模型非常抽象,并且看起来也很枯燥。虽然图论看起来很枯燥,但是如果大家真正的深入研究下去,就会发现图论是一个非常酷的学科。世界中很多的信息之间的联系,都可以使用图这种抽象的数学方式来进行表示,如下就是表示互联网之间关系的连接图。

    二、图对现实生活的表述

    以图作为模型,来表示真实世界之间的关系,那么可以表示什么样的关系呢?

    1.交通运输

    最典型的莫过于交通运输,它可以使用图来表达,如:每个顶点可以是一个城市,每条边可以是城市之间的道路再扩展一下,每个顶点可以是一个航站楼,每条边可以是相应的航线,每个顶点可以是港口,每条边可以是相应的海运线甚至更宏观的,每个顶点可以是一个星球,每条边可以是星球之间宇宙飞船飞行的航线,亦或更微观的,每个顶点可以是城市中的一座楼,每条边可以是楼和楼之间的街道。如上,都是可以的,这是对于图来说,最直观的一种表示方式,但是,其实很多更抽象的数据关系,也可以用图来表示。

    2.社交网络

    对于社交网络来说,每个顶点可以表示一个人,每条边可以表示

    人与人之间的关系。这种关系可以是像 FaceBook 这种好友的关

    系,也可以是像 Twitter 这种关注的关系。

    3.相似关系   

    每个顶点可以表示一部电影,每条边可以表示两部电影之间的相似程度

    4.互联网

    互联网,也可以用图来表示,每个顶点可以表示一个域名,每条边可以表示域名之间的跳转或 每个顶点可以表示一个页面,每条边可以表示页面之间的连接

    5.工作安排

    在工作中的工作安排,也可以用图来表示,每个顶点可以是一个工作内容,每条边可以是两个工作内容之间的相关程度,或 先后执行的优先级顺序。

    6.脑区活动

    像脑区活动的研究这样更复杂、更专业的领域,也经常用到图,每个顶点可以是一个脑区,每条边可以是脑区之间信息的传递。

    7.程序状态执行

    在计算机程序中,程序状态的执行,也可以用图来表示,每个顶点可以表示一个程序状态,每条边可以表示从一种状态执行到另外一种状态。对于这种情况,最典型的一个应用就是自动机,包括制作专业的编译器,甚至是做一个游戏,都可能要设计一个自动机。在这种情况下,或多或少都会使用图论建模的方法。

    三、大数据集下图算法的作用

    经过前面的分析,我们看到图的作用非常大,在一个最简单的模型中,我们可以把图放在传统的关系型数据库中,也可以使用SQL语句对好友关系数据进行查询。但是像微博、微信这种体量的应用,如果还是继续使用传统数据库,那查询效率会很低,所以我们可以使用专业的图数据库来进行保存。

    1.使用图保存数据的方式

    邻接矩阵(Adjacency Matrix)

    用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,这个二维数组称为邻接矩阵。用邻接矩阵表示图,很容易确定图中任意两个顶点是否有边相连。邻接矩阵分为有向图邻接矩阵和无向图邻接矩阵。对无向图(无向简单图)而言,邻接矩阵一定是对称的,而且对角线一定为零,有向图则不一定如此。

    邻接表(Adjacency List)

    邻接表描述一种紧密相关的数据结构,用于表征图。在邻接表的表示中,对于图中的每个顶点,我们将保存所有其它与之相连的顶点(即“邻接表”)。例如,由吉多·范罗苏姆提出的,使用哈希表将每个顶点和该顶点的邻接点数组关连起来,就可以看作是上述表示方法的一种实现。又如,在Cormenetal中,顶点数组的每个元素都指向一个邻接点单链表

    2.使用图算法进行查询

    不同图算法的时间复杂度是不同的,我们分别来看几种常见的图算法以加深印象。

    • 深度优先搜索
    • 广度优先搜索
    • A*搜索算法:启发式算法
    • 最短路径算法:Dijkstra、Bellman-Ford、Floyd-Warshall
    • 最小生成树 :Prim、Kruskal

    以上这些算法都比较常见,会在后文一一介绍。


    我的微信公众号:架构真经(关注领取免费资源)

    参考文章

    1. https://www.cnblogs.com/wuhan729/p/8481498.html
    2. https://blog.csdn.net/qq_25800311/article/details/89810843
    3. https://blog.csdn.net/simanstar/article/details/78906825
    展开全文
  • 作者:QQ 14588019 WonderfulLife关系型数据库用户数据表users(username字段上建立唯一索引):id username password name surname1 nick@126....

                                                                    作者:QQ 14588019 WonderfulLife

    关系型数据库用户数据表users(username字段上建立唯一索引):

    id    username               password    name     surname
    1     nick@126.com        pass1          Bob       Smith
    2     cathy@suhu.com    pass2          Mario     Rossi

    3     tim@136.com         pass3          Tom       Smith
    Redis 数据存储形式一 键名:字串(GET&SET):
    Key                                      Value

    user:1:username                  nick@126.com
    user:1:password                   pass1
    user:1:name                         Bob
    user:1:surname                    Smith
    user:2:username                  cathy@suhu.com
    user:2:password                   pass2
    user:2:name                         Mario
    user:2:surname                    Rossi
    user:3:username                  tim@136.com
    user:3:password                   pass3
    user:3:name                         Tom
    user:3:surname                    Smith
    user:nick@126.com:id            1
    user:catchy@suhu.com:id      2
    user:tim@136.com:id             3

    Redis 数据存储形式二 键名:json字串(GET&SET):

    Key            Value

    users:1       {\"id\":1,\"username\":\"nick@126.com\",\"password\":\"pass1\",\"name\":\"Bob\",\"surname\":\"Smith\"}
    users:2       {\"id\":2,\"username\":\"cathy@suhu.com\",\"password\":\"pass2\",\"name\":\"Mario\",\"surname\":\"Rossi\"}
    users:3       {\"id\":3,\"username\":\"tim@136.com\",\"password\":\"pass3\",\"name\":\"Tom\",\"surname\":\"Smith\"}

    ================================================================

    Redis 数据存储形式一 键名:字串(GET&SET):

    如果我们知道任何一个 $id,那么我们就能通过以下4个Key读出一条完整的用户记录,当然也可读出几个您需要的字段值。

    user:$id:username,   user:$id:password,   user:$id:name,   user:$id:surname

    第1组指令添加以下这条记录:
    id    username  	password    name     surname
    1     nick@126.com      pass1       Bob      Smith
    
    INCR user:id
    WATCH user:id
    GET user:id
    MULTI
    SETNX user:nick@126.com:id 1
    SET user:1:username "nick@126.com"
    SET user:1:password "pass1"
    SET user:1:name "Bob"
    SET user:1:surname "Smith"
    LPUSH user:list user:1:username
    EXEC
    
    
    第2组指令添加以下这条记录:
    id    username  	password    name     surname
    2     cathy@suhu.com    pass2       Mario    Rossi
    
    INCR user:id
    WATCH user:id
    GET user:id
    MULTI
    SETNX user:cathy@suhu.com:id 2
    SET user:2:username "cathy@suhu.com"
    SET user:2:password "pass2"
    SET user:2:name "Mario"
    SET user:2:surname "Rossi"
    LPUSH user:list user:2:username
    EXEC
    
    
    第3组指令添加以下这条记录:
    id    username  	password    name     surname
    3     tim@136.com       pass3       Tom      Smith
    
    INCR user:id
    WATCH user:id
    GET user:id
    MULTI
    SETNX user:tim@136.com:id 3
    MSET user:3:username "tim@136.com" user:3:password "pass3" user:3:name "Tom" user:3:surname "Smith"
    LPUSH user:list user:3:username
    EXEC
    

    解释说明:以上3组指令中首条指令就是用INCR user:id 生成记录的主键id值,这个值是可以用来分页或者按主键范围查找包含某个连续范围主键的记录集合,此时的user:id功能相当于实现了一个users:count键名称来存储记录的总条数

    但在本范例中,我使用了队列uses:list来存储记录的主键id和username信息,稍后我会演示如何用队列来分页查询

    SETNX user:nick@126.com:id 1
    SETNX user:cathy@suhu.com:id 2
    SETNX user:tim@136.com:id 3
    为何需要执行上面3条指令,用途是用来干什么的呢?它们作用就是可以通过Email去找记录的主键,Email是唯一索引,它与主键id是一对一关系,如果没有上面这样的指令,任何一个用户就没办法通过Email找到主键id的值,更没办法找到本条记录的其它字段信息;
    WATCH user:id 的作用监测一个key的值是否被其它的程序更改。如果这个key在WATCH和EXEC间被修改,这个 MULTI/EXEC 事务的执行的代码块将会失败(return false),MULTI/EXEC 事务执行一系列命令有原子性保证

    动手实践步骤如下:


    127.0.0.1:6379> MGET user:1:username user:1:password user:1:name user:1:surname
    1) "nick@126.com"
    2) "pass1"
    3) "Bob"
    4) "Smith"
    127.0.0.1:6379> MGET user:2:username user:2:password user:2:name user:2:surname
    1) "cathy@suhu.com"
    2) "pass2"
    3) "Mario"
    4) "Rossi"
    127.0.0.1:6379> MGET user:3:username user:3:password user:3:name user:3:surname
    1) "tim@136.com"
    2) "pass3"
    3) "Tom"
    4) "Smith"
    127.0.0.1:6379>
    如果某个/某些用户从系统中被删除,使用GET user:id 返回值 = 记录总数来分页就不对啦

    例如:删除id = 2 这条记录,我们需要删除与主键id = 2的所有键-值对以保证数据的参照完整性

    127.0.0.1:6379> GET user:2:username
    "cathy@suhu.com"
    127.0.0.1:6379> 
    127.0.0.1:6379> MGET user:cathy@suhu.com:id user:2:username user:2:password user:2:name user:2:surname
    1) "2"
    2) "cathy@suhu.com"
    3) "pass2"
    4) "Mario"
    5) "Rossi"
    127.0.0.1:6379> DEL user:cathy@suhu.com:id user:2:username user:2:password user:2:name user:2:surname
    (integer) 5
    127.0.0.1:6379> LRANGE user:list 0 -1
    1) "user:3:username"
    2) "user:2:username"
    3) "user:1:username"
    127.0.0.1:6379> LREM user:list 1 user:2:username
    (integer) 1
    127.0.0.1:6379> LRANGE user:list 0 -1
    1) "user:3:username"
    2) "user:1:username"
    127.0.0.1:6379>


    如果使用user:list队列(List类型的数据)存储记录的主键字符串来进行分页:

    127.0.0.1:6379> LLEN user:list
    (integer) 2
    127.0.0.1:6379> LRANGE user:list 0  20
    1) "user:3:username"
    2) "user:1:username"
    127.0.0.1:6379> LRANGE user:list 21 40
    (empty list or set)
    127.0.0.1:6379> LRANGE user:list 41 60
    (empty list or set)
    127.0.0.1:6379>

    解释说明:
    LLEN user:list  # 返回记录总数 在phpredis扩展里面$redis->lsize("user:list")方法会返回记录总数
    LRANGE user:list 0  20   # 这是第1页的20条记录主键
    LRANGE user:list 21 40   # 这是第2页的20条记录主键
    LRANGE user:list 41 60   # 这是第3页的20条记录主键

    如果使用SortedSet类型存储记录的主键key字符串进行分页:

    127.0.0.1:6379> FLUSHDB # 动手实践前把数据库清空

    第1组指令添加以下这条记录:  
    id    username      password    name     surname  
    1     nick@126.com      pass1       Bob      Smith  
      
    INCR user:id  
    WATCH user:id  
    GET user:id  
    MULTI  
    SETNX user:nick@126.com:id 1  
    SET user:1:username "nick@126.com"  
    SET user:1:password "pass1"  
    SET user:1:name "Bob"  
    SET user:1:surname "Smith"  
    ZADD user:zset 1 user:1:username  
    EXEC  
      
    第2组指令添加以下这条记录:  
    id    username      password    name     surname  
    2     cathy@suhu.com    pass2       Mario    Rossi  
      
    INCR user:id  
    WATCH user:id  
    GET user:id  
    MULTI  
    SETNX user:cathy@suhu.com:id 2  
    SET user:2:username "cathy@suhu.com"  
    SET user:2:password "pass2"  
    SET user:2:name "Mario"  
    SET user:2:surname "Rossi"  
    ZADD user:zset 2 user:2:username 
    EXEC  
      
    第3组指令添加以下这条记录:  
    id    username      password    name     surname  
    3     tim@136.com       pass3       Tom      Smith  
      
    INCR user:id  
    WATCH user:id  
    GET user:id  
    MULTI  
    SETNX user:tim@136.com:id 3  
    MSET user:3:username "tim@136.com" user:3:password "pass3" user:3:name "Tom" user:3:surname "Smith"  
    ZADD user:zset 3 user:3:username  
    EXEC  
    
    127.0.0.1:6379> ZCARD user:zset           # 返回记录总数
    127.0.0.1:6379> ZRANGE user:zset 0  20    # 这是第1页的20条记录主键
    1) "user:1:username"
    2) "user:2:username"
    3) "user:3:username"
    	... ... 
    20) "user:20:username"
    127.0.0.1:6379> ZRANGE user:zset 21 40   # 这是第2页的20条记录主键
    127.0.0.1:6379> ZRANGE user:zset 41 60   # 这是第3页的20条记录主键
    
    我们还可以倒序读取分页需要的主键:
    127.0.0.1:6379> ZREVRANGE user:zset 0  20   # 这是第1页的20条记录主键
    1) "user:60:username"
    2) "user:59:username"
    3) "user:58:username"
    	... ... 
    20) "user:51:username"
    127.0.0.1:6379> ZREVRANGE user:zset 21 40   # 这是第2页的20条记录主键
    127.0.0.1:6379> ZREVRANGE user:zset 41 60   # 这是第3页的20条记录主键
    
    如果某个/某些用户从Redis中被删除,使用GET user:2:username 返回主键对应的Email值
    例如:删除id = 2 这条记录,我们需要删除与主键id = 2的有关的所有键-值对以保证数据的参照完整性
    127.0.0.1:6379> GET user:2:username
    "cathy@suhu.com"
    127.0.0.1:6379> DEL user:cathy@suhu.com:id user:2:username user:2:password user:2:name user:2:surname
    (integer) 5
    127.0.0.1:6379> ZREM user:zset user:2:username # 第1个参数是有序集合的key,第2个参数是被删除记录的key
    (integer) 1
    127.0.0.1:6379> ZRANGE user:zset 0  20  WITHSCORES
    1) "user:1:username"
    2) "1"
    3) "user:3:username"
    4) "3"
    127.0.0.1:6379> ZCARD user:zset
    (integer) 2
    127.0.0.1:6379>

    如果我们使用哈希集合类型HashSet存储1整条记录:

    127.0.0.1:6379> FLUSHALL   # 清空Redis已存储的所有数据
    第1组指令添加以下这条记录:
    id    username  	password    name     surname
    1     nick@126.com      pass1       Bob      Smith
    
    MULTI
    SETNX user:nick@126.com:id 1
    HMSET user:1:hset id  1  username "nick@126.com"  password "pass1"  name "Bob"  surname "Smith"
    LPUSH user:list user:1:hset
    EXEC
    
    第2组指令添加以下这条记录:
    id    username  	password    name     surname
    2     cathy@suhu.com    pass2       Mario    Rossi
    
    MULTI
    SETNX user:cathy@suhu.com:id 2
    HMSET users:2:hset id  2  username "cathy@suhu.com"  password "pass2"  name "Mario"  surname "Rossi"
    LPUSH user:list user:2:hset
    EXEC
    
    
    第3组指令添加以下这条记录:
    id    username  	password    name     surname
    3     tim@136.com       pass3       Tom      Smith
    
    MULTI
    SETNX user:tim@136.com:id 3
    HMSET users:3:hset id  3  username "tim@136.comm"  password "pass3"  name "Tom"  surname "Smith"
    LPUSH user:list user:3:hset
    EXEC
    
    127.0.0.1:6379> LRANGE user:list 0 -1  # 查看队列user:list中所有主键信息
    1) "user:3:hset"
    2) "user:2:hset"
    3) "user:1:hset"
    
    如果使用队列List类型存储记录的主键user:list字符串来进行分页:
    127.0.0.1:6379> LLEN user:list    # 返回记录总数
    127.0.0.1:6379> LRANGE user:list 0  20   # 这是第1页的20条记录主键
    127.0.0.1:6379> LRANGE user:list 21 40   # 这是第2页的20条记录主键
    127.0.0.1:6379> LRANGE user:list 41 60   # 这是第3页的20条记录主键

    如果我们使用队列(列表类型)存储所有的记录:

    127.0.0.1:6379> FLUSHALL   # 清空Redis已存储的所有数据
    127.0.0.1:6379> LPUSH users:list "{\"id\":1,\"username\":\"nick@126.com\",\"password\":\"pass1\",\"name\":\"Bob\",\"surname\":\"Smith\"}"
    127.0.0.1:6379> LPUSH users:list "{\"id\":2,\"username\":\"cathy@suhu.com\",\"password\":\"pass2\",\"name\":\"Mario\",\"surname\":\"Rossi\"}"
    127.0.0.1:6379> LPUSH users:list "{\"id\":3,\"username\":\"tim@136.com\",\"password\":\"pass3\",\"name\":\"Tom\",\"surname\":\"Smith\"}" 
    
    如果使用队列List类型存储json记录来进行分页:
    127.0.0.1:6379> LLEN users:list    # 返回记录总数  
    127.0.0.1:6379> LRANGE users:list 0  20   # 这是第1页的20条记录主键
    1) "{\"id\":3,\"username\":\"tim@136.com\",\"password\":\"pass3\",\"name\":\"Tom\",\"surname\":\"Smith\"}"
    2) "{\"id\":2,\"username\":\"cathy@suhu.com\",\"password\":\"pass2\",\"name\":\"Mario\",\"surname\":\"Rossi\"}"
    3) "{\"id\":1,\"username\":\"nick@126.com\",\"password\":\"pass1\",\"name\":\"Bob\",\"surname\":\"Smith\"}"
    127.0.0.1:6379> LRANGE users:list 21 40   # 这是第2页的20条记录主键
    (empty list or set)
    127.0.0.1:6379> LRANGE users:list 41 60   # 这是第3页的20条记录主键
    (empty list or set)
    127.0.0.1:6379>

    Redis 数据存储形式二 键名:json字串(GET&SET):

    第1组指令添加以下这条记录:  
    id    username      password    name     surname  
    1     nick@126.com      pass1       Bob      Smith  
    
    SET user:id  1    
    WATCH user:id    
    GET user:id    
    MULTI    
    SETNX user:nick@126.com:id 1    
    SET user:1  "{\"id\":1,\"username\":\"nick@126.com\",\"password\":\"pass1\",\"name\":\"Bob\",\"surname\":\"Smith\"}" 
    ZADD user:zset 1 user:1:username    
    EXEC 
    
    第2组指令添加以下这条记录:  
    id    username      password    name     surname  
    2     cathy@suhu.com    pass2       Mario    Rossi  
      
    SET user:id  2
    WATCH user:id  
    GET user:id  
    MULTI  
    SETNX user:cathy@suhu.com:id 2  
    SET user:2  "{\"id\":2,\"username\":\"cathy@suhu.com\",\"password\":\"pass2\",\"name\":\"Mario\",\"surname\":\"Rossi\"}"  
    ZADD user:zset 2 user:2:username  
    EXEC  
      
      
    第3组指令添加以下这条记录:  
    id    username      password    name     surname  
    3     tim@136.com       pass3       Tom      Smith  
      
    SET user:id  3 
    WATCH user:id  
    GET user:id  
    MULTI  
    SETNX user:tim@136.com:id 3  
    SET user:3  "{\"id\":3,\"username\":\"tim@136.com\",\"password\":\"pass3\",\"name\":\"Tom\",\"surname\":\"Smith\"}" 
    ZADD user:zset 3 user:3:username 
    EXEC  
    
    127.0.0.1:6379> ZCARD user:zset           # 返回记录总数  
    127.0.0.1:6379> ZRANGE user:zset 0  20    # 这是第1页的20条记录主键  
    1) "user:1:username"  
    2) "user:2:username"  
    3) "user:3:username"  
        ... ...   
    20) "user:20:username"  
    127.0.0.1:6379> ZRANGE user:zset 21 40   # 这是第2页的20条记录主键  
    127.0.0.1:6379> ZRANGE user:zset 41 60   # 这是第3页的20条记录主键  
      
    我们还可以倒序读取分页需要的主键:  
    127.0.0.1:6379> ZREVRANGE user:zset 0  20   # 这是第1页的20条记录主键  
    1) "user:60:username"  
    2) "user:59:username"  
    3) "user:58:username"  
        ... ...   
    20) "user:51:username"  
    127.0.0.1:6379> ZREVRANGE user:zset 21 40   # 这是第2页的20条记录主键  
    127.0.0.1:6379> ZREVRANGE user:zset 41 60   # 这是第3页的20条记录主键
    本篇讲解完毕 未经许可,不得商用出版发行!
    展开全文
  • 社群是每个品牌与用户沟通的最短路径,成本最低,效率最高,强关系的确立为企业赢得了无限的商业机会和想象空间。 社群作为一种维系用户关系、提高用户粘性的运营手段...虽然社群可以建立在微信群的基础进行营销,...

    shequnyunyingbixiu

    社群是每个品牌与用户沟通的最短路径,成本最低,效率最高,强关系的确立为企业赢得了无限的商业机会和想象空间。

    社群作为一种维系用户关系、提高用户粘性的运营手段,被高密度地喊了两年。刚开始的社群多是以微信群、QQ群等方式将一目标用户聚拢在一起,通过运营人员居中调动气氛以达成某种运营目的,伴随其发展的社群营销也应运而生。

    1

    虽然社群可以建立在微信群的基础上进行营销,但社群并不是微信群,不是将用户拉到微信群里,有事发个链接要求转发,没事互相唠嗑吐槽,就是社群营销,正确来讲,无论是QQ群、微信群、甚至微博、公众号、个人号、小程序……都仅仅是社群的一个载体。

    3

    在如今的移动互联网时代,社群可谓是强化用户与产品关系链最有效的方法之一。那么,到底该如何运营出一个高效且为我们所用的优质社群呢?

    下面小编就简单和大家来讲讲,运营一个优质社群的养成计划。

    1.社群定位,你要清楚你的社群要实现什么目标?

    是为了让更多人更好地了解某个产品,提供某种爱好的交流机会,还是为大家学习成长?还是为提升品牌影响力?还是纯粹的公益组织或兴趣团体?还是聚集某个圈子的精英,影响更多人,还是让某区域的人更好地交流,做某个群体的情感聚集地,情感型or使命价值观型?这些都会影响你社群的受众目标以及后期的运营策略。

    2

    除了清楚目标之外,你还得思考一下,你的社群是为哪一类目标用户而建的?是行业大咖、精英团体?企业家,还是针对中小企业的?还是像混沌大学的新锐创业者?是大学生?还是小米的手机发烧友?

    通常来说社群存在的价值就是要能够解决群员的痛点,做好社群定位就是明确社群的目标用户。

    2.其次是培养社群领袖,形成规范的制度和管理

    社群在初期必定是靠一个或几个意见领袖来吸收第一部分的成员,同时为其他成员提供信息,施加影响。在日常运营管理过程中,也需要这样一部分人来维持整个群互动。一旦群没有意见领袖,时间久了,便很快会成为灌水群,闲聊群。

    3.紧接着是定期举办社群活动,形成用户粘性。

    社群的本质就是建立连接:人与人、人与信息,人与产品。定期举办社群活动,可以促进成员互动,形成用户粘性。

    3

    像以粉丝社群起家的小米,就经常举办线上、线下活动加深粉丝与社群、粉丝与粉丝之间的共鸣。小米4年之间,从100人到6300万人,从小米网、同城会、到小米之家,米粉线下社区与活动策划:2011年9月-2013年10月,小米官方统计的活动469次、事件58次,平均每月21次营销活动!小米通过爆米花奖、同城会、米粉节……将米粉紧密地联系在一起,形成了一种文化与人格上的感召力与粉丝认同的共振感。

    可见,社群活动对提高一个社群的活跃度有着很大的影响。但是,这里需要提醒的一点是,社群活动的目的是为了促进用户之间的交流,而非活动本身,更不是形式上在一起。

    4.最后是学会借助工具来提高社群运营的效率。

    做社群运营,一定要懂得一些工具和技巧。不然再运营一个几百人的社群的时候,其难度可想而知。

    像社群里面经常要做群分享,在微信群做语音分享容易被聊天信息洪流所淹没,也不利于社群内容的二次传播,但如果借助一些第三方直播工具,就可以在后期有效进行多次传播和二次分享,既减少了多次重复分享的时间成本,又扩大了社群的传播影响力。

    2019下半场,商家只有做自己的私域流量池,建立并且经营自己的平台才是真的出路!

    电商宝社群运营软件系统:支持个人号+公众号+社群+小程序一体化管理,助力商家私域流量运营;支持客户端创建群聊,节省移动端操作步骤,提高工作效率;支持客户端消息语音提示音,重要消息不错漏!

    新增小程序

    实现在客户端同屏登录多个微信个人号+多个公众号+多个小程序账号,全部消息一键管理,快捷回复,帮助商家解决多微信号/多微信公众号/多小程序营销场景问题,节省人力成本,提升沟通效率!

    电商宝SCRM/个人号管家软件官网,多微信号管理,推荐电商宝个人号管家!电商宝SCRM平台官网:http://scrm.ecbao.cn

    相关阅读:

    1.如何用好售后服务卡/评价有礼卡,高比率留存老客户,提升店铺复购率

    2.各位老板,请马上换掉你们店铺售后好评卡上的二维码!

    3.电商卖家如何从根本上解决流量问题——自建流量池,私域流量池的趋势!

    4.微信运营技巧:添加微信好友被拒失败,看了这19个验证话术,通过率达99%

    5.商家自建流量池:10种微信引流的方法,值得学习社群营销的商家收藏 !

    展开全文
  • 这么做的目的是,想给计算的两条记录建立一个配对关系,这样好让程序知道计算并赋值 附上我的table4,table5表结构 table4: ![图片说明](https://img-ask.csdn.net/upload/201806/11/1528684135_418523.jpg) table5...
  • VC实现炫眩qq界面的模拟(附源码)

    千次下载 热门讨论 2008-03-10 15:24:28
    没有关系,因为在皮肤文件里面已经编辑和准备好另一外观的窗口皮肤资源,我们只需要将这个聊天对话框创建后跟这个皮肤资源绑定则可,重载这个CtalkDlg类的初始化函数,并添加绑定代码,具体实现如下: BOOL CTalkDlg...
  • 如何实现类似QQ程序的界面 如何一步一步地弹出和关闭窗口 如何弹出鼠标提示窗口 如何制作类似Windows任务栏的窗口 第5章 SDI和MDI窗口 文档、视图、框架窗口间的关系和消息传送规律是怎样的 如何切分窗口 如何固定...
  • 软件项目接单渠道有哪些?

    千次阅读 2019-03-06 21:21:58
    关于如何接软件外包,主要思路是主动出击。...有很多外包QQ群,直接在QQ上搜索就能找到,上面有的项目可以跟进,当然都是僧多肉少。 3、微信的创业群、朋友圈 现在是大众创业、万众创新,通过参加...

     

    关于如何接软件外包,主要思路是主动出击。

    关于项目的搜寻,以我们自己的经验,目前有效的方式有这几个:
    1、同事和朋友等熟人介绍
    这种成功率比较高,因为开发团队和外包方建立了间接的熟人关系,因此在合作讨论、报价、沟通上都会更顺利。
    2、外包QQ群
    有很多外包QQ群,直接在QQ上搜索就能找到,上面有的项目可以跟进,当然都是僧多肉少。
    3、微信的创业群、朋友圈
    现在是大众创业、万众创新,通过参加线下创业活动等方式多加入一些微信创业群,并加一些创业者的微信,在微信创业群或朋友圈里面自然会有寻找外包团队的需求。
    4、多交朋友、多露脸
    前面3种方法,核心就是想方设法多露脸,将人脉扩张。现在是人脉网社会,人脉越广,获得的渠道也就越多。
    5、接单服务平台
    国内的:汇新云。汇新云是专注于软件采购、软件定制的产业链服务平台,平台上面的项目资源精准且多元化,专注于于软件行业。入驻成功后即可以接项目了/

     

    展开全文
  • 八、课程设计后作业(不考核) 引入可视化设计,在本课程设计基础实现可视化QQ即时通信功能,包括: 多人聊天;聊天记录查询。需要涉及知识如下: 1、网络通信编程; 2、可视化编程; 3、多线程编程; 4、数据库...
  • 首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈什么话题,呵呵!...
  • 首先要理解基本的原理,2台电脑间实现TCP通讯,首先要建立起连接,在这里要提到服务器端与客户端,两个的区别通俗讲就是主动与被动的关系,两个人对话,肯定是先有人先发起会话,要不然谁都不讲,谈什么话题,呵呵!...
  • asp.net知识库

    2015-06-18 08:45:45
    使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的...
  • 其实很多 小白 不懂如何创建BAT 文件 其实很简单 在桌面右击新建一个文本 把adb forward tcp:4747 tcp:4747 粘贴到文本里 保存 把文本的 格式改为.bat 即可(文本名字可以忽视) 先运行手机端。然后在PC运行这个...
  • 《百络网警》家庭免费版网络管理软件和其它市面的互联网监控软件在管理理念有很大的不同,我们认为对小孩的互联网管理应建立在尊重和沟通的基础,对小孩互联网的使用应以引导和教育为主,而不能以强制手段...
  • 第5章 如何走得更稳——测试驱动的基本概念 91 5.1 讲解 92 5.1.1 什么是JUnit 92 5.1.2 使用JUnit的一般过程 92 5.1.3 安装JUnit 93 5.2 编写单元测试 93 5.2.1 第1个单元测试 93 5.3 编写单元测试的步骤 95...
  • 一般企业的IT水平大多处于基本应用阶段,如打字(Word)、统计(Excel)、交流(发邮件、QQ等)、上网(浏览网页、搜索)等等,要电子商务时,门在哪里是个现实的问题 1.1.2 没有配套的管理系统 需要专门的进销存...
  • 第5章 如何走得更稳——测试驱动的基本概念 91 5.1 讲解 92 5.1.1 什么是JUnit 92 5.1.2 使用JUnit的一般过程 92 5.1.3 安装JUnit 93 5.2 编写单元测试 93 5.2.1 第1个单元测试 93 5.3 编写单元测试的步骤 95...
  • 第5章 如何走得更稳——测试驱动的基本概念 91 5.1 讲解 92 5.1.1 什么是JUnit 92 5.1.2 使用JUnit的一般过程 92 5.1.3 安装JUnit 93 5.2 编写单元测试 93 5.2.1 第1个单元测试 93 5.3 编写单元测试的步骤 95...
  • 第5章 如何走得更稳——测试驱动的基本概念 91 5.1 讲解 92 5.1.1 什么是JUnit 92 5.1.2 使用JUnit的一般过程 92 5.1.3 安装JUnit 93 5.2 编写单元测试 93 5.2.1 第1个单元测试 93 5.3 编写单元测试的步骤 95...
  • 第5章 如何走得更稳——测试驱动的基本概念 91 5.1 讲解 92 5.1.1 什么是JUnit 92 5.1.2 使用JUnit的一般过程 92 5.1.3 安装JUnit 93 5.2 编写单元测试 93 5.2.1 第1个单元测试 93 5.3 编写单元测试的步骤 95...
  • 软件界面设计工具_3款合集

    千次下载 热门讨论 2010-06-29 03:52:47
    再要说的一点是这款软件是要付费的,79美元(也可以免费,具体如何免费,请看网站的说明),相对于它能节省下来的时间和提高的效率,是很值得的。Peldi说在2008年,这款软件就从1,322位付费用户那获得了162,302...
  • DbC要求各个组件各尽其责,将交流和协作建立在非常明晰严格的条款之基础。DbC是不容忽视的,其所涉及的层面和深度,或许比我们想象的要广,要深。 37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新...
  • DbC要求各个组件各尽其责,将交流和协作建立在非常明晰严格的条款之基础。DbC是不容忽视的,其所涉及的层面和深度,或许比我们想象的要广,要深。 37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新...
  • DbC要求各个组件各尽其责,将交流和协作建立在非常明晰严格的条款之基础。DbC是不容忽视的,其所涉及的层面和深度,或许比我们想象的要广,要深。 37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新...
  • DbC要求各个组件各尽其责,将交流和协作建立在非常明晰严格的条款之基础。DbC是不容忽视的,其所涉及的层面和深度,或许比我们想象的要广,要深。 37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新...
  • 1、如何由数列的前面几项写出一个通项公式.  利用观察、分析、归纳的思想方法得出通项公式,本身也是一个重要的数学思想. 例5、写出数列的一个通项公式,使它的前5项分别是下列各数:  (1)  (2) ; (3)5...
  • 基本每步操作都 ┃ ┃ 用相应的提示或说明,基本可以不用借助任何第三方方工具或说明书。另 ┃ ┃ 外,由于原 Dvbbs 程序的设计问题,主题管理页面的管理权限并入对帖子表┃ ┃ 管理权限中,即:只要...

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

qq上如何建立关系