Clear cache with a time interval (at least once per hour)?

Hi all.

I want to clear the cache with a given time interval (say, at least clear once an hour or in every 15min) so my app gets a chance to fetch updated data…

Currently I cache the data access to improve the responsiveness with a simple @st.cache infront of my function…

Is this currently possible?


The way I, and some others, have handled this is to add another parameter to the data load function. The additional parameter is called with a value that is a timestamp truncated to the refresh interval you want (for our application 5 minutes works well). That will force an update. If the data range is purely historical, not including the current day, I just use None for the timestamp value.
It’s a little bit of extra housekeeping but it works well.

Appreciate the reply!

Would you have some example code or a link to some GitHub repo where this is used? Having some trouble imagining the code to your explanation :+1:


Here is a cached function, at_time is the timestamp used to control caching.

def get_phrase_data(start_date, end_date, phrases=None, at_time=None,
    """Wrapper for :func:`load_metadata_for_period` for Streamlit caching
    start_date and end_date should be ISO format strings in UTC for date
    #print('get_phrase_data', phrases)
    data = load_metadata_for_period(start_date, end_date, phrases=phrases,
    return data

And a function to generate the timestamp value for the interval desired

import datetime
def get_truncated_timestamp(end=None, refresh_interval=5, 
    """A time truncated down to resolution to control caching

        end (datetime.datetime):  The time to validate against

        datetime.datetime: a timestamp set to the nearest refresh_interval.

    If end is at or before midnight at the start of the
    current day returns **None** as we'll never want to change that
    cache anyway.

    if end and end <=
        #  Fix timestamp for data not updating...
        timestamp = None
        timestamp =
        if refresh_interval_units == 'minutes':
            interval = int(refresh_interval)
            timestamp = timestamp.replace(
                            minute=(timestamp.minute // interval) * interval,
                            second=0, microsecond=0, )
    return timestamp

And here is some psuedo code to call it.

    data = get_phrase_data(start, end, phrases, get_truncated_timestamp(end),


You are my hero for today :love_you_gesture:


1 Like