Dexter Fowler homered for the third straight game while Matt Carpenter and Paul DeJong also homered as St. Louis gained ground in their National League playoff push.
Tommy Pham finished with two doubles, a single and two RBIs and Yadier Molina added a two-run double as the third-place Cardinals (79-72) gained a game on first-place Chicago and second-place Milwaukee in the Central Division and on Colorado in the wild-card race.
Rookie right-hander Luke Weaver retired 10 straight batters in one stretch on the way to his seventh straight winning start, the major leagues' longest active streak.
According to post-game notes provided by the Reds, Weaver is the first Cardinals starting pitcher to have seven consecutive wins in a season since Matt Morris in 2001 and the first St. Louis rookie to do so since Ted Walks in 1944.
The 24-year-old rookie allowed five hits and two runs with seven strikeouts in five innings. He credited his curveball with helping make up for an inconsistent changeup.
Weaver (7-1) has fanned seven or more batters in each of his last seven starts.
Relievers Zach Duke, Seung Hwan Oh, Sandy Alcantara and Sam Tuivailala teamed up to retire the 12 of the final 13 Reds batters.
Carpenter led off the game with his 21st homer. Fowler followed Pham's RBI double in the third with a two-run shot into the right field seats. It was his career-high 18th homer of the season. DeJong added his team-high 24th, the Cardinals' second set of back-to-back homers in two nights.
The Reds broke up Weaver's shutout bid with a two-run fifth. Patrick Kivlehan's drove in Jose Peraza from first with a double and scored on Jesse Winker's single.
Rookie Davis (1-3) gave up all three homers and five runs on five hits with three strikeouts in three innings.
RHP Carlos Martinez, who turns 26 on Thursday, is 0-2 with a 7.15 ERA in two starts against the Reds this season, including a 4-2 loss in Cincinnati on June 5 when he allowed four hits and four runs with two walks and eight strikeouts in 6 1/3 innings.