第4章 Redis,一站式高性能存储方案问题

点赞具体要实现功能有哪些?

  1. 可以点赞的地方:对帖子点赞,对评论点赞
  2. 点一次是点赞,再点一次是取消赞
  3. 统计点赞的数量(计数,string),帖子被点赞的数量,某个用户被点赞的数量

点赞使用到的Redis数据结构是什么?

记录某个实体有哪些用户点赞使用集合数据结构

记录某个用户获得的点赞数使用字符串数据结构进行技术

一个点赞过程是什么?

如果本身有赞了,再去点击点赞按钮,就被认为是取消赞

如何判断userId是否给某个实体点赞了

给某个实体点赞的key是:like:entity_type:entity_id

value是:集合,{用户id}

所以我们只需判断或者这个实体的用户id集合,然后判断userId是不是属于这个集合

如果属于,代表userId已经给这个用户点赞

如果不属于,则代表userId还没有给这个用户点赞

为什么要用redis事务?

因为点赞这个过程包括两个,一个是对实体点赞的用户id需要加入/移除到集合中;另一个是实体所属的用户需要增加/减少获赞数

为了保证这两个数据的一致性和原子性,所以需要用到redis事务。

一个关注过程是什么样?

这样设置就可以实现,我关注的人、我关注的帖子、我关注的评论等功能

还可以实现查看,关注我的粉丝,关注这个帖子的粉丝,关注这个评论的粉丝等功能

为什么要用有序集合存储关注的实体和粉丝

  1. 使用集合的原因:需要获取里面的元素。
  2. 使用有序集合原因:需要分页显示。有序集合可以返回指定索引范围的数据,集合做不到。列表也可以返回指定范围的数据,但是列表无法去重。

综上两点原因,使用有序集合 zrange或zrevrange,返回有序集中指定区间内的成员,通过索引。

列表无法去重

集合无法返回指定索引范围内的元素

所以使用有序集合

有序集合的zrange和zrevrange命令,可以返回有序集合中指定索引范围内的成员,实现分页显示。

Redis作为一级缓存是怎么做的?

用户信息作为经常要访问的信息,如果直接去访问数据库,会造成对数据库的访问压力增大。所以,我将用户信息缓存在Redis中,并设置过期时间,如果查询某个用户,先去Redis缓存中查询,如果查询到了,就返回该用户信息, 不用去数据库查询。如果查询不到用户,就初始化该用户的缓存信息,从数据库取出来,再放到redis中并设置过期时间。如果修改了用户信息,需要清楚缓存。

  1. 优先从缓存中取值:User getCache(int userId)
  2. 取不到时初始化缓存数据:User initCache(int userId)
  3. 数据变更时清除缓存数据:void clearCache(int userId)
java 复制代码
	// 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);
    }

在获取用户时:

java 复制代码
    public User findUserById(int id) {
        User user = getCache(id);
        if (user == null) {
            user = initCache(id);
        }
        return user;
    }

变更用户信息是需要清除该用户的缓存。

相关推荐
望获linux34 分钟前
【实时Linux实战系列】实时数据流处理框架分析
linux·运维·前端·数据库·chrome·操作系统·wpf
Web极客码2 小时前
如何为WordPress启用LiteSpeed缓存
前端·缓存
会编程的林俊杰2 小时前
Redisson中的分布式锁
redis·分布式·redisson
野犬寒鸦3 小时前
Pipeline功能实现Redis批处理(项目批量查询点赞情况的应用)
java·服务器·数据库·redis·后端·缓存
꧁༺摩༒西༻꧂3 小时前
Spring Boot Actuator 监控功能的简介及禁用
java·数据库·spring boot
程序员JerrySUN3 小时前
当前主流GPU全景讲解:架构、功能与应用方向
数据库·人工智能·驱动开发·redis·缓存·架构
__Smile°3 小时前
kubeadm-k8s 中的 etcd 备份与恢复
数据库·docker·云原生·容器·kubernetes·etcd
小醉你真好4 小时前
12、Docker Compose 安装 Redis
redis·docker·容器
Runing_WoNiu4 小时前
最佳左前缀法则(Optimal Left-Prefix Rule)
数据库·mysql
IvorySQL4 小时前
如何使用 pg_rman 进行 PostgreSQL 的备份与恢复
数据库