线上的hash策略配置为 fnv1a_64
路由策略简述:对key hash取值后,比上主分片数量取余,即model=key_hash%master_sharding_nums,
model数值就是既要路由到的主分片的下标
对于lua脚本中key,是按脚本的第一个参数作为key来路由的,所以如果第一个参数一直不变,则通过lua创建的key都会被路由
到同一个分片中
lua 测试脚本
脚本中的key1是hash类型,key2是string类型,测试key2通过lua和不通过lua路由到的分片是否相同
if redis.call("hsetnx", KEYS[1], ARGV[1], 1) == 0 then local h1= redis.call("hget", KEYS[1], ARGV[1]) else local h2="hset ok" end if redis.call("setnx", KEYS[2], ARGV[2]) == 0 then local s1= redis.call("get", KEYS[2]) return s1 else local s2="set ok" return s2 end
方法1 load
不支持此中方法
$ redis-cli -p 8002 10.21.176.95:8002> SCRIPT load test.lua (error) ERR Error compiling script (new function): user_script:2: ‘=‘ expected near ‘end‘
方法2 命令行调用eval
$ redis-cli -p 9999 --eval test.lua hlist s1 , "k1" "bb" "set ok" $ redis-cli -p 9999 --eval test.lua hlist s1 , "k1" "bb" "bb"
第二个key(k1)随第一个key(hlist)都被路由到了7号分片
$ for i in {7004..7007};do echo "/redis_${i}/data/appendonly_${i}.aof";tail -n 1000 /redis_${i}/data/appendonly_${i}.aof|grep -C 30 s1;done/redis_7004/data/appendonly_7004.aof /redis_7005/data/appendonly_7005.aof /redis_7006/data/appendonly_7006.aof /redis_7007/data/appendonly_7007.aof ...匹配到了日志
证明lua是根据第一个key路由的
$ redis-cli -p 9999 hkeys hlist 1) "k1" $ redis-cli -p 9999 get s1 (nil) # 直接生成s1 $redis-cli -p 9999 setnx s1 testbcc (integer) 1 $ redis-cli -p 9999 get s1 "testbcc" # 写入了5号分片 $ for i in {7004..7007};do echo "/redis_${i}/data/appendonly_${i}.aof";tail -n 10000 /redis_${i}/data/appendonly_${i}.aof|grep -C 30 testbcc;done *3 $5 setnx $2 s1 $7 testbcc
aof中记录的日志
*7 $4 EVAL $260 if redis.call("hsetnx", KEYS[1], ARGV[1], 1) == 0 then local h1= redis.call("hget", KEYS[1], ARGV[1]) else local h2="hset ok" end if redis.call("setnx", KEYS[2], ARGV[2]) == 0 then local s1= redis.call("get", KEYS[2]) return s1 else local s2="set ok" return s2 end $1 2 $5 hlist $2 s1 $2 k1 $2 bb
twemproxy(nutcraker) 对lua 中的key的路由策略
原文:https://www.cnblogs.com/Bccd/p/12786203.html