Chase Anderson, Ian Gibaut and Buck Farmer held the Cardinals to one hit and one run through eight innings.
Cincinnati starter Anderson held the Cardinals to one run and one hit, with two walks and three strikeouts over five innings.
Nick Senzel awoke from a deep slump with a home run and Aristides Aquino homered.
Left fielder T.J. Friedl made a diving backhanded catch of a hard line drive destined for a double by Nolan Arenado and started a 7-6-2 throw to wipe out a run in the third.
The Reds grabbed a 1-0 lead in the second inning against St. Louis starter Miles Mikolas. It came off the bat of Senzel, who was 0 for 13 and 1 for 23. But on this at bat he propelled a home run over the left-field fence.
And they pushed their lead to 2-0 in the third on a full-count walk to No. 9 hitter Austin Romine, a double by Friedl and a sacrifice fly by Jake Fraley.
St. Louis cut the lead to 2-1 in the third, but Friedl and shortstop Kyle Farmer saved it from being tied.
Anderson walked Lars Nootbar with one out and hit Brendan Donovan with a pitch. With two outs, Paul Goldschmidt lined one down the left-field line, scoring Nootbart. Donovan tried to score from first, but Friedl threw to Farmer and Farmer’s relay throw home wiped out Donovan.
Another home run by Aquino with two outs in the sixth, his fifth in his last 14 games, gave the Reds a 3-1 lead.
The Reds threatened in the eighth against relief pitcher Jake Woodford. With one out, Donovan Solano walked and Aquino doubled to left, putting runners on third and second.
Stuart Fairchild pinch-ran for Solano at third, providing more speed. He wasn’t speedy enough. Senzel flied to medium-deep right field. Fairchild tagged and sprinted for home, but Nootbar threw him out, ending the inning.
Reds pitchers retired 15 straight after Goldschmidt’s double, but closer Alexis Diaz, facing the top of the order in the ninth, gave up a leadoff double to Donovan.
He walked Tommy Edman on a full count, putting two on with no outs. He coaxed a pop fly to center from MVP favorite Goldschmidt. Co-MVP candidate Arenado blooped a single to center, loading the bases.
And that brought up Albert Pujols. He hit a sacrifice fly to right to cut it to 3-2. Edman tagged and barely beat Aquino’s throw to third.
Corey Dickerson pinch-hit for Tyler O’Neill and he grounded out to third, giving Diaz a shaky seventh save.
The crowd stood for every Albert Pujols at bat, cheering on his pursuit of 700 home runs. Anderson coaxed two pop-ups, Buck Farmer struck him out and he had the ninth-inning sacrifice fly.
Yadier Molina, wearing number 21 in honor of fellow Puerto Rican Roberto Clemente on ‘Roberto Clemente Night,’ was 0 for 3 with a strikeout.