There are a couple of options that can solve your problem.
Setup your site so that for every piece of content the user submits, it is evaluated by a real person before it is published online. The pro here is you wont have to worry about duplicate content but the con is more time is required to process the content.
Create filters for each content submitted. By this I mean, have a server-side program evaluate whatever the user submits and see if the content matches certain queries and if it does, don't have it posted. The pro here is processing is done in a matter of seconds, but the con is some bad content might get passed through depending on the "intelligence" of the server-side program that is processing the content.
But if you must have lots of duplicate content, then for speed purposes, I'd mark the duplicate content with the noindex meta tag to instruct all search engines not to index that page. The Canonical tag is one that I believe only Google and Bing support.
The problem with a 301/302 redirect is that two requests are required to reach the target page. (one request to reach the redirect page, and one for the target page). This means longer waiting time for the guest.
Don't get me wrong, I use 301's myself but not for new content. I only use them to redirect permanently outdated URLs to the new URLs of the same page, so I can create convenience for someone who last visited my site 5+ years ago.