java 如何快速的获取浏览量

最近公司做了一个类似 于发帖,交友圈一个这样的功能 在如何精确快速的获取用户的浏览量,且及时的更新显示,最初我是这样想,把每条帖子内容浏览量放到reids 里面,但是redis只是用来存零时数据,想想觉的还是放表里面好,在发布的帖子表增加一个字段作为该帖子的浏览量,但是每次从表里面读更新浏览量,这样肯定是不明智的做法,直接看下面代码

1:当用户浏览帖子内容时 根据KEY 从redis 获取改帖子的浏览量如果存在,那么就在以前的基础上+1 否则就从数据库查询出来再+1然后放到缓存里面

        // 浏览量
        if (redisClient.hexists(CAMPUS_CIRCLE_PAGEVIEWS_KEY, id.toString())) {
            redisClient.hincrBy(CAMPUS_CIRCLE_PAGEVIEWS_KEY, id.toString(), 1);
        } else {
            Integer count = campusCircle.getCount() + 1;
            redisClient.hincrBy(CAMPUS_CIRCLE_PAGEVIEWS_KEY, id.toString(), count);
        }
CAMPUS_CIRCLE_PAGEVIEWS_KEY 这个是帖子浏览量的key
id.toString()是帖子ID
2:写一个定时任务 每10 分钟同步到数据库里面 这个根据业务需求,20分钟30 随便你
/**
 * 定时任务
 * 
 * @author ckj
 * 
 */
@Component
public class CampusCircleTask {
    private static final Logger LOGGER = LoggerFactory.getLogger(CampusCircleTask.class);
    @Autowired
    private CampusCircleDao campusCircleDao;
    @Autowired
    private RedisClient redisClient;
    private static final String CAMPUS_CIRCLE_PAGEVIEWS_KEY = "campus:circle:pageviews";// 校园圈浏览量
    
    @Scheduled(cron="0 0/10 * * * *")
    public void synchronizePageviews() {
        LOGGER.info("CampusCircleTask start");
        Map<String, String> map = redisClient.hgetAll(CAMPUS_CIRCLE_PAGEVIEWS_KEY);
        for (Map.Entry<String, String> entry : map.entrySet()) {
            CampusCircle campusCircle = campusCircleDao.getById(Integer.parseInt(entry.getKey()));
            campusCircle.setCount(Integer.parseInt(entry.getValue()));
            campusCircleDao.update(campusCircle);
        }
        LOGGER.info("CampusCircleTask end");
    }
}

  3:页面显示的时候 由于我们存到redis是 Hash 形式的,这时可要遍历Hash 获取

 
    /**
     * 从redids 获取 浏览量
     * 
     * @param campusCircleId 帖子ID
     * @return
     */
    public Integer getPageviews(Integer campusCircleId) {
        Integer count = 0;
        Map<String, String> map = redisClient.hgetAll(CAMPUS_CIRCLE_PAGEVIEWS_KEY);
        for (Map.Entry<String, String> entry : map.entrySet()) {
            if (campusCircleId.toString().equals(entry.getKey())) {
                count = Integer.parseInt(entry.getValue());
                break;
            }
        }
        return count;
    }
原文地址:https://www.cnblogs.com/SHMILYHP/p/10130119.html