akun gitlab diretas dan repo dihapus
<p>saya sedang mengerjakan sebuah proyek, <em> repo pribadi</em>, dan tiba-tiba semua komit menghilang dan diganti dengan satu file teks yang mengatakan</p><blockquote> <p>untuk memulihkan kode anda yang hilang dan menghindari membocorkannya: kirimkan kami 0,1 bitcoin (btc) ke alamat bitcoin kami 1es14c7qlb5cyhlmuekctxlgc1fv2ti9da dan hubungi kami melalui email di admin@gitsbackup.com dengan git login dan bukti pembayaran. jika anda tidak yakin apakah kami memiliki data anda, hubungi kami dan kami akan mengirimkan bukti kepada anda. kode anda diunduh dan dicadangkan di server kami. jika kami tidak menerima pembayaran anda dalam 10 hari ke depan, kami akan membuat kode anda publik atau menggunakannya sebaliknya.</p> </blockquote><p>pada saat ini terjadi, pencarian google tidak muncul apa-apa, tetapi dalam satu jam atau lebih <a href="https://www.bitcoinabuse.com/reports/1es14c7qlb5cyhlmuekctxlgc1fv2ti9da">ini</a> mulai muncul.</p><p>saya menggunakan sourcetree (selalu terbaru) tetapi entah bagaimana saya ragu sourcetree adalah masalahnya, atau bahwa sistem saya (windows 10) terganggu. saya tidak mengatakan itu bukan itu, hanya saja saya meragukannya.</p><p>ini hanya terjadi pada salah satu repositori saya (semuanya pribadi) dan yang lainnya tidak tersentuh. saya mengubah kata sandi saya, mengaktifkan otentikasi 2 faktor, menghapus satu token akses yang tidak saya gunakan selama bertahun-tahun dan menulis email ke gitlab dengan harapan mereka bisa memberi tahu saya tentang di mana/siapa penyerang masuk.</p><p>kata sandi saya adalah kata sandi yang lemah yang bisa dengan mudah dipecahkan melalui brute-force (ini bukan kata yang umum tetapi dimulai dengan "a" dan hanya memiliki karakter az di dalamnya) dan bisa jadi mereka hanya secara otomatis memeriksa jika mereka dapat mengakses akun dan kemudian menjalankan beberapa perintah git. mungkin juga alamat email saya dan kata sandi tertentu ada dalam daftar akun yang bocor. orang mungkin berpendapat bahwa jika ini adalah bagaimana mereka masuk, mereka hanya akan mengubah kredensial akun tetapi mencari di internet mengungkapkan bahwa dalam kasus ini gitlab/github hanya akan mengembalikan kredensial untuk anda, dan jadi saya menganggap ini adalah alasan mengapa mereka tidak melakukannya. lakukan dengan cara ini.</p><p>bisa juga token akses lama itu, saya tidak ingat apa dan di mana saya menggunakannya di masa lalu - kemungkinan besar dihasilkan untuk digunakan pada komputer yang saya miliki sebelumnya, jadi saya ragu bahwa itu masalahnya.</p><p>ada juga 4 pengembang yang mengerjakannya, semua memiliki akses penuh ke repositori, sehingga akun mereka yang dikompromikan juga kemungkinan.</p><p>saya telah memindai komputer saya dengan bitdefender dan tidak dapat menemukan apa pun, tetapi saya tidak melakukan hal-hal yang teduh di internet sehingga saya tidak berpikir bahwa saya terinfeksi malware/trojan adalah penyebabnya.</p><p>saya menunggu jawaban dari gitlab dan mungkin mereka bisa menjelaskan ini. saya memiliki basis kode pada git lokal saya, jadi itu bukan masalah, tapi saya belum mendorong kode kembali ke repositori dulu. juga, kalau-kalau kode diterbitkan di suatu tempat, saya akan mengubah kata sandi yang ditemukan di sumber (database, akun imap)</p><p><strong> [~ # ~] pembaruan [~ # ~] </strong></p><p>saya menemukan bahwa kode itu tidak hilang. saya mencoba mengakses hash komit dan berhasil. jadi kodenya ada tapi ada yang salah dengan kepala. pengetahuan saya tentang ini sangat terbatas tetapi</p><p><code>git reflog</code></p><p>menunjukkan semua komitmen saya.</p><p>apa artinya ini <em> untuk saya</em> adalah bahwa para penyerang kemungkinan besar tidak mengkloning repositori (akan menjadi mimpi buruk logistik untuk melakukan ini untuk semua korban, tetap) dan bahwa peluang bagi mereka untuk pergi kode sumber mencari data sensitif, atau membuat kode publik rendah. ini juga berarti <em> untuk saya</em> itu bukan serangan yang ditargetkan tetapi serangan massal acak, yang dilakukan oleh skrip. saya sangat berharap ini terjadi untuk kita sendiri!</p><p><strong> pembaruan 2 </strong></p><p>jadi, jika anda melakukannya</p><pre><code>git checkout origin/master </code></pre><p>anda akan melihat komit penyerang</p><pre><code>git checkout master </code></pre><p>anda akan melihat semua file anda</p><pre><code>git checkout origin/master git reflog # take the sha of the last commit of yours git reset [sha] </code></pre><p>akan memperbaiki asal/master anda ... tetapi</p><pre><code>git status </code></pre><p>sekarang akan berkata</p><pre><code>head detached from origin/master </code></pre><p>masih mencari perbaikan untuk ini</p><p><strong> pembaruan 3 </strong></p><p>jika anda memiliki file secara lokal, jalankan</p><pre><code>git push origin head:master --force </code></pre><p>akan memperbaiki semuanya. lihat <a href="https://security.stackexchange.com/questions/209448/gitlab-account-hacked-and-repo-wiped#comment421769\_209448">peter</a> komentar</p><p>jadi, pertanyaannya adalah perintah apa yang akan membuat repositori saya kembali ke keadaan bekerja sebelumnya dengan asumsi anda tidak memiliki repo secara lokal, seperti untuk bagaimana serangan itu masuk, saya berharap jawaban dari gitlab (jika ada) akan membantu kami lebih.</p><p>ada diskusi yang sedang terjadi <a href="https://chat.stackexchange.com/rooms/93191/discussion-on-question-by-raymie-github-account-hacked-and-repo-wiped">di sini</a> </p><p>serangan itu menargetkan akun github, bitbucket dan gitlab. <a href="https://github.com/search?o=desc&amp;q=1es14c7qlb5cyhlmuekctxlgc1fv2ti9da&amp;s=indexed&amp;type=code">di sini</a> besarnya di repositori publik github</p>
<p>kamu bisa menggunakan <code>git reflog</code> dalam klon dan checkout komit terakhir sebelum ini terjadi.</p><p>itu terjadi karena <code>.git/config</code> pada server web anda (dalam direktori repo kloning) menyertakan url jarak jauh dan orang-orang menambahkan nama pengguna: kata sandi di dalamnya yang seharusnya tidak pernah terjadi - orang harus menggunakan ssh, menggunakan kunci atau mengotentikasi pada setiap tarikan. jangan pernah menyimpan kredensial anda dalam file konfigurasi. gunakan pembantu kredensial.</p><p>sumber: <a href="https://www.reddit.com/r/git/comments/bk1eco/comment/emg3cxg">https://www.reddit.com/r/git/comments/bk1eco/comment/emg3cxg</a> </p><blockquote> <p>halo, ini aku, lelaki dengan cadanganmu ..</p> <p>saya akan mengungkapkan dosa-dosa anda</p> <p>ini adalah artikel dari tahun 2015, yang lebih rinci, <a href="https://en.internetwache.org/dont-publicly-expose-git-or-how-we-downloaded-your-websites-sourcecode-an-analysis-of-alexas-1m-28-07-2015/">https://en.internetwache.org/dont-publicly-expose-git-or-how-we-downloaded-your-websites-sourcecode-an-analysis -of-alexas-1m-28-07-2015 /</a> </p> </blockquote><p>artikel oleh internetwache tentang hal ini: <a href="https://en.internetwache.org/dont-publicly-expose-git-or-how-we-downloaded-your-websites-sourcecode-an-analysis-of-alexas-1m-28-07-2015/">https://en.internetwache.org/dont-publicly-expose-git-or-how-we-downloaded-your-websites-sourcecode-an-analysis-of-alexas- 1m-28-07-2015 /</a> </p><p>untuk mencegah hal ini memblokir akses ke direktori yang dimulai dengan titik, lihat <a href="https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess#l528-l551">https://github.com/h5bp/html5-boilerplate/blob/master/dist/.htaccess#l528-l551</a> </p><pre><code># - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # block access to all hidden files and directories with the exception of # the visible content from within the `/.well-known/` hidden directory. # # these types of files usually contain user preferences or the preserved # state of an utility, and can include rather private places like, for # example, the `.git` or `.svn` directories. # # the `/.well-known/` directory represents the standard (rfc 5785) path # prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`, # `/.well-known/keybase.txt`), and therefore, access to its visible # content should not be blocked. # # https://www.mnot.net/blog/2010/04/07/well-known # https://tools.ietf.org/html/rfc5785 &lt;ifmodule mod\_rewrite.c&gt; rewriteengine on rewritecond %{request\_uri} "!(^|/)\.well-known/([^./]+./?)+$" [nc] rewritecond %{script\_filename} -d [or] rewritecond %{script\_filename} -f rewriterule "(^|/)\." - [f] &lt;/ifmodule&gt; </code></pre><p>atau pisahkan <code>.git</code> direktori dan data menggunakan <code>--separate-git-dir</code>.</p><blockquote> <p>--separate-git-dir = &lt;git dir&gt;<br> alih-alih menginisialisasi repositori sebagai direktori ke $ git\_dir atau ./.git/, buat file teks di sana yang berisi path ke repositori yang sebenarnya. file ini bertindak sebagai tautan simbolis filesystem-agnostic git ke repositori.</p> <p>jika ini adalah inisialisasi ulang, repositori akan dipindahkan ke jalur yang ditentukan.</p> </blockquote><p>tetapi yang terbaik adalah <code>rm -rf .git</code> setelah penyebaran - yang seharusnya hanya menyalin artefak build ke tujuan menggunakan <code>rsync</code>.</p><p> <a href="https://git-scm.com/docs/git-init#documentation/git-init.txtseparate-git-dirltgitdirgt">https://git-scm.com/docs/git-init#documentation/git-init.txtseparate-git-dirltgitdirgt</a> </p><blockquote> <p>--separate-git-dir = &lt;git dir&gt;<br> alih-alih menempatkan repositori yang dikloning di tempat yang seharusnya, letakkan repositori yang dikloning pada direktori yang ditentukan, kemudian buat tautan simbolik git filesystem-agnostik ke sana. hasilnya adalah repositori git dapat dipisahkan dari pohon kerja.</p> </blockquote><p> <a href="https://git-scm.com/docs/git-clone#documentation/git-clone.txtseparate-git-dirltgitdirgt">https://git-scm.com/docs/git-clone#documentation/git-clone.txtseparate-git-dirltgitdirgt</a> </p><p> <a href="https://stackoverflow.com/a/8603156/753676">https://stackoverflow.com/a/8603156/753676</a> </p><p>informasi tentang kunci penyebaran dan bantuan kredensial:</p><p> <a href="https://developer.github.com/v3/guides/managing-deploy-keys/">https://developer.github.com/v3/guides/managing-deploy-keys/</a> </p><blockquote> <p>menyebarkan kunci hanya-baca secara default, tetapi anda bisa memberinya akses tulis saat menambahkannya ke repositori.</p> </blockquote><p> <a href="https://gist.github.com/zhujunsan/a0becf82ade50ed06115">https://gist.github.com/zhujunsan/a0becf82ade50ed06115</a> </p><p> <a href="https://help.github.com/en/articles/caching-your-github-password-in-git">https://help.github.com/en/articles/caching-your-github-password-in-git</a> </p><p>gunakan <code>git push -u origin master -f &amp;&amp; git push --tags -f</code> dari klon lokal anda ke push semua referensi untuk master, tag dan seterusnya ke remote dan kemudian aktifkan 2fa di akun anda.</p><p>jika lebih banyak cabang yang terpengaruh gunakan <code>git push -u --all -f</code></p><p>aktifkan juga 2fa untuk mengurangi kemungkinan serangan semacam itu.</p><p><strong> harap jangan lupa untuk mengubah semua login/kata sandi yang dikompromikan dan mencabut setiap sesi yang tidak dikenal. </strong></p>
Halo,


 


Jika akun Gmail Anda diretas, Anda dapat memulihkannya. Silakan lihat pada artikel berikut untuk memulihkan akun Gmail Anda: [Recovery Atau Pemulihan Akun Gmail](https://id.ccm.net/faq/21-recovery-atau-pemulihan-akun-gmail) <p>arsitektur innodb menuntut penggunaan empat tipe dasar halaman info</p><ul> <li>halaman data tabel</li> <li>halaman indeks tabel</li> <li>tabel metadata</li> <li> <a href="http://en.wikipedia.org/wiki/multiversion\_concurrency\_control"><strong> [~ # ~] mvcc [~ # ~] </strong></a> data (untuk mendukung isolasi transaksi dan <a href="http://en.wikipedia.org/wiki/acid"><strong> kepatuhan acid </strong></a> ) <ul> <li>segmen kembalikan</li> <li>batalkan spasi</li> <li>double write buffer (penulisan latar belakang untuk mencegah ketergantungan pada caching os)</li> <li>masukkan buffer (mengelola perubahan pada indeks sekunder yang tidak unik)</li> </ul> </li> </ul><p> <a href="http://www.scribd.com/doc/31337494/xtradb-innodb-internals-in-drawing"><strong> <em> lihat representasi pictorial dari ibdata1</em> </strong></a> </p><p>secara default, <a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar\_innodb\_file\_per\_table">innodb\_file\_per\_table</a> dinonaktifkan. ini menyebabkan keempat jenis halaman info mendaratkan satu file bernama ibdata1. banyak orang mencoba menyebar data dengan membuat banyak file ibdata. ini dapat menyebabkan fragmentasi data dan halaman indeks.</p><p>inilah sebabnya saya sering <a href="https://stackoverflow.com/a/4056261/491757">merekomendasikan untuk membersihkan infrastruktur innodb, menggunakan file ibdata1 default dan tidak lebih</a> .</p><p>menyalin sangat berbahaya karena infrastruktur di mana innodb bekerja. ada dua infrastruktur dasar</p><ul> <li>innodb\_file\_per\_table dinonaktifkan</li> <li>innodb\_file\_per\_table diaktifkan</li> </ul><h1>innodb ( <a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar\_innodb\_file\_per\_table">innodb\_file\_per\_table</a> dinonaktifkan)</h1><p>dengan <a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar\_innodb\_file\_per\_table">innodb\_file\_per\_table</a> dinonaktifkan, semua jenis info innodb ini tinggal di dalam ibdata1. satu-satunya manifestasi dari setiap tabel innodb di luar ibdata1 adalah file .frm dari tabel innodb. menyalin semua data innodb sekaligus membutuhkan menyalin semua/var/lib/mysql.</p><p>menyalin tabel innodb individu sama sekali tidak mungkin. anda harus membuang mysql untuk mengekstrak dump tabel sebagai representasi logis dari data dan definisi indeks yang sesuai. anda kemudian akan memuat dump itu ke database lain di server yang sama atau server lain.</p><h1>innodb ( <a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar\_innodb\_file\_per\_table">innodb\_file\_per\_table</a> diaktifkan)</h1><p>dengan <a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar\_innodb\_file\_per\_table">innodb\_file\_per\_table</a> diaktifkan, data tabel dan indeksnya tinggal di folder database di sebelah file .frm. misalnya, untuk tabel db1.mytable, manifestasi dari tabel innodb di luar ibdata1 adalah:</p><ul> <li><code>/var/lib/mysql/db1/mytable.frm</code></li> <li><code>/var/lib/mysql/db1/mytable.ibd</code></li> </ul><h1>tablespace sistem <code>ibdata1</code></h1><p>semua metadata untuk db1.mytable masih berada di ibdata1 dan <em> sama sekali tidak ada jalan lain</em>. redo log dan data mvcc juga masih hidup dengan ibdata1.</p><p>ketika datang ke tabel fragmentasi, inilah yang terjadi pada ibdata1:</p><ul> <li><strong> <a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar\_innodb\_file\_per\_table">innodb\_file\_per\_table</a> diaktifkan </strong>: anda dapat mengecilkan db1.mytables dengan <code>alter table db1.mytable engine=innodb;</code> atau <code>optimize table db1.mytable;</code>. ini menghasilkan /var/lib/mysql/db1/mytable.ibd secara fisik lebih kecil tanpa fragmentasi.</li> <li><strong> <a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar\_innodb\_file\_per\_table">innodb\_file\_per\_table</a> dinonaktifkan </strong>: anda tidak dapat mengecilkan db1.mytables dengan <code>alter table db1.mytable engine=innodb;</code> atau <code>optimize table db1.mytable;</code> karena berada dengan ibdata1. menjalankan perintah mana pun sebenarnya, membuat tabel berdekatan dan lebih cepat untuk membaca dan menulis. sayangnya, itu terjadi pada akhir ibdata1. ini membuat ibdata1 tumbuh dengan cepat. <a href="https://stackoverflow.com/a/4056261/491757">ini sepenuhnya dibahas di pos pembersihan innodb saya</a> .</li> </ul><h1>peringatan (atau bahaya sebagai <a href="http://www.youtube.com/watch?v=rg0ochx16dg&amp;feature=related">robot akan mengatakan dalam lost in space</a> )</h1><p>jika anda berpikir untuk hanya menyalin file .frm dan .ibd, anda sejalan dengan dunia yang menyakitkan. menyalin file .frm dan .ibd dari tabel innodb hanya baik <strong> <em> jika dan hanya jika anda dapat menjamin bahwa id tablespace dari file .ibd cocok persis dengan entri tablespace id di metadata dari file ibdata1</em> </strong>.</p><p>saya menulis dua posting di dba stackexchange tentang konsep id tablespace ini</p><ul> <li> <a href="https://dba.stackexchange.com/questions/9500/table-compression-in-innodb/9555#9555">kompresi tabel dalam innodb?</a> (di bawah judul 'memulihkan database')</li> <li> <a href="https://dba.stackexchange.com/questions/6268/how-to-recover-an-innodb-table-whose-files-were-moved-around/6269#6269">cara memulihkan tabel innodb yang file-nya dipindahkan</a> </li> </ul><p>berikut ini adalah tautan yang sangat baik tentang cara memasang kembali file .ibd ke ibdata1 jika id tablespace tidak cocok: <a href="http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file">http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in- file</a> . setelah membaca ini, anda harus segera menyadari bahwa menyalin file .ibd benar-benar gila.</p><p>untuk innodb, anda hanya perlu memindahkan sesuatu ini</p><pre><code>create table db2.mytable like db1.mytable; insert into db2.mytable select * from db1.mytable; </code></pre><p>untuk membuat salinan tabel innodb.</p><p>jika anda memigrasikannya ke server db lain, gunakan mysqldump.</p><p>sehubungan dengan mencampur semua tabel innodb dari semua database, saya benar-benar dapat melihat kebijaksanaan dalam melakukannya. di perusahaan hosting db/web perusahaan saya, saya memiliki satu klien mysql yang memiliki tabel di satu basis data yang batasannya dipetakan ke tabel lain di basis data lain dalam instance mysql yang sama. dengan satu repositori metadata yang umum, itu membuat dukungan transaksional dan pengoperasian mvcc mungkin di beberapa basis data.</p> <p>ini telah ditanyakan dalam stack overflow <a href="https://stackoverflow.com/questions/404040/how-do-you-like-your-primary-keys/404057#404057">di sini</a> dan <a href="https://stackoverflow.com/questions/829284/guid-vs-int-identity">di sini</a> .</p><p> <a href="http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html">posting jeff</a> menjelaskan banyak tentang pro dan kontra menggunakan guid.</p><blockquote> <h3>guid pro</h3> <ul> <li>unik di setiap tabel, setiap basis data, dan setiap server</li> <li>mengizinkan penggabungan catatan dengan mudah dari database yang berbeda</li> <li>mengizinkan distribusi basis data dengan mudah di beberapa server</li> <li>anda dapat membuat id di mana saja, alih-alih harus bolak-balik ke database</li> <li>sebagian besar skenario replikasi membutuhkan guid kolom pula</li> </ul> <h3>kontra guid</h3> <ul> <li>ini adalah kekalahan 4 kali lebih besar dari nilai indeks 4 byte tradisional; ini dapat memiliki implikasi kinerja dan penyimpanan yang serius jika anda tidak berhati-hati</li> <li>tidak praktis untuk debug (<code>where userid='{bae7df4-ddf-3rg-5ty3e3rf456as10}'</code>)</li> <li>guid yang dihasilkan sebagian harus berurutan untuk kinerja terbaik (misalnya, <code>newsequentialid()</code> pada sql server 2005+) dan untuk memungkinkan penggunaan indeks berkerumun</li> </ul> </blockquote><p>jika anda yakin tentang kinerja dan anda tidak berencana untuk mereplikasi atau menggabungkan catatan, maka gunakan <code>int</code>, dan atur secara otomatis peningkatan (<em> identitas benih di sql server </em>).</p> Halo Andi,
  

  
Silakan melakukan pemulihan akun CoC. Anda dapat melihat caranya lewat artikel FAQ berikut ini: [Mengembalikan Akun Clash of Clans yang Hilang](/faq/655-mengembalikan-akun-clash-of-clans-yang-hilang)
  

  
Semoga membantu, ya. Apakah kamu bisa membantu saya mencari kode pembukaan 12 angka saya. yang terkunci di akun coc .


![](https://img-25.ccm2.net/glzNaNcpU1WaTH6_TvcGboeIywk=/348280217b6d4769a6ddc236e0810fbe/ccm-ugc/Screenshot_20190509-080442.png) Halo Irwan,
  

  
Bagaimana pesan yang muncul saat masuk ke akun Gmail? Akun COC tersebut seharusnya masih bisa kembali jika Anda punya akses masuk ke akun Gmail. Halo, Wisnu.


 


Silakan ikuti artikel FAQ berikut ini untuk memulihkan akun Google Anda:


<https://id.ccm.net/faq/439-cara-reset-password-dan-pemulihan-akun-gmail> Halo, Anda dapat memulihkan akun Google seperti dalam artikel FAQ berikut:
  

  
<https://id.ccm.net/faq/439-cara-reset-password-dan-pemulihan-akun-gmail> <p>untuk membagikan yang terbaik kepada banyak pengguna yang seharusnya bisa menulis dalam <code>/var/www</code>, itu harus ditetapkan sebagai grup umum. misalnya grup default untuk konten web di ubuntu dan debian adalah <code>www-data</code>. pastikan semua pengguna yang membutuhkan akses tulis ke <code>/var/www</code> berada di grup ini.</p><pre><code>sudo usermod -a -g www-data &lt;some\_user&gt; </code></pre><p>kemudian atur izin yang benar di/var/www.</p><pre><code>sudo chgrp -r www-data /var/www sudo chmod -r g+w /var/www </code></pre><p>selain itu, anda harus membuat direktori dan semua direktori di bawahnya "set gid", sehingga semua <em> baru </em> file dan direktori yang dibuat dengan <code>/var/www</code> dimiliki oleh <code>www-data</code> kelompok.</p><pre><code>sudo find /var/www -type d -exec chmod 2775 {} \; </code></pre><p>temukan semua file di <code>/var/www</code> dan tambahkan izin baca dan tulis untuk pemilik dan grup:</p><pre><code>sudo find /var/www -type f -exec chmod ug+rw {} \; </code></pre><p>anda mungkin harus keluar dan masuk kembali untuk dapat membuat perubahan jika anda mengedit izin untuk akun anda sendiri.</p> <p>tidak, redis lebih dari sekadar cache. </p><p>seperti cache, redis menyimpan kunci = pasangan nilai. tetapi tidak seperti cache, redis memungkinkan anda beroperasi pada nilai-nilai. ada 5 tipe data dalam redis - string, set, hash, daftar dan set diurutkan. setiap tipe data memperlihatkan berbagai operasi.</p><p>cara terbaik untuk memahami redis adalah dengan memodelkan suatu aplikasi tanpa memikirkan bagaimana anda akan menyimpannya dalam database. </p><p>katakanlah kita ingin membangun stackoverflow.com. untuk membuatnya sederhana, kita membutuhkan pertanyaan, jawaban, tag, dan pengguna.</p><h2>pertanyaan modeling, pengguna dan jawaban</h2><p>setiap objek dapat dimodelkan sebagai peta. misalnya, pertanyaan adalah peta dengan bidang {id, judul, date\_asked, suara, asked\_by, status}. demikian pula, sebuah jawaban adalah peta dengan bidang {id, question\_id, answer\_text, answer\_by, suara, status}. demikian pula, kita dapat memodelkan objek pengguna.</p><p>masing-masing benda ini dapat langsung disimpan di redis sebagai hash. untuk menghasilkan id unik, anda dapat menggunakan perintah kenaikan atom. sesuatu seperti ini - </p><pre><code>$ hincrby unique\_ids question 1 (integer) 1 $ hmset question:1 title "is redis just a cache?" asked\_by 12 votes 0 ok $ hincrby unique\_ids answer 1 (integer) 1 $ hmset answer:1 question\_id 1 answer\_text "no, its a lot more" answered\_by 15 votes 1 ok </code></pre><h2>menangani suara</h2><p>sekarang, setiap kali seseorang menjawab pertanyaan atau jawaban, anda hanya perlu melakukan ini </p><pre><code>$ hincrby question:1 votes 1 (integer) 1 $ hincrby question:1 votes 1 (integer) 2 </code></pre><h2>daftar pertanyaan untuk beranda</h2><p>selanjutnya, kami ingin menyimpan pertanyaan terbaru untuk ditampilkan di beranda. jika anda sedang menulis program .net atau java, anda akan menyimpan pertanyaan dalam daftar. ternyata, itu adalah cara terbaik untuk menyimpan ini di redis juga. </p><p>setiap kali seseorang mengajukan pertanyaan, kami menambahkan idnya ke daftar. </p><pre><code>$ lpush questions question:1 (integer) 1 $ lpush questions question:2 (integer) 1 </code></pre><p>sekarang, ketika anda ingin merender beranda, anda meminta redis untuk 25 pertanyaan terbaru. </p><pre><code>$ lrange questions 0 24 1) "question:100" 2) "question:99" 3) "question:98" 4) "question:97" 5) "question:96" ... 25) "question:76" </code></pre><p>sekarang setelah anda memiliki id, ambil item dari redis menggunakan pipelining dan menunjukkannya kepada pengguna.</p><h2>pertanyaan dengan tag, diurut berdasarkan pilihan</h2><p>selanjutnya, kami ingin mengambil pertanyaan untuk setiap tag. tetapi so memungkinkan anda untuk melihat pertanyaan pilihan teratas, pertanyaan baru atau pertanyaan yang tidak dijawab di bawah setiap tag.</p><p>untuk memodelkan ini, kami menggunakan fitur set diurutkan redis. set diurutkan memungkinkan anda untuk mengaitkan skor dengan setiap elemen. anda kemudian dapat mengambil elemen berdasarkan skor mereka. </p><p>ayo maju dan lakukan ini untuk tag redis </p><pre><code>$ zadd questions\_by\_votes\_tagged:redis 2 question:1 (integer) 1 $ zadd questions\_by\_votes\_tagged:redis 10 question:2 (integer) 1 $ zadd questions\_by\_votes\_tagged:redis 5 question:613 (integer) 1 $ zrange questions\_by\_votes\_tagged:redis 0 5 1) "question:1" 2) "question:613" 3) "question:2" $ zrevrange questions\_by\_votes\_tagged:redis 0 5 1) "question:2" 2) "question:613" 3) "question:1" </code></pre><p>apa yang kita lakukan di sini? kami menambahkan pertanyaan ke set yang diurutkan, dan mengaitkan skor (jumlah suara) untuk setiap pertanyaan. setiap kali sebuah pertanyaan dibatalkan, kami akan menambah nilainya. dan ketika pengguna mengklik &quot;pertanyaan yang ditandai redis, disortir berdasarkan suara&quot;, kami hanya melakukan <code>zrevrange</code> dan mendapatkan kembali pertanyaan teratas.</p><h2>pertanyaan waktu nyata tanpa halaman yang menyegarkan</h2><p>dan akhirnya, fitur bonus. jika anda membiarkan halaman pertanyaan terbuka, so akan memberi tahu anda ketika pertanyaan baru ditambahkan. bagaimana redis bisa membantu di sini?</p><p>redis memiliki model pub-sub. anda dapat membuat saluran, misalnya &quot;channel\_questions\_tagged\_redis&quot;. anda kemudian <code>subscribe</code> pengguna ke saluran tertentu. ketika pertanyaan baru ditambahkan, anda akan <code>publish</code> pesan ke saluran itu. semua pengguna akan mendapatkan pesan. anda harus menggunakan teknologi web seperti soket atau komet web untuk benar-benar mengirimkan pesan ke browser, tetapi redis membantu anda dengan semua pipa ledeng di sisi server.</p><h2>kegigihan, keandalan, dll.</h2><p>tidak seperti cache, redis tetap menyimpan data pada hard disk. anda dapat memiliki pengaturan master-slave untuk memberikan keandalan yang lebih baik. untuk mempelajari lebih lanjut, buka topik kegigihan dan replikasi di sini - <a href="http://redis.io/documentation">http://redis.io/documentation</a> </p>