When to invalidate cache - .net core api










0















How do I know when to invalidate the cache, if a table change is made from an outside source?



I have an api call that returns an employee table. The first time this call is made, I will cache the results so that on subsequent calls it will pull the data from the cache instead of the database. This makes sense, however, what happens if someone adds a new record to the employee table from outside of the api, how does the cache know that it is now invalid?



If the user made the change to the employee table through the API I can capture that, but we have a separate desktop app that doesn't use the API, and that app can directly make changes to the employee table. Is there any accepted standards for handling this?



The only possible solution I can think of is to add a trigger to the employee table, and somehow use that to know when a table has changed. But, we have over a thousand tables, and we are making an api call for each table - So, I do not think that adding a thousand triggers to our database is an acceptable solution.










share|improve this question






















  • Is docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… available in core?

    – mjwills
    Nov 6 '18 at 23:13
















0















How do I know when to invalidate the cache, if a table change is made from an outside source?



I have an api call that returns an employee table. The first time this call is made, I will cache the results so that on subsequent calls it will pull the data from the cache instead of the database. This makes sense, however, what happens if someone adds a new record to the employee table from outside of the api, how does the cache know that it is now invalid?



If the user made the change to the employee table through the API I can capture that, but we have a separate desktop app that doesn't use the API, and that app can directly make changes to the employee table. Is there any accepted standards for handling this?



The only possible solution I can think of is to add a trigger to the employee table, and somehow use that to know when a table has changed. But, we have over a thousand tables, and we are making an api call for each table - So, I do not think that adding a thousand triggers to our database is an acceptable solution.










share|improve this question






















  • Is docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… available in core?

    – mjwills
    Nov 6 '18 at 23:13














0












0








0








How do I know when to invalidate the cache, if a table change is made from an outside source?



I have an api call that returns an employee table. The first time this call is made, I will cache the results so that on subsequent calls it will pull the data from the cache instead of the database. This makes sense, however, what happens if someone adds a new record to the employee table from outside of the api, how does the cache know that it is now invalid?



If the user made the change to the employee table through the API I can capture that, but we have a separate desktop app that doesn't use the API, and that app can directly make changes to the employee table. Is there any accepted standards for handling this?



The only possible solution I can think of is to add a trigger to the employee table, and somehow use that to know when a table has changed. But, we have over a thousand tables, and we are making an api call for each table - So, I do not think that adding a thousand triggers to our database is an acceptable solution.










share|improve this question














How do I know when to invalidate the cache, if a table change is made from an outside source?



I have an api call that returns an employee table. The first time this call is made, I will cache the results so that on subsequent calls it will pull the data from the cache instead of the database. This makes sense, however, what happens if someone adds a new record to the employee table from outside of the api, how does the cache know that it is now invalid?



If the user made the change to the employee table through the API I can capture that, but we have a separate desktop app that doesn't use the API, and that app can directly make changes to the employee table. Is there any accepted standards for handling this?



The only possible solution I can think of is to add a trigger to the employee table, and somehow use that to know when a table has changed. But, we have over a thousand tables, and we are making an api call for each table - So, I do not think that adding a thousand triggers to our database is an acceptable solution.







asp.net-core .net-core asp.net-core-2.0 asp.net-core-webapi api-design






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 6 '18 at 23:10









Austin ShawAustin Shaw

336




336












  • Is docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… available in core?

    – mjwills
    Nov 6 '18 at 23:13


















  • Is docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… available in core?

    – mjwills
    Nov 6 '18 at 23:13

















Is docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… available in core?

– mjwills
Nov 6 '18 at 23:13






Is docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… available in core?

– mjwills
Nov 6 '18 at 23:13













3 Answers
3






active

oldest

votes


















0














Yes you could add a trigger as suggested. Or you could use a caching system that support expiry time/sliding expiry. So you would be serving up stale data some of the time but not always.






