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; }