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

本文讨论了在IT技术背景下,如何使用Redis数据结构如集合和字符串来实现点赞和关注功能,强调了事务在保持一致性的重要性,以及为何选择有序集合进行分页展示。同时介绍了如何利用Redis作为一级缓存,优化用户信息查询性能。
摘要由CSDN通过智能技术生成

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

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

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

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值