Hi,
I am looking to store Entities in Cache instead of querying the database all the time and when an entity is CRUD these changes to be also replicated to Cache.
I read Caching in aspnetboilerplate documentation but it does not support the above requirement and it is also not storing Entitis but rather Dtos. Is there anything that support my requirements?
Thanks in advance
13 Answer(s)
-
0
There may be many problems with storage entities, such as Entities may depend on each other. Entities may have a lot of state or proxy information attached to different Orm(ef6).
So abp is designed to cache the Dto of the entity instead of the entity itself.
Dto can add all the entity information you need.
-
0
So every time a create/update/delete an entity from the database the Cache dto is updated?
Thanks
-
0
- It gets the entity from the repository (the database) in it's first call. It then gets from the cache in subsequent calls.
- It automatically invalidates a cached entity if this entity is updated or deleted. Thus, it will be retrieved from the database in the next call.
please see:https://aspnetboilerplate.com/Pages/Documents/Caching#how-entitycache-works
-
0
It lacks one very important thing though. No way to retrieve all objects at once (list) but instead I can only retrieve it one by one. This is very inefficient especially in cases that you want to return to client an OutputDto which contains list of items for drawing controls (e.g Countries dropdown need to get all countries)
-
0
If your entity does not change often, you can directly store the Dto of the list in the cache, and re-query the list Dto update cache when some entities change.
If your entity changes frequently, you can consider adding/deleting/updating the cached list Dto when certain entities are changed. Of course this is cumbersome.
https://aspnetboilerplate.com/Pages/Documents/Caching https://aspnetboilerplate.com/Pages/Documents/EventBus-Domain-Events#entity-changes
-
0
I am confused.
It automatically invalidates a cached entity if this entity is updated or deleted. Thus, it will be retrieved from the database in the next call.
and then you said that:
If your entity changes frequently, you can consider adding/deleting/updating the cached list Dto when certain entities are changed. Of course this is cumbersome.
Is it creating/updating/deleting or I have to do it manually
If your entity does not change often, you can directly store the Dto of the list in the cache, and re-query the list Dto update cache when some entities change.
How can I do that?
-
0
I mean you don't use Entity Caching,
Instead, use the cache component and entity change events to handle it yourself.
Please refer to the documentation: https://aspnetboilerplate.com/Pages/Documents/Caching https://aspnetboilerplate.com/Pages/Documents/EventBus-Domain-Events#entity-changes
-
0
Eventually I have to write my own cache. I think this functionality is very easy to be added to existing ITypeCache since it is very easy to implement it.
-
0
What do you mean?
-
0
Sorry,
Getting all the keys from the cache seems to have not been implemented.
Please see: https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2842
-
0
@antonis,
ABP's cache abstraction is distributed cache compatible. That means we can not add methods supported only by the memory cache.
You have a few options explained by @maliming.
You can free to implement this yourself, using with an in-memory cache or a simple static list/dictionary of entities. This won't work if you use a clustered deployment (becuase inmemory cache will not be shared between servers).
-
0
Yes I totally understand this. Mostly I intend to use it for entries that are not created/updated/deleted
-
0
Closing then :)