2 在你们交易所中Redis使用场景有哪些
vvEcho
2026-03-13 10:43:50
Categories:
30 场景题
Tags:
redis
1.缓存数据
ticker数据
1 2 3 4 5 6 7
| { lastPrice: 68000 //最近成交价 high24h: 70000 //最高24小时成交价 low24h: 65000 //最低24小时成交价 volume24h: 123456 //24小时成交量 change24h: +4.3% //24小时价格变化 }
|
最近行情k线数据
最近盘口数据
2.jwt-token信息
存储用户登录信息
3.分布式锁
防止重复下单
防止重复提现
资产扣减并发
4.风控限流
为确保原子性,一般用lua表达式
10秒内最多5次请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| local key = KEYS[1] local now = tonumber(ARGV[1]) local window = tonumber(ARGV[2]) local limit = tonumber(ARGV[3])
redis.call("ZREMRANGEBYSCORE", key, 0, now - window)
local count = redis.call("ZCARD", key)
if count >= limit then return 0 end
redis.call("ZADD", key, now, now)
redis.call("EXPIRE", key, window / 1000) return 1
|
java调用这个脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| String luaScript = "local key = KEYS[1] " + "local now = tonumber(ARGV[1]) " + "local window = tonumber(ARGV[2]) " + "local limit = tonumber(ARGV[3]) " + "redis.call('ZREMRANGEBYSCORE', key, 0, now - window) " + "local count = redis.call('ZCARD', key) " + "if count >= limit then return 0 end " + "redis.call('ZADD', key, now, now) " + "redis.call('EXPIRE', key, window/1000) " + "return 1";
long now = System.currentTimeMillis(); Object result = script.eval( RScript.Mode.READ_WRITE, luaScript, RScript.ReturnType.INTEGER, Collections.singletonList("limit:user:10001"), now, 10000, 5 ); boolean allowed = ((Number) result).intValue() == 1;
RRateLimiter limiter = redissonClient.getRateLimiter("order-limit"); limiter.trySetRate( RateType.OVERALL, 5, 10, RateIntervalUnit.SECONDS ); boolean allowed = limiter.tryAcquire();
RateType.OVERALL RateType.PER_CLIENT
|