2 在你们交易所中Redis使用场景有哪些

vvEcho 2026-03-13 10:43:50
Categories: Tags:

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]) -- 最大请求数
-- 1 删除窗口外的数据
redis.call("ZREMRANGEBYSCORE", key, 0, now - window)
-- 2 获取当前窗口请求数
local count = redis.call("ZCARD", key)
-- 3 判断是否超过限制
if count >= limit then
return 0
end
-- 4 记录当前请求
redis.call("ZADD", key, now, now)
-- 5 设置过期时间
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;


// redisson自带限流工具 RRateLimiter
RRateLimiter limiter = redissonClient.getRateLimiter("order-limit");
limiter.trySetRate(
RateType.OVERALL,
5,
10,
RateIntervalUnit.SECONDS
);
boolean allowed = limiter.tryAcquire();

RateType.OVERALL //所有的客户端公用一个限流额度
RateType.PER_CLIENT //每个redisson客户端限流额度独立