1.存储过程
背景(运行的环境)就是命令行界面:可以实navicat,sqlyog.datagrip等:
截图如下
1.建表:
# 建表
create table test
(
id int not null
primary key,
score int null,
create_time datetime null
);
2.测试数据库存储过程时候可以使用:
create procedure testa()
begin
select * from test;
# select * from orders;
end;
call testa();
3.存储过程代码:
CREATE PROCEDURE insert_many_user_scores(IN START INT(10),in max_num int(10))
BEGIN
DECLARE i INT DEFAULT 0;
-- 模拟玩家英雄的星星数
DECLARE score INT;
DECLARE score2 INT;
-- 初始注册时间
DECLARE date_start DATETIME DEFAULT ('2017-01-01 00:00:00');
-- 每个玩家的注册时间
DECLARE date_temp DATETIME;
SET date_temp = date_start;
SET autocommit=0;
# 重复部分代码
REPEAT
SET i=i+1;
# INTERVAL expr type是要添加到起始日期值的间隔值。
SET date_temp = date_add(date_temp, interval RAND()*60 second);
-- 1-112 随机数,向上取整
SET score = CEIL(RAND()*520);
-- 如果达到了王者,继续模拟王者的星星数
-- 插入新玩家
INSERT INTO test(id, score, create_time) VALUES((START+i), score, date_temp);
UNTIL i = max_num
END REPEAT;
COMMIT;
END;
# 调用
CALL insert_many_user_scores(10000,100000)
结果截图如下:
参考资料:
sql数据的下载链接:
链接:https://pan.baidu.com/s/1I7ROecgiTi1tFjCqsnyPmQ
提取码:y4rt
--来自百度网盘超级会员V5的分享
2.lua脚本:
在server 和cli 服务器端 和客户端同级建立 insert_user_scores.lua文件:
如图:
代码为:
-- 设置时间种子
math.randomseed(ARGV[1])
-- 设置初始的生成时间
local create_time = 1567769563 - 360024365*2.0
local num = ARGV[2]
local user_id = ARGV[3]
for i=1, num do
-- 生成 0 到 60 之间的随机数
local interval = math.random(1, 60)
-- 产生 0 到 1 之间的随机数
local temp = math.random(1, 112)
if (temp == 112) then
-- 产生 0 到 100 之间的随机数
temp = temp + math.random(0, 100)
end
create_time = create_time + interval
temp = temp + create_time / 10000000000
redis.call('ZADD', KEYS[1], temp, user_id+i-1)
end
return 'Generation Completed'
运行命令
redis-cli -h localhost -p 6379 --eval insert_user_scores.lua user_score , 30 100000 10000
其中user_score 是在redis里面的容器名字:后续数字为生成的数量的一些操作:
进行指定区域和排序的数字的查看的命令:
相关查看的命令
ZREVRANGE user_score 0 -1 WITHSCORES --查看所有
ZREVRANGE user_score 0 9 -- 查看从0--9
ZSCORE user_score 10001 -- 查看第10001条数据
对启动redis的lua脚本的相关的命令可以查看:
运行结果: