春风如贵客,一到便繁华。各位看官先赞再看,养成好习惯(●´∀`●)
假设,有一张100W规模,并且活跃度很高的数据库表,需要从数据库中随机读取20条数据,并且对性能要求很高的要求。
本文不涉及任何传统的算法结构,仅从解决实际问题出发,代码仅作实例!!!
方案一:
使用数据库随机取20条,代码如下:
SELECT * FROM t_user u WHERE 1 = 1 ORDER BY RAND() LIMIT 20优点:方便,逻辑简单,代码简洁,不引入新的中间件和风险,方便快速开发。
缺点:数据量大之后,存在sql优化的必要。大量请求的话,会造成数据库链接过多
方案二:
随机读取 数据库主键
使用JAVA代码,随机生成30个id,按照大小排列(随机生成30个,取前20个是比较保险的做法)
SELECT * FROM t_user u WHERE 1 = 1 AND u.user_id IN ( -- 随机的id ) LIMIT 20优点:逻辑比较简单,代码简洁,不引入新的中间件和风险,方便快速开发。
缺点:需要提前设置好该表的主键id,避免取到空id。大量请求的话,会造成数据库链接过多
方案三:
方案二的改进,使用方案二读取200条数据,存放到redis中,每次再从redis中,获取200条数据后,随机选择20条。redis的过期时间为10分钟。(可以根据需求适当扩大redis的数据)
优点:逻辑比较简单,代码简洁,
缺点:随机数短期内是在小范围内的选择,引入新的中间件
方案四:
将100W条数据,按照10000条进行分片,预热到redis中,根据hash算法、取余、平均分配、轮流平均分配等分配原则,随机读写即可
优点:效率较高,逻辑较为清晰。
缺点:需要提前分片和预热数据。
方案五:
引入其他中间件,与此同时可能会引起新的风险!!!建议团队评估后再做实施!!!
创作不易,各位的支持和认可,就是我创作的最大动力,
【转载请联系本人】 如有问题,请联系我。欢迎斧正!不胜感激 !
求点赞👍 求关注❤️ 求分享👥 求留言📪