赞
踩
记录某个实体有哪些用户点赞使用集合数据结构
记录某个用户获得的点赞数使用字符串数据结构进行技术
如果本身有赞了,再去点击点赞按钮,就被认为是取消赞
给某个实体点赞的key是:like:entity_type:entity_id
value是:集合,{用户id}
所以我们只需判断或者这个实体的用户id集合,然后判断userId是不是属于这个集合
如果属于,代表userId已经给这个用户点赞
如果不属于,则代表userId还没有给这个用户点赞
因为点赞这个过程包括两个,一个是对实体点赞的用户id需要加入/移除到集合中;另一个是实体所属的用户需要增加/减少获赞数
为了保证这两个数据的一致性和原子性,所以需要用到redis事务。
这样设置就可以实现,我关注的人、我关注的帖子、我关注的评论等功能
还可以实现查看,关注我的粉丝,关注这个帖子的粉丝,关注这个评论的粉丝等功能
综上两点原因,使用有序集合 zrange或zrevrange,返回有序集中指定区间内的成员,通过索引。
列表无法去重
集合无法返回指定索引范围内的元素
所以使用有序集合
有序集合的zrange和zrevrange命令,可以返回有序集合中指定索引范围内的成员,实现分页显示。
用户信息作为经常要访问的信息,如果直接去访问数据库,会造成对数据库的访问压力增大。所以,我将用户信息缓存在Redis中,并设置过期时间,如果查询某个用户,先去Redis缓存中查询,如果查询到了,就返回该用户信息, 不用去数据库查询。如果查询不到用户,就初始化该用户的缓存信息,从数据库取出来,再放到redis中并设置过期时间。如果修改了用户信息,需要清楚缓存。
// 1.优先从缓存中取值 private User getCache(int userId) { String redisKey = RedisKeyUtil.getUserKey(userId); return (User) redisTemplate.opsForValue().get(redisKey); } // 2.取不到时初始化缓存数据 private User initCache(int userId) { User user = userMapper.selectById(userId); String redisKey = RedisKeyUtil.getUserKey(userId); redisTemplate.opsForValue().set(redisKey, user, 3600, TimeUnit.SECONDS); return user; } // 3.数据变更时清除缓存数据 private void clearCache(int userId) { String redisKey = RedisKeyUtil.getUserKey(userId); redisTemplate.delete(redisKey); }
在获取用户时:
public User findUserById(int id) {
User user = getCache(id);
if (user == null) {
user = initCache(id);
}
return user;
}
变更用户信息是需要清除该用户的缓存。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。