Rumah >pangkalan data >Redis >Bagaimanakah redis merealisasikan kemas kini halaman masa nyata dan kemas kini dalam talian automatik?

Bagaimanakah redis merealisasikan kemas kini halaman masa nyata dan kemas kini dalam talian automatik?

WBOY
WBOYke hadapan
2023-06-03 20:56:171352semak imbas

Perihalan keperluan

Sesetengah halaman perlu dikonfigurasikan dengan iklan atau imej promosi acara Iklan atau aktiviti mesti boleh pergi dalam talian dan luar talian pada bila-bila masa, pergi ke luar talian secara automatik selepas tamat tempoh dan secara automatik pergi dalam talian. bila tiba masanya.

Contohnya: masa semasa ialah 22-2019 16:16:13, dan anda perlu mengkonfigurasi aktiviti pengumpulan hadiah pada halaman penyelesaian pembayaran Aktiviti mesti dalam talian tepat pada masanya pada 2019-3 -10 00:00:00 Pada 2019- Acara berakhir pada 3-30 23:59:59.

Oleh itu, kesan yang diingini ialah selepas mengkonfigurasi aktiviti pada bila-bila masa sebelum aktiviti masuk dalam talian, halaman akan secara automatik masuk dalam talian pada masa yang ditentukan. Mungkin juga terdapat beberapa aktiviti atau iklan lain Bilangan iklan pada setiap halaman adalah berubah-ubah, dan masa dalam talian dan luar talian mungkin berbeza untuk halaman lain juga perlu melaksanakan fungsi tersebut, dan aktiviti antara halaman tidak semestinya yang sama.

Analisis Keperluan

Keperluan hanyalah beberapa perkataan, jadi mari kita menganalisisnya secara terperinci.

Ekstrak kata kunci

  • Gambar promosi iklan atau acara

  • Dalam dan luar talian pada bila-bila masa, secara automatik di luar talian selepas tamat tempoh, dan secara automatik apabila tiba masanya Dalam Talian

  • Bilangan iklan pada setiap halaman berubah-ubah

  • Masa dalam talian dan luar talian bagi iklan yang berbeza boleh berbeza

  • Aktiviti antara halaman tidak semestinya sama

Analisis pangkalan data

1 [Pengiklanan atau gambar promosi acara]

Untuk menjadi Halaman yang berbeza mempunyai iklan yang berbeza, dan iklan di beberapa halaman mungkin sama, iaitu iklan akan digunakan semula, jadi mesti ada jadual iklan.

2. [Bilangan iklan pada setiap halaman adalah berubah-ubah] [Masa dalam talian dan luar talian bagi iklan yang berbeza boleh berbeza] [Aktiviti antara halaman tidak semestinya sama]

Berbilang halaman boleh dikonfigurasikan Setiap iklan mesti mempunyai jadual konfigurasi halaman, serta jadual hubungan antara iklan dan halaman, iaitu jadual iklan halaman.

Jadual konfigurasi halaman mengkonfigurasi terutamanya bilangan iklan pada halaman untuk direalisasikan [bilangan iklan pada setiap halaman adalah berubah-ubah]. untuk merealisasikan [iklan yang berbeza dalam talian dan luar talian] Masa boleh berbeza】

Berdasarkan analisis mudah, saya sampai kepada struktur jadual berikut: jadual pengiklanan (adv), jadual konfigurasi halaman (page_config) dan jadual pengiklanan halaman (page_adv)

Bagaimanakah redis merealisasikan kemas kini halaman masa nyata dan kemas kini dalam talian automatik?

Berfikir

Iklan yang dikonfigurasikan pada halaman ini tidak akan berubah untuk satu tempoh masa Jika bilangan permintaan halaman adalah tinggi, bilangan pertanyaan iklan akan menjadi sangat kerap, menyebabkan tekanan yang tidak perlu. pada pangkalan data. Oleh itu, caching boleh diperkenalkan untuk mengurangkan bilangan permintaan pangkalan data dan melegakan tekanan pangkalan data. Redis digunakan di sini.

