Support » Plugin: WP Redis » object cache out of sync with database

  • Resolved jkhongusc

    (@jkhongusc)


    I have been using this plugin for over a year on two high-ish traffic WP multisite systems.

    I have noticed due to user complaints that the object cache gets out-of-sync with the database. For example – WRT plugin activation/deactivation – I have users complained that a plugin cannot be activated. wp-admin shows plugin to be deactivated and activating plugin in wp-admin does nothing. I found it was due to the redis cache being out-of-sync with the database. Redis cache shows that the plugin was deactivated; but the database shows the plugin to be activated. Manually flushing the Redis cache (either the specific key or entire cache) would “fix” the situation.

    I get 2-3 reported Redis issues per month. I am sure there are a number of unreported issues. Different issues similar to above scenario, with the Redis cache being out-of-sync with the database. I am not sure how the out-of-sync happens. My guess is that we may have multiple wp-admin users updating the site; and one of the update_options() overwrites another’s setting.

    I’m not sure what to do at this point. We are an Enterprise so this has to be addressed. I am thinking that a flush (single) site’s object cache feature would solve this issue. I would NOT want to flush the entire cache; we have 400+ subsites. Or I might have to try a different Redis plugin. I would really like to stick with this plugin though =)

Viewing 9 replies - 1 through 9 (of 9 total)
  • Plugin Author Daniel Bachhuber

    (@danielbachhuber)

    Hi @jkhongusc,

    Thanks for the report!

    What you’re describing is a known issue with WordPress core’s alloptions cache design. We’ve previously discussed the problem on this pull request.

    With this being said, the WordPress.com VIP workaround mentioned might be a viable interim solution. Want to try that in your setup and report back?

    Thanks for the prompt and detailed response! I’m not sure all of our issues are due to alloptions, though that is the most common source of our problem. I think I will implement that wordpress.com workaround.

    I would also like to add a delete site’s object cache feature to cover the use-case if it is not alloptions. I’d like to create a plugin to add a “delete object cache” to the admin bar. I will try to use your WP_Object_Cache to do the deletes. I assume that redis keys are in the format “<site_id>:<object_name>”. I did a key count on our biggest site: 250k keys. I’ll have to test to see how feasible it is to delete 250k keys.

    Plugin Author Daniel Bachhuber

    (@danielbachhuber)

    I’m not sure all of our issues are due to alloptions, though that is the most common source of our problem. I think I will implement that wordpress.com workaround.

    Sounds good. Please do report back, I’m curious to hear whether it solves your problems.

    I assume that redis keys are in the format “<site_id>:<object_name>”. I did a key count on our biggest site: 250k keys. I’ll have to test to see how feasible it is to delete 250k keys.

    Yes, you can delete based on the site id directly within redis-cli

    Plugin Author Daniel Bachhuber

    (@danielbachhuber)

    @jkhongusc How’d this approach end up working out for you?

    Sorry was on vacation for two weeks… Tokyo which was an awesome experience. I deployed a plugin that added a link to the admin bar that allows Administrators to purge the alloptions cache for a single site. I didnt feel comfortable automatically purging alloptions upon every add/delete/update option event. Unfortunately our project manager who manages the sites with our (internal) clients is on vacation now. So we’ll have to wait more to see if purging alloptions (plugin) works for us.

    I’m having same problem exactly with this plugin. When it is enabled on our multisite, content-writer always complain that content is not up to date or some settings are not changing. Which code is responsible for regenerating data to redis, after post or option is updated/changed and are there any filters for that?

    • This reply was modified 1 year, 4 months ago by juslintek.
    • This reply was modified 1 year, 4 months ago by juslintek.
    Plugin Author Daniel Bachhuber

    (@danielbachhuber)

    @danielbachhuber, thank you, I haven’t will test it out. 🙂

    
    /**
     * Fix a race condition in alloptions caching
     *
     * See https://core.trac.wordpress.org/ticket/31245
     */
    function _wpcom_vip_maybe_clear_alloptions_cache( $option ) {
            if ( ! wp_installing() ) {
                    $alloptions = wp_load_alloptions(); //alloptions should be cached at this point
    
                    if ( isset( $alloptions[ $option ] ) ) { //only if option is among alloptions
                            wp_cache_delete( 'alloptions', 'options' );
                    }
            }
    }
    
    add_action( 'added_option',   '_wpcom_vip_maybe_clear_alloptions_cache' );
    add_action( 'updated_option', '_wpcom_vip_maybe_clear_alloptions_cache' );
    add_action( 'deleted_option', '_wpcom_vip_maybe_clear_alloptions_cache' );
    

    Fix for options not getting updated.

    juslintek

    (@juslintek)

    @danielbachhuber Seems like problem still exists and it is caused by Live Composer saving settings straight to custom fields on https://wordpress.org/plugins/live-composer-page-builder. Seems like cache is not updated on update_post_meta

Viewing 9 replies - 1 through 9 (of 9 total)
  • The topic ‘object cache out of sync with database’ is closed to new replies.