One of the most crucial issues, nowadays, is to provide personalized services to each individual based on their preferences. To achieve this goal, recommender system could be utilized as a tool to help the users in decision-making process offering different items and options. They are utilized to predict and recommend relevant items to end users. In this case an item could be anything such as a document, a location, a movie, an article or even a user (friend suggestion). The main objective of the recommender systems is to suggest items which have great potential to be liked by users. In modern recommender systems, various methods are combined together with the aim of extracting patterns in available datasets. Combination of different algorithms make prediction more convoluted since various parameters should be taken into account in providing recommendations. Recommendations could be personalized or non-personalized. In non-personalized type, selection of the items for a user is based on the number of the times that an item has been visited in the past by other users. However, in the personalized type, the main objective is to provide the best items to the user based on her taste and preferences. Although, in many domains recommender systems gained significant improvements and provide better services for users, it still requires further research to improve accuracy of recommendations in many aspects. In fact, the current available recommender systems are far from the ideal model of the recommender system. This paper reviews state of art in recommender systems algorithms and techniques which is necessary to identify the gaps and improvement areas. In addition to that, we provide possible solutions to overcome shortages and known issues of recommender systems as well as discussing about recommender systems evaluation methods and metrics in details.