Bilakah ia akan dicache?

Anda boleh memilih untuk memuatkan iklan secara tak segerak yang telah berada dalam selang masa dalam talian dan luar talian ke dalam cache apabila perkhidmatan bermula, atau memilih untuk mengambil cache apabila permintaan dibuat Jika cache tidak wujud , kemudian semak perpustakaan dan letakkan dalam cache. Masa caching bergantung pada keadaan.

Pilihan di sini adalah untuk menyimpan maklumat konfigurasi pengiklanan halaman yang layak ke dalam Redis apabila projek itu dimulakan tidak akan dimasukkan ke dalam Redis terlebih dahulu iklan tersebut, Redis akan disemak dahulu Jika tidak, semak pangkalan data mengikut keadaan (>=sekarang), dan simpan dalam Redis selepas menyemak.

Setelah mendapat maklumat konfigurasi iklan daripada antara muka, tentukan sama ada masa semasa berada dalam selang masa yang dikonfigurasikan Memandangkan berbilang iklan dikonfigurasikan pada halaman, masa iklan yang berbeza juga berbeza, jadi perlu diulang. dan kembalikan yang sepadan. Tandakan mana-mana yang telah tamat tempoh, dan kemudian padam maklumat konfigurasi seluruh halaman dalam Redis. (Atau jangan pilih untuk memuatkan semasa permulaan, dan tambahkan cache apabila pengguna memintanya. Walau bagaimanapun, kaedah dalam langkah 1 di bawah akan digunakan apabila memuatkan semula beban, jadi ia tidak boleh dipadamkan)

Pelaksanaan khusus

Langkah 1. Apabila memulakan projek, simpan dahulu maklumat konfigurasi pengiklanan halaman dalam Redis

a Tanya semua pageId

SELECT pageId FROM page_config page_adv WHERE nowtime<p> dan sambungkannya dalam dua jadual untuk mendapatkan. Senarai<pageid> Semua keputusan diperolehi Ia adalah pageId yang dikonfigurasikan dengan iklan dan iklan belum tamat tempoh. </pageid></p><p>b. Tanya imej pengiklanan dan pautan lompat yang sepadan dengan pegeId</p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_adv adv WHERE begintime<p>Kemudian senaraikan maklumat konfigurasi yang ditemui<adv> (tiada operasi akan dilakukan jika ia kosong), dan gunakan pageId sebagai KEY ke dalam cache. </adv></p><h4>Langkah 2, tulis iklan halaman pertanyaan antara muka untuk bahagian hadapan </h4><p>Ditulis mengikut lapisan kawalan standard, lapisan perniagaan dan lapisan akses data Logik dalam langkah pertama selesai lapisan perniagaan. </p><p>Lapisan kawalan: </p><p>Lapisan kawalan mengambil parameter pageId dan memanggil lapisan perniagaan untuk menanyakan maklumat pengiklanan yang dikonfigurasikan pada halaman yang sepadan Jika ia kosong, ia akan mengembalikan kod status 0 secara langsung , iaitu tiada iklan dan bahagian hadapan tidak akan memaparkannya. </p><p> Jika ia tidak kosong, data akan diproses mengikut logik perniagaan (seperti URL img ditambah nama domain), dan kemudian kod status 1 akan dikembalikan, dan bahagian hadapan akan memaparkan iklan . Lapisan kawalan juga boleh menambah logik di sini untuk mengulangi senarai iklan, mengembalikan masa semasa dalam masa mula iklan dan tidak mengembalikan yang tiada di sana Dan selagi iklan tamat tempoh, cache senarai iklan halaman ini akan dibersihkan. Logiknya adalah untuk membersihkan yang telah tamat tempoh. </p><p>Lapisan perniagaan: </p><p>Dapatkan cache dahulu, dan kemudian semak pangkalan data untuk menentukan bahawa ia tidak kosong (halaman ini dikonfigurasikan dengan iklan), letakkannya dalam cache (pageId ialah KEY ), dan kemudian kembali. </p><p>Lapisan akses data: </p><p>SQL:</p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_config adv page_adv WHERE begintime<p>Tiga pertanyaan bersama jadual, tanya maklumat kempen pengiklanan yang dikonfigurasikan pada halaman semasa berdasarkan pageId (sudah dalam masa kempen pengiklanan )</p><h4>Langkah 3, muat semula muat semula</h4><p>Mengapa menggunakan muat semula muat semula? </p><p>因为有这样的场景:给页面A配置了一个广告(当前时间在广告的起始时间内),那么这个页面的广告已经在缓存里了,假如此时A页面要新加一个广告,在后台配置后如果不做其他操作,这个广告不会显示(假设缓存时间较长,为一天),因为库更新了,缓存没有同步更新。</p><p>解决方案</p><p>使用Redis的发布订阅机制实现缓存的刷新加载,使新配置的广告及时能够显示。刷新加载的回调方法即第1步中的方法。</p><h3>进一步优化</h3><p>想一想,目前的实现存在什么问题?</p><p>存在的问题</p><p>假如有页面需要配置广告,但是还没有配(前端已经开发完上线,每次都会调接口查广告信息),那么数据库肯定查不到,缓存也没有。如果这个页面访问量很大,那么缓存没命中就查库,这样对库的压力就会很大,这就是缓存穿透,请求上来了很容易击垮数据库。那怎么办呢?</p><p>解决方案</p><p>当页面没有配置广告时,在缓存存标志,查询时先看标志,在决定是否往下走。</p><p>具体方案</p><p>这时,上面的第1步就要改了。</p><p>1、首先改第1步的步骤a的SQL,把所有的pageId都查询出来。</p><p>使用左连接</p><pre class="brush:php;toolbar:false">SELECT pageId FROM page_config LEFT JOIN page_adv ON ...  GROUP BY pageId

