pelikan icon indicating copy to clipboard operation
pelikan copied to clipboard

feat: implement resp INCR command

Open hderms opened this issue 2 years ago • 1 comments

Adds:

  • i64 parsing method that is similar to the Redis C implementation but is faster because of the use of checked_mul and checked_add available to Rust. It's slightly slower than the stdlib string::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 Segcache Value 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 using wrapping_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

hderms avatar Feb 07 '23 20:02 hderms

@brayniac did you have any outstanding changes you wanted?

hderms avatar Feb 21 '23 19:02 hderms