# frozen_string_literal: truerequire'json'moduleSplitIoClientmoduleCachemoduleAdapters# Redis adapter used to provide interface to RedisclassRedisAdapterSCAN_SLICE=5000attr_reader:redisdefinitialize(redis_url)connection=redis_url.is_a?(Hash)?redis_url:{url: redis_url}@redis=Redis.new(connection)enddefhincrby(key,field,increment)@redis.hincrby(key,field,increment)end# Mapdefinitialize_map(key)# No need to initialize hash/map in Redisenddefadd_to_map(key,field,value)@redis.hset(key,field,value)enddeffind_in_map(key,field)@redis.hget(key,field)enddefdelete_from_map(key,field)@redis.hdel(key,field)enddefin_map?(key,field)@redis.hexists(key,field)enddefmap_keys(key)@redis.hkeys(key)enddefget_map(key)@redis.hgetall(key)end# Stringdefstring(key)@redis.get(key)enddefset_string(key,str)@redis.set(key,str)enddeffind_strings_by_prefix(prefix)find_strings_by_pattern("#{prefix}*")enddeffind_strings_by_pattern(pattern)memo={items: [],cursor: 0}loopdomemo[:cursor],items=@redis.scan(memo[:cursor],match: "#{pattern}",count: SCAN_SLICE)memo[:items].push(*items)breakifmemo[:cursor]=='0'endmemo[:items]enddefmultiple_strings(keys)Hash[keys.zip(@redis.mget(keys))]enddefappend_to_string(key,val)@redis.append(key,val)end# Booldefset_bool(key,val)@redis.set(key,val.to_s)enddefbool(key)@redis.get(key)=='true'end# Setaliasinitialize_setinitialize_mapaliasfind_sets_by_prefixfind_strings_by_prefixdefadd_to_set(key,val)@redis.sadd?(key,val)enddefdelete_from_set(key,val)@redis.srem(key,val)enddefget_set(key)@redis.smembers(key)enddefin_set?(key,val)@redis.sismember(key,val)enddefget_all_from_set(key)@redis.smembers(key)enddefunion_sets(set_keys)return[]ifset_keys==[]@redis.sunion(set_keys)enddefrandom_set_elements(key,count)@redis.srandmember(key,count)end# Queuedefadd_to_queue(key,val)@redis.rpush(key,val)end# count = 0 will result in lrange(0,-1), fetching all itemsdefget_from_queue(key,count)items=@redis.lrange(key,0,count-1)fetched_count=items.sizeitems_to_remove=fetched_count==count?count:fetched_count@redis.ltrim(key,items_to_remove,-1)itemsend# Generaldefexists?(key)@redis.exists?(key)enddefdelete(key)returnnilifkey==[]@redis.del(key)enddefinc(key,inc=1)@redis.incrby(key,inc)enddefpipelined@redis.pipelineddo|pipeline|yieldendenddefclear(prefix)# noopenddefexpire(key,seconds)@redis.expire(key,seconds)endendendendend