或者干脆查page_config

SELECT pageId FROM page_config

目的是把已在page_config表中配置,但关系表中page_adv未配置广告的pageId也查出来,这样才能给未配置广告的pageId在缓存里放标志

2、第1步的步骤b的SQL改为

SELECT 字段名 FROM page_adv adv WHERE nowtime<p>然后把查到的配置信息放入缓存之前判断【为空时的不做操作】改为【为空时存入一个标志】假如这个标志KEY为pageId+"_EMPTY_FLAG",value为"DB_IS_NULL"</p><p>为什么只判断小于结束时间</p><p>因为如果该页面配置的广告开始时间大于当前时间,那么这个是查不到的,会被处理为DATABASE_IS_NULL,如果在这个标志还没失效之前就到了配置的开始时间了,那么这个广告不会被展示。所有要让未到开始时间的也放入缓存,然后让控制层去判断在不在时间区间。</p><p>3、所以要在第2步也修改一下</p><p>在业务层里取缓存中的广告列表之前,先从缓存取pageId+"EMPTY_FLAG"的value判断为"DB_IS_NULL"直接返回空,这样就能避免缓存穿透的问题了。</p><p>继续修改第2步的业务层,查库的SQL同样要改:</p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_config adv page_adv WHERE nowtime<p>然后判断为空的话,同上面的黄字那样处理。</p><p>4、最后,第3步的刷新加载调的是第1步的方法,不用改。<br><br>当然这个缓存穿透的优化方案只是其中一种。还可以这样:</p><p>1、控制层拦截:根据pageId查询page_adv表,查不到说明没配置,直接返回。</p><p>2、page_config 表增加字段,表示当前页面已经配置的广告个数,默认0,每配置一个该字段加1,把大于0的pageId缓存起来,调接口时前判断在不在缓存里。</p>

Atas ialah kandungan terperinci Bagaimanakah redis merealisasikan kemas kini halaman masa nyata dan kemas kini dalam talian automatik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Analisis kod contoh cache RedisArtikel seterusnya:Analisis kod contoh cache Redis