Rumah pembangunan bahagian belakang tutorial php 微博关注是根据什么来知道你关注小弟我,小弟我关注你了?数据库如何设计

微博关注是根据什么来知道你关注小弟我,小弟我关注你了?数据库如何设计

Jun 13, 2016 am 11:11 AM
mongo mysql nbsp redis

微博关注是根据什么来知道你关注我,我关注你了?数据库怎么设计?
如题,我想做个微博,但是关注这快 该怎么操作 用php写。。


------解决方案--------------------
表结构 估计像双链表
------解决方案--------------------
建一张表,两个字段:
关注者id
被关注者id
------解决方案--------------------
我想微博这么火,应该是赶上智能手机发展的时机了 呵呵
------解决方案--------------------
mysql的话,就不说了。这些都属于热数据,如果真的是具备一定规模的微博,查mysql直接死翘翘了。

用redis的话,用n个list或sets或hash table+list。名字为前缀+被关注者id,内容就是关注者的id列表或集合。类似:

owner:1 = {3,1,5,8,12,64...}
owner:2 = {32,56,22,11,4...}
...


其实最难的设计点在于被关注者发一条微博,而他的所有粉丝需要收到这个消息。楼主想过这个如何实现嘛?
尤其是一个明星,他有上百万上千万粉丝。解决方案有两个思路:

1 由被关注者主动推数据
2 由被关注者向粉丝推送一个通知,然后由粉丝去拉数据

不过这样就意味着他发一条消息需要有千万个人来访问这张消息表或发一条消息需要写向千万个粉丝的消息表写数据。

由于redis的数据结构过于简单,所以完全用其建表虽然可以实现但确实非常麻烦,其实用mongo比较合适。

------解决方案--------------------
引用:
其实最难的设计点在于被关注者发一条微博,而他的所有粉丝需要收到这个消息。楼主想过这个如何实现嘛?
尤其是一个明星,他有上百万上千万粉丝。解决方案有两个思路:

1 由被关注者主动推数据
2 由被关注者向粉丝推送一个通知,然后由粉丝去拉数据

不过这样就意味着他发一条消息需要有千万个人来访问这张消息表或发一条消息需要写向千万个粉丝的消息表写数据。

由于redis的数据结构过于简单,所以完全用其建表虽然可以实现但确实非常麻烦,其实用mongo比较合适。


这个问题我一直想不明白,只有膜拜的份了
------解决方案--------------------
引用:
引用:其实最难的设计点在于被关注者发一条微博,而他的所有粉丝需要收到这个消息。楼主想过这个如何实现嘛?
尤其是一个明星,他有上百万上千万粉丝。解决方案有两个思路:

1 由被关注者主动推数据
2 由关注者去被关注者的消息表拉数据

不过这样就意味着他发一条消息需要有千万个人来访问这张消息表或发一条消息需……


其实这个我也是看新浪微博的架构师说的,他只说了大概思路,我是根据他的思路联想存储结构如何设计,所以不一定完全正确。

第一种方案,应该是每个人都有一张自己的消息表。当被关注者发消息时,会将此消息写入关注者的消息表中,内容大概有被关注者id、消息内容、发送时间。这里最大的问题在于要向千万张表写数据。

第二种方案,每个人的消息只存储在自己的消息表中,当自己发消息后,写入。然后由其所有关注者定时从这张表中取数据。或者当自己发消息后,向所有关注者发一个通知,比如发个1,关注者就来自己的消息表取数据。这种方法当某人粉丝数量很多时,会造成这张表的并发读操作非常高。

简单的看,两种方案都有利弊。但都还有很大优化空间。新浪微博两种方案都用过。并且在这过程中也摸索出了一些经验。

第一种方案他们采取过分批推送的策略,会将用户按活跃度划分几个等级,推送顺序是按照用户活跃度等级来决定的。分批推送一定程度上减轻了负担。

第二种方案可以采用冗余多份数据负载均衡的办法将那一张表的并发读操作均衡开。比如我有一张消息表,但这张消息表存储n份,在n台服务器上,内容完全一致。当我发消息时同时向这几台服务器的表写数据,或者分批写入,然后我不同的粉丝,会根据一定策略来决定去哪台服务器读。这里也可以将用户活跃度作为参数,活跃度高的粉丝去服务器a读(服务器a中的消息表在分批写入时最优先被写入)

想来想去,方案似乎就两种,但可优化的地方还很多,例如在读取数据时,加入cache层,cache层只存储每个用户最近发表的消息,数据定期归档。
------解决方案--------------------
我觉得这个真正难的地方是服务器架构设计,而不是实现方法。再优秀的方法,也无法应对日益增大的数据量,只有调整服务器架构,将压力均衡开,才是长期发展之路。
------解决方案--------------------
你就不能说点让人明白的吗?
引用:
引用:引用:其实最难的设计点在于被关注者发一条微博,而他的所有粉丝需要收到这个消息。楼主想过这个如何实现嘛?
尤其是一个明星,他有上百万上千万粉丝。解决方案有两个思路:

1 由被关注者主动推数据
2 由关注者去被关注者的消息表拉数据

不过这样就意味着他发一条消息需要有千万个人来访……

------解决方案--------------------
引用:
你就不能说点让人明白的吗?引用:引用:引用:其实最难的设计点在于被关注者发一条微博,而他的所有粉丝需要收到这个消息。楼主想过这个如何实现嘛?
尤其是一个明星,他有上百万上千万粉丝。解决方案有两个思路:

1 由被关注者主动推数据
2 由关注者去被……

跑题了
------解决方案--------------------
你们想的太复杂了,确实如此而已:
引用:
建一张表,两个字段:
关注者id
被关注者id

------解决方案--------------------
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara Membina Mod Kluster Redis Cara Membina Mod Kluster Redis Apr 10, 2025 pm 10:15 PM

Mod Redis cluster menyebarkan contoh Redis ke pelbagai pelayan melalui sharding, meningkatkan skalabilitas dan ketersediaan. Langkah -langkah pembinaan adalah seperti berikut: Buat contoh Redis ganjil dengan pelabuhan yang berbeza; Buat 3 contoh sentinel, memantau contoh redis dan failover; Konfigurasi fail konfigurasi sentinel, tambahkan pemantauan maklumat contoh dan tetapan failover; Konfigurasi fail konfigurasi contoh Redis, aktifkan mod kluster dan tentukan laluan fail maklumat kluster; Buat fail nodes.conf, yang mengandungi maklumat setiap contoh Redis; Mulakan kluster, laksanakan perintah Buat untuk membuat kluster dan tentukan bilangan replika; Log masuk ke kluster untuk melaksanakan perintah maklumat kluster untuk mengesahkan status kluster; buat

Cara membuka phpmyadmin Cara membuka phpmyadmin Apr 10, 2025 pm 10:51 PM

Anda boleh membuka phpmyadmin melalui langkah -langkah berikut: 1. Log masuk ke panel kawalan laman web; 2. Cari dan klik ikon phpmyadmin; 3. Masukkan kelayakan MySQL; 4. Klik "Login".

Cara membaca kod sumber redis Cara membaca kod sumber redis Apr 10, 2025 pm 08:27 PM

Cara terbaik untuk memahami kod sumber REDIS adalah dengan langkah demi langkah: Dapatkan akrab dengan asas -asas Redis. Pilih modul atau fungsi tertentu sebagai titik permulaan. Mulakan dengan titik masuk modul atau fungsi dan lihat baris kod mengikut baris. Lihat kod melalui rantaian panggilan fungsi. Berhati -hati dengan struktur data asas yang digunakan oleh REDIS. Kenal pasti algoritma yang digunakan oleh Redis.

Cara menggunakan perintah redis Cara menggunakan perintah redis Apr 10, 2025 pm 08:45 PM

Menggunakan Arahan Redis memerlukan langkah -langkah berikut: Buka klien Redis. Masukkan arahan (nilai kunci kata kerja). Menyediakan parameter yang diperlukan (berbeza dari arahan ke arahan). Tekan Enter untuk melaksanakan arahan. Redis mengembalikan tindak balas yang menunjukkan hasil operasi (biasanya OK atau -r).

Ringkasan kelemahan phpmyadmin Ringkasan kelemahan phpmyadmin Apr 10, 2025 pm 10:24 PM

Kunci strategi pertahanan keselamatan phpmyadmin adalah: 1. Gunakan versi terkini Phpmyadmin dan kerap mengemas kini PHP dan MySQL; 2. Mengawal hak akses, penggunaan. Htaccess atau kawalan akses pelayan web; 3. Dayakan kata laluan yang kuat dan pengesahan dua faktor; 4. Menyokong pangkalan data secara teratur; 5. Berhati -hati semak fail konfigurasi untuk mengelakkan mendedahkan maklumat sensitif; 6. Gunakan Firewall Aplikasi Web (WAF); 7. Menjalankan audit keselamatan. Langkah-langkah ini secara berkesan dapat mengurangkan risiko keselamatan yang disebabkan oleh phpmyadmin disebabkan oleh konfigurasi yang tidak betul, versi yang lebih lama atau risiko keselamatan alam sekitar, dan memastikan keselamatan pangkalan data.

PHPMyAdmin Connection MySQL PHPMyAdmin Connection MySQL Apr 10, 2025 pm 10:57 PM

Bagaimana untuk menyambung ke MySQL menggunakan phpmyadmin? URL untuk mengakses phpmyadmin biasanya http: // localhost/phpmyadmin atau http: // [alamat ip pelayan anda]/phpmyadmin. Masukkan nama pengguna dan kata laluan MySQL anda. Pilih pangkalan data yang ingin anda sambungkan. Klik butang "Sambungan" untuk membuat sambungan.

Cara Mengosongkan Data dengan Redis Cara Mengosongkan Data dengan Redis Apr 10, 2025 pm 08:03 PM

Dua kaedah berikut boleh digunakan untuk membersihkan data dalam REDIS: Perintah Flushall: Padam semua kunci dan nilai dalam pangkalan data. Config ResetStat Command: Tetapkan semula semua negeri pangkalan data (termasuk kunci, nilai, dan statistik lain).

Cara Menetapkan Dasar Tamat Redis Cara Menetapkan Dasar Tamat Redis Apr 10, 2025 pm 10:03 PM

Terdapat dua jenis strategi tamat tempoh data REDIS: Penghapusan berkala: Imbasan berkala untuk memadamkan kunci yang telah tamat tempoh, yang boleh ditetapkan melalui parameter-cap-cap-rempah yang telah tamat tempoh dan parameter kelewatan-cap-remove-time-time. Penghapusan Lazy: Periksa kekunci yang telah tamat tempoh hanya apabila kunci dibaca atau ditulis. Mereka boleh ditetapkan melalui parameter lazon-lazy-expire-expire-expire, lazy-lazy-user-del parameter.

See all articles