• Tyson Andre's avatar
    Implement SMISMEMBER key member [member ...] (#7615) · 6f11acbd
    Tyson Andre authored
    
    
    This is a rebased version of #3078 originally by shaharmor
    with the following patches by TysonAndre made after rebasing
    to work with the updated C API:
    
    1. Add 2 more unit tests
       (wrong argument count error message, integer over 64 bits)
    2. Use addReplyArrayLen instead of addReplyMultiBulkLen.
    3. Undo changes to src/help.h - for the ZMSCORE PR,
       I heard those should instead be automatically
       generated from the redis-doc repo if it gets updated
    
    Motivations:
    
    - Example use case: Client code to efficiently check if each element of a set
      of 1000 items is a member of a set of 10 million items.
      (Similar to reasons for working on #7593)
    - HMGET and ZMSCORE already exist. This may lead to developers deciding
      to implement functionality that's best suited to a regular set with a
      data type of sorted set or hash map instead, for the multi-get support.
    
    Currently, multi commands or lua scripting to call sismember multiple times
    would almost definitely be less efficient than a native smismember
    for the following reasons:
    
    - Need to fetch the set from the string every time
      instead of reusing the C pointer.
    - Using pipelining or multi-commands would result in more bytes sent
      and received by the client for the repeated SISMEMBER KEY sections.
    - Need to specially encode the data and decode it from the client
      for lua-based solutions.
    - Proposed solutions using Lua or SADD/SDIFF could trigger writes to
      memory, which is undesirable on a redis replica server
      or when commands get replicated to replicas.
    Co-Authored-By: default avatarShahar Mor <shahar@peer5.com>
    Co-Authored-By: default avatarTyson Andre <tysonandre775@hotmail.com>
    6f11acbd
t_set.c 38.7 KB