hamt
FusionCache
hamt | FusionCache | |
---|---|---|
7 | 9 | |
261 | 1,320 | |
- | 10.7% | |
6.9 | 8.8 | |
3 months ago | 8 days ago | |
C | C# | |
MIT License | MIT License |
Stars - the number of stars that a project has on GitHub. Growth - month over month growth in stars.
Activity is a relative number indicating how actively a project is being developed. Recent commits have higher weight than older ones.
For example, an activity of 9.0 indicates that a project is amongst the top 10% of the most actively developed projects that we are tracking.
hamt
-
Visual Introduction to Hash-Array Mapped Tries (HAMTs)
This isn't a very good explanation. The wikipedia article isn't great either. I like this description:
https://github.com/mkirchner/hamt#persistent-hash-array-mapp...
The name does tell you quite a bit about what these are:
* Hash - rather than directly using the keys to navigate the structure, the keys are hashed, and the hashes are used for navigation. This turns potentially long, poorly-distributed keys into short, well-distributed keys. However, that does mean you have to compute a hash on every access, and have to deal with hash collisions. The mkirchner implementation above calls collisions "hash exhaustion", and deals with them using some generational hashing scheme. I think i'd fall back to collision lists until that was conclusively proven to be too slow.
* Trie - the tree is navigated by indexing nodes using chunks of the (hash of the) key, rather than comparing the keys in the node
* Array mapped - sparse nodes are compressed, using a bitmap to indicate which logical slots are occupied, and then only storing those. The bitmaps live in the parent node, rather than the node itself, i think? Presumably helps with fetching.
A HAMT contains a lot of small nodes. If every entry is a bitmap plus a pointer, then it's two words, and if we use five-bit chunks, then each node can be up to 32 entries, but i would imagine the majority are small, so a typical node might be 64 bytes. I worry that doing a malloc for each one would end up with a lot of overhead. Are HAMTs often implemented with some more custom memory management? Can you allocate a big block and then carve it up?
Could you do a slightly relaxed HAMT where nodes are not always fully compact, but sized to the smallest suitable power of two entries? That might let you use some sort of buddy allocation scheme. It would also let you insert and delete without having to reallocate the node. Although i suppose you can already do that by mapping a few empty slots.
- Show HN: A hash array-mapped trie implementation in C
- Ask HN: What are some 'cool' but obscure data structures you know about?
FusionCache
-
Release Radar • March 2024 Edition
Want an easy to use cache with advanced resiliency features? Look no further than FusionCache. It's built for performance, good refresh rates, better auto-setup, better logs, and more. Congrats to the team on shipping your first major and stable version 🎉 and receiving over 3.8 million downloads.
- FusionCache Is Now v1.0
-
Caching as a cross cutting concern using MediatR's pipeline behavior
I wrote an internal nuget package for our team that does similar stuff to your work, although I called mine ICachedRequest. Unlike you I denied myself the enjoyment of exploring a custom caching solution and ended up injecting FusionCache into my mediatr behavior.
-
17 Amazing Community Packages for .NET Developers
The most undervalued library from that list is FusionCache. The rest is either well-known (like FluentAssertions) or pretty specific to the guy's experience (like the WPF stuff).
-
Multi level cache library (in memory + Redis)
The instances (using FusionCache for instance) sync over Redis pub/sub.
- What your hidden nuget gems ?
-
How to implement cache
LazyCache is amazing. Btw I'm using FusionCache and it is good too
-
Ask HN: What are some 'cool' but obscure data structures you know about?
If you are in the .NET space I suggest you to take a look at FusionCache. It has cache stampede protection built in, plus some other nice features like a fail-safe mechanism and soft/hard timeouts https://github.com/jodydonetti/ZiggyCreatures.FusionCache
What are some alternatives?
AspNetCoreDiagnosticScenarios - This repository has examples of broken patterns in ASP.NET Core applications
Lazy Cache - An easy to use thread safe in-memory caching service with a simple developer friendly API for c#
multiversion-concurrency-contro
Cache Tower - An efficient multi-layered caching system for .NET
RVS_Generic_Swift_Toolbox - A Collection Of Various Swift Tools, Like Extensions and Utilities
EasyCaching - :boom: EasyCaching is an open source caching library that contains basic usages and some advanced usages of caching which can help us to handle caching more easier!
multiversion-concurrency-control - Implementation of multiversion concurrency control, Raft, Left Right concurrency Hashmaps and a multi consumer multi producer Ringbuffer, concurrent and parallel load-balanced loops, parallel actors implementation in Main.java, Actor2.java and a parallel interpreter
SqliteCache for ASP.NET Core - An ASP.NET Core IDistributedCache provider backed by SQLite
CPython - The Python programming language
NCache - NCache: Highly Scalable In-Memory Distributed Cache for .NET
pyroscope - Continuous Profiling Platform. Debug performance issues down to a single line of code [Moved to: https://github.com/grafana/pyroscope]
CacheCow - An implementation of HTTP Caching in .NET Core and 4.5.2+ for both the client and the server