share|improve this answer






























    0














    As the other answer a suggests your trigger idea is ok, however as you've stated that would be a lot of triggers.



    If your cache is not local to the API, which i assume it isn't if triggers would be able to access. Could you not access it from your desktop application? You could invalidate your cache by removing the employee record from the cache with the desktop application when it makes a successful change to the employee table.



    It boils down to..



    You have a cache (which is essentially a read store).
    You have two options to update it
    - Either it times out and fetches (which is ok, if you dont need up to the minute real time data)
    - Or is has to be told its data is no longer valid.






    share|improve this answer






























      0














      Two ways to solve this



      1. Push model

      2. Pull model

      Push Model: Using a database trigger for SQL server table to populate an intermediate audit table and polling that using a background task.



      Pull Model: Using CLR Trigger and pushing the updates to an API. Whenever DML happens the CLR trigger will call the Api, qhich in-turn can update the cache!



      Hope this helps!






      share|improve this answer






















        Your Answer






        StackExchange.ifUsing("editor", function ()
        StackExchange.using("externalEditor", function ()
        StackExchange.using("snippets", function ()
        StackExchange.snippets.init();
        );
        );
        , "code-snippets");

        StackExchange.ready(function()
        var channelOptions =
        tags: "".split(" "),
        id: "1"
        ;
        initTagRenderer("".split(" "), "".split(" "), channelOptions);

        StackExchange.using("externalEditor", function()
        // Have to fire editor after snippets, if snippets enabled
        if (StackExchange.settings.snippets.snippetsEnabled)
        StackExchange.using("snippets", function()
        createEditor();
        );

        else
        createEditor();

        );

        function createEditor()
        StackExchange.prepareEditor(
        heartbeatType: 'answer',
        autoActivateHeartbeat: false,
        convertImagesToLinks: true,
        noModals: true,
        showLowRepImageUploadWarning: true,
        reputationToPostImages: 10,
        bindNavPrevention: true,
        postfix: "",
        imageUploader:
        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
        allowUrls: true
        ,
        onDemand: true,
        discardSelector: ".discard-answer"
        ,immediatelyShowMarkdownHelp:true
        );



        );













        draft saved

        draft discarded


















        StackExchange.ready(
        function ()
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53181464%2fwhen-to-invalidate-cache-net-core-api%23new-answer', 'question_page');

        );

        Post as a guest















        Required, but never shown

























        3 Answers
        3






        active

        oldest

        votes








        3 Answers
        3






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        0














        Yes you could add a trigger as suggested. Or you could use a caching system that support expiry time/sliding expiry. So you would be serving up stale data some of the time but not always.






        share|improve this answer



























          0














          Yes you could add a trigger as suggested. Or you could use a caching system that support expiry time/sliding expiry. So you would be serving up stale data some of the time but not always.






          share|improve this answer

























            0












            0








            0







            Yes you could add a trigger as suggested. Or you could use a caching system that support expiry time/sliding expiry. So you would be serving up stale data some of the time but not always.






            share|improve this answer













            Yes you could add a trigger as suggested. Or you could use a caching system that support expiry time/sliding expiry. So you would be serving up stale data some of the time but not always.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 6 '18 at 23:54









            Dave CDave C

            1




            1























                0














                As the other answer a suggests your trigger idea is ok, however as you've stated that would be a lot of triggers.



                If your cache is not local to the API, which i assume it isn't if triggers would be able to access. Could you not access it from your desktop application? You could invalidate your cache by removing the employee record from the cache with the desktop application when it makes a successful change to the employee table.



                It boils down to..



                You have a cache (which is essentially a read store).
                You have two options to update it
                - Either it times out and fetches (which is ok, if you dont need up to the minute real time data)
                - Or is has to be told its data is no longer valid.






                share|improve this answer



























                  0














                  As the other answer a suggests your trigger idea is ok, however as you've stated that would be a lot of triggers.



                  If your cache is not local to the API, which i assume it isn't if triggers would be able to access. Could you not access it from your desktop application? You could invalidate your cache by removing the employee record from the cache with the desktop application when it makes a successful change to the employee table.



                  It boils down to..



                  You have a cache (which is essentially a read store).
                  You have two options to update it
                  - Either it times out and fetches (which is ok, if you dont need up to the minute real time data)
                  - Or is has to be told its data is no longer valid.






                  share|improve this answer

























                    0












                    0








                    0







                    As the other answer a suggests your trigger idea is ok, however as you've stated that would be a lot of triggers.



                    If your cache is not local to the API, which i assume it isn't if triggers would be able to access. Could you not access it from your desktop application? You could invalidate your cache by removing the employee record from the cache with the desktop application when it makes a successful change to the employee table.



                    It boils down to..



                    You have a cache (which is essentially a read store).
                    You have two options to update it
                    - Either it times out and fetches (which is ok, if you dont need up to the minute real time data)
                    - Or is has to be told its data is no longer valid.






                    share|improve this answer













                    As the other answer a suggests your trigger idea is ok, however as you've stated that would be a lot of triggers.



                    If your cache is not local to the API, which i assume it isn't if triggers would be able to access. Could you not access it from your desktop application? You could invalidate your cache by removing the employee record from the cache with the desktop application when it makes a successful change to the employee table.



                    It boils down to..



                    You have a cache (which is essentially a read store).
                    You have two options to update it
                    - Either it times out and fetches (which is ok, if you dont need up to the minute real time data)
                    - Or is has to be told its data is no longer valid.







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 8 '18 at 17:31









                    LeeLee

                    215




                    215





















                        0














                        Two ways to solve this



                        1. Push model

                        2. Pull model

                        Push Model: Using a database trigger for SQL server table to populate an intermediate audit table and polling that using a background task.



                        Pull Model: Using CLR Trigger and pushing the updates to an API. Whenever DML happens the CLR trigger will call the Api, qhich in-turn can update the cache!



                        Hope this helps!






                        share|improve this answer



























                          0














                          Two ways to solve this



                          1. Push model

                          2. Pull model

                          Push Model: Using a database trigger for SQL server table to populate an intermediate audit table and polling that using a background task.



                          Pull Model: Using CLR Trigger and pushing the updates to an API. Whenever DML happens the CLR trigger will call the Api, qhich in-turn can update the cache!



                          Hope this helps!






                          share|improve this answer

























                            0












                            0








                            0







                            Two ways to solve this



                            1. Push model

                            2. Pull model

                            Push Model: Using a database trigger for SQL server table to populate an intermediate audit table and polling that using a background task.



                            Pull Model: Using CLR Trigger and pushing the updates to an API. Whenever DML happens the CLR trigger will call the Api, qhich in-turn can update the cache!



                            Hope this helps!






                            share|improve this answer













                            Two ways to solve this



                            1. Push model

                            2. Pull model

                            Push Model: Using a database trigger for SQL server table to populate an intermediate audit table and polling that using a background task.



                            Pull Model: Using CLR Trigger and pushing the updates to an API. Whenever DML happens the CLR trigger will call the Api, qhich in-turn can update the cache!



                            Hope this helps!







                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered Nov 15 '18 at 12:20









                            Vivek NatarajanVivek Natarajan

                            8614




                            8614



























                                draft saved

                                draft discarded
















































                                Thanks for contributing an answer to Stack Overflow!


                                • Please be sure to answer the question. Provide details and share your research!

                                But avoid


                                • Asking for help, clarification, or responding to other answers.

                                • Making statements based on opinion; back them up with references or personal experience.

                                To learn more, see our tips on writing great answers.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function ()
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53181464%2fwhen-to-invalidate-cache-net-core-api%23new-answer', 'question_page');

                                );

                                Post as a guest















                                Required, but never shown





















































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown

































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown







                                這個網誌中的熱門文章

                                What does pagestruct do in Eviews?

                                Dutch intervention in Lombok and Karangasem

                                Channel Islands