カウンター項目の値が更新されません
カウンター項目は、パフォーマンス向上のためにコンテンツデータとは別に値を管理しています。同期されるまでの間、表示用の値と並び替え用の値にずれが生じる場合があります。
カウンター項目の仕組み
カウンター項目は、アクセス数やいいね数など頻繁に更新される値を扱うために設計されています。パフォーマンスを向上させるため、Kurocoではカウンターの値をコンテンツ自体から分離し、非同期的に更新を行っています。
具体的には、カウンターの値は以下の2箇所で管理されています。
- カウンターテーブル:最新のカウンター値。カウンター操作が行われると即座に更新されます。
- コンテンツテーブル:コンテンツデータと一緒に保存されたカウンター値のキャッシュ。APIレスポンスでの表示や並び替えに使用されます。
どのような場合に値が分離するか
以下のようなケースでカウンターテーブルの値が更新され、コンテンツテーブルの値との間にずれが生じます。
{increment_counter}または{update_counter}Smartyプラグインを使用した場合:これらのプラグインは同期をとらずに直接カウンターテーブルを更新します。{googleanalytics}Smartyプラグインでアクセス数を更新した場合:プラグインはカウンターテーブルに新しい値を書き込みますが、その時点ではコンテンツテーブルは更新されません。
APIのリスト取得で使用される並び替え用の値はコンテンツテーブルから読み取られるため、同期されるまではカウンター項目での並び替えが期待通りの結果にならない場合があります。
カウンター値を同期する方法
コンテンツ編集画面からの更新
コンテンツ編集画面でカウンターの更新チェックボックスにチェックを入れて保存することで、カウンターテーブルとコンテンツテーブルを同時に更新し、値を同期した状態にできます。
Topics::increment による更新
Topics::incrementエンドポイントでカウンターをインクリメントした場合、カウンターテーブルは即座に更新され、コンテンツテーブルを同期するためのsync_counterバッチ処理がスケジュールされます。
このバッチ処理は、カウンターテーブルから最新の値を読み取り、コンテンツテーブルに書き戻すことで2つの値を同期します。そのため、コンテンツテーブルへの反映は一時的に遅延しますが、バッチが完了すると解消します。
sync_counter Smartyプラグインによる手動同期
{sync_counter} Smartyプラグインを使用して手動で同期を実行できます。 {increment_counter} や {update_counter} を使用した後、任意のタイミングで値を同期したい場合に有効です。
{sync_counter ids="1,2,3"}
googleanalyticsと組み合わせたバッチ処理での同期
{googleanalytics} Smartyプラグインの例では、同じバッチ処理内でgoogleanalyticsプラグインの後にsync_counterバッチを呼び出すことで、カウンター値を同期しています。
{googleanalytics
var="result"
update_column_slug="pv"
update_target_dimension="customEvent:slug"
updated_topics_ids='updated_topics_ids'
topics_group_id=1}
{assign_array var=ext_data values=''}
{assign var=ext_data.topics_ids value=$updated_topics_ids}
{batch module='topics' name='sync_counter' ext_data=$ext_data}
代替手段:カウンター項目の代わりに数値項目を使う
値を常にコンテンツと同期した状態で保持したい場合や、非同期の高頻度更新が不要な場合は、カウンター項目の代わりに数値項目の使用を検討してください。数値項目はコンテンツテーブルに直接値を保存するため、表示用の値と並び替え用の値にずれが生じることはありません。
サポート
お探しのページは見つかりましたか?解決しない場合は、問い合わせフォームからお問い合わせいただくか、Slackコミュニティにご参加ください。