点赞具体要实现功能有哪些?
- 可以点赞的地方:对帖子点赞,对评论点赞
- 点一次是点赞,再点一次是取消赞
- 统计点赞的数量(计数,string),帖子被点赞的数量,某个用户被点赞的数量
点赞使用到的Redis数据结构是什么?
记录某个实体有哪些用户点赞使用集合数据结构
记录某个用户获得的点赞数使用字符串数据结构进行技术
一个点赞过程是什么?
如果本身有赞了,再去点击点赞按钮,就被认为是取消赞
如何判断userId是否给某个实体点赞了
给某个实体点赞的key是:like:entity_type:entity_id
value是:集合,{用户id}
所以我们只需判断或者这个实体的用户id集合,然后判断userId是不是属于这个集合
如果属于,代表userId已经给这个用户点赞
如果不属于,则代表userId还没有给这个用户点赞
为什么要用redis事务?
因为点赞这个过程包括两个,一个是对实体点赞的用户id需要加入/移除到集合中;另一个是实体所属的用户需要增加/减少获赞数
为了保证这两个数据的一致性和原子性,所以需要用到redis事务。
一个关注过程是什么样?
这样设置就可以实现,我关注的人、我关注的帖子、我关注的评论等功能
还可以实现查看,关注我的粉丝,关注这个帖子的粉丝,关注这个评论的粉丝等功能
为什么要用有序集合存储关注的实体和粉丝
- 使用集合的原因:需要获取里面的元素。
- 使用有序集合原因:需要分页显示。有序集合可以返回指定索引范围的数据,集合做不到。列表也可以返回指定范围的数据,但是列表无法去重。
综上两点原因,使用有序集合 zrange或zrevrange,返回有序集中指定区间内的成员,通过索引。
列表无法去重
集合无法返回指定索引范围内的元素
所以使用有序集合
有序集合的zrange和zrevrange命令,可以返回有序集合中指定索引范围内的成员,实现分页显示。
Redis作为一级缓存是怎么做的?
用户信息作为经常要访问的信息,如果直接去访问数据库,会造成对数据库的访问压力增大。所以,我将用户信息缓存在Redis中,并设置过期时间,如果查询某个用户,先去Redis缓存中查询,如果查询到了,就返回该用户信息, 不用去数据库查询。如果查询不到用户,就初始化该用户的缓存信息,从数据库取出来,再放到redis中并设置过期时间。如果修改了用户信息,需要清楚缓存。
- 优先从缓存中取值:User getCache(int userId)
- 取不到时初始化缓存数据:User initCache(int userId)
- 数据变更时清除缓存数据:void clearCache(int userId)
// 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;
}
变更用户信息是需要清除该用户的缓存。