Adicionar funções do Redis: SETIFHIGHER, SETIFLOWER, ZADDIFHIGHER, ZADDIFLOWER

Scripts LUA que adicionam essas novas funções ao Redis.

Eles são muito úteis para mim em coisas como análises ou “gamificação”. Use SCRIPT LOAD no console para adicionar essas funções

SETIFHIGHER

Defina ou atualize a chave se o novo valor for maior que o atual. Se não existir retorna OK, se atualizado retorna o incremento, se não atualizado retorna 0

SCRIPT LOAD "local c = tonumber(redis.call('get', KEYS[1])); if c then if tonumber(ARGV[1]) > c then redis.call('set', KEYS[1], ARGV[1]) return tonumber(ARGV[1]) - c else return 0 end else return redis.call('set', KEYS[1], ARGV[1]) end"

# Use:
EVALSHA
"2ab979bc4b89ab15c14805586c33d898f99a53d4" 1 key 245

 SETIFLOWER

Defina ou atualize a chave se o novo valor for inferior ao atual. Se não existir retorna OK, se atualizado retorna o decréscimo, se não atualizado retorna 0

SCRIPT LOAD "local c = tonumber(redis.call('get', KEYS[1])); if c then if tonumber(ARGV[1]) < c then redis.call('set', KEYS[1], ARGV[1]) return tonumber(ARGV[1]) - c else return 0 end else return redis.call('set', KEYS[1], ARGV[1]) end"

# Use:
EVALSHA
"3b99f44a33619dca62593053ce4bf52f7b432880" 1 key 3535

ZADDIFHIGHER

Defina ou atualize o conjunto classificado se o novo valor for maior que o atual. Se não existir retorna “OK”, se atualizado retorna o incremento, se não atualizado retorna 0

SCRIPT LOAD "local c = tonumber(redis.call('zscore', KEYS[1], ARGV[1])); if c then  if tonumber(KEYS[2]) > c then redis.call('zadd', KEYS[1], KEYS[2], ARGV[1]) return tonumber(KEYS[2]) - c else return 0 end else redis.call('zadd', KEYS[1], KEYS[2], ARGV[1]) return 'OK' end"

# Use:
EVALSHA
"8d1c75ea83b6f8f9ba5f7f048188da7ee6c4b35f" 2 set 10 member

 ZADDIFLOWER

Defina ou atualize o conjunto classificado se o novo valor for inferior ao atual. Se não existir retorna “OK”, se atualizado retorna o decremento, se não atualizado retorna 0

SCRIPT LOAD "local c = tonumber(redis.call('zscore', KEYS[1], ARGV[1])); if c then  if tonumber(KEYS[2]) < c then redis.call('zadd', KEYS[1], KEYS[2], ARGV[1]) return tonumber(KEYS[2]) - c else return 0 end else redis.call('zadd', KEYS[1], KEYS[2], ARGV[1]) return 'OK' end"

# Use:
EVALSHA
"1f8b6cf618d14c48e23b483fc42df71b6bea582e" 2 set 10 member

 Benchmarks básicos

# SET key val # 87489.06
# SETRANGE key2 6 "Redis" # 75757.58 req/s
# INCR key 245 # 70224.72 req/s
# INCRBY key 245 22 # 67114.09 req/s
# EVAL SET key val # 46296.29 req/s
# SETIFHIGHER # 41666.67 req/s
# SETIFLOWER # 41054.12 req/s
# ZADDIFHIGHER # 34952.81 req/s
# ZADDIFLOWER # 34831.07 req/s