点赞具体要实现功能有哪些?
- 可以点赞的地方:对帖子点赞,对评论点赞
- 点一次是点赞,再点一次是取消赞
- 统计点赞的数量(计数,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;
    }
变更用户信息是需要清除该用户的缓存。



















