pelikan
pelikan copied to clipboard
feat: implement resp INCR command
Adds:
- i64 parsing method that is similar to the Redis C implementation but is faster because of the use of
checked_mul
andchecked_add
available to Rust. It's slightly slower than the stdlibstring::parse<i64>()
at this point, but works from a&[u8]
and respects Redis parsing rules, so is preferable for this use case - the RESP command parsing for
INCR
- the
SET
RESP command now eagerly checks whether the input value can be parsed as an i64, and if so, stores it as one. Otherwise it stores bytes (current behavior) - the implementation in Resp using seg entrystore
Notes:
- segcache only handled uinsigned integers currently, so the implementation is a little strange. Essentially I am doing things on the Rust layer
checked_add
with the SegcacheValue
and determining whether it would overflow if we viewed the underlying u64 as an i64 and added to it. If it would not overflow, we simply update the underlying u64 usingwrapping_add
which would be guaranteed not to overflow provided nothing happens in between the check and set, which should be true currently. Adding i64 support to Segcache is probably desirable, but if storage is currently single-threaded, then the current implementation should work
@brayniac did you have any outstanding changes you wanted?