第四章:redis

Redis入门

image-20211213160350868

SpringBoot整合Redis

image-20211213170836531

1、导包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、在配置文件中配置

#RedisProperties
spring.redis.database=11
spring.redis.host=47.93.98.210
spring.redis.port=6379

3、编写配置类

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        //实例化bean
        RedisTemplate<String,Object> template=new RedisTemplate<>();
        //将工厂设置给template(具有了访问数据库的能力)
        template.setConnectionFactory(factory);
        //序列化的方式(数据转换的方式)
        //设置key的序列化方式
        template.setKeySerializer(RedisSerializer.string());

        //设置value的序列化方式
        template.setValueSerializer(RedisSerializer.json());

        //设置hash的key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());

        //设置hash的value的序列化方式
        template.setHashValueSerializer(RedisSerializer.json());

        //将设置生效
        template.afterPropertiesSet();

        return template;

    }
}

点赞

image-20211213202556719

存数据key反复复用,比较容易记,写一个工具专门去用于产生key

image-20211213204104017
帖子和评论统称为实体

业务层

@Service
public class LikeService {

    @Autowired
    private RedisTemplate redisTemplate;

    //点赞
    public void like(int userId,int entityType,int entityId){
        //拼接出key
        String entityLikeKey= RedisKeyUtil.getEntityLikeKey(entityType,entityId);
        //判断当前用户有没有点过赞(userid在不在set集合里)
        boolean isMember=redisTemplate.opsForSet().isMember(entityLikeKey,userId);
        //已经点过赞了,取消赞(将userid在set集合中remove)
        if(isMember){
            redisTemplate.opsForSet().remove(entityLikeKey,userId);
        }else {//没点过,添加数据
            redisTemplate.opsForSet().add(entityLikeKey,userId);

        }
    }

    //查询某实体点赞的数量
    public long findEntityLikeCount(int entityType,int entityId){
        //得到key
        String entityLikeKey=RedisKeyUtil.getEntityLikeKey(entityType,entityId);
        //在set集合中查看key对应有几个value
        return redisTemplate.opsForSet().size(entityLikeKey);

    }

    //查询某人对某实体的点赞状态,返回整数更具有扩展性,以后还可以开发踩帖子的功能
    public int findEntityLikeStatus(int userId,int entityType,int entityId){
        //拼接出key
        String entityLikeKey= RedisKeyUtil.getEntityLikeKey(entityType,entityId);
        //判断value集合中是否有该userid
        return redisTemplate.opsForSet().isMember(entityLikeKey,userId) ? 1:0;
    }

}

表现层:异步刷新,不用更新整个页面

image-20211213213259394

1开头的是帖子,2开头的是评论

对之前的帖子、评论、回复进行重构,将点赞状态和点赞数量信息添加到相应的vo页面表现集合里面。

image-20211214141032408

image-20211214141115043

image-20211214141142588

我收到的赞

image-20211214142337540

解决redis乱码问题:redis-cli --raw

关注、取消关注

image-20211214141205069

image-20211214172912700

image-20211217144626877

关注列表、粉丝列表

image-20211217144709137

个人主页的我的回复

image-20211221104830709

image-20211221104904377

//查找某用户曾经为帖子发布过的评论
@RequestMapping(path = "/selectReply/{userId}",method = RequestMethod.GET)
public String findComment(@PathVariable("userId")int userId,
                          Page page,Model model){
    //查找user
    User user = userService.findUserById(userId);
    //判断用户是否存在
    if(user==null){
        throw new RuntimeException("用户不存在!");
    }
    //将用户添加到model
    model.addAttribute("user",user);
    //设置分页信息
    page.setLimit(3);
    page.setPath("/user/selectComment/"+userId);
    page.setRows(commentService.findUserCount(userId));

    //查找某用户曾经为帖子发布过的评论
    List<Comment> comments = commentService.findUserComments(userId, page.getoffset(), page.getLimit());
    // 判断集合是否为空
    if(comments==null){
        return null;
    }

    List<Map<String,Object>> list=new ArrayList<>();
    for (Comment comment : comments) {
        Map<String,Object> map=new HashMap<>();
        //将评论保存起来
        map.put("comment",comment);
        //找到回复对应的帖子
        DiscussPost discussPost = discussPostService.findDiscussDetail(comment.getEntityId());
        map.put("discussPost",discussPost);

        list.add(map);
    }

    model.addAttribute("comments",list);

    return "/site/my-reply";
}

优化登陆模块

image-20211221105020595

存验证码:

1.定义redis的key

在这里插入图片描述

拼接验证码的key

不同的用户验证码不同,识别用户是谁,在用户访问登录页面的时候给他发一个凭证(随机生成的字符串,存到cookie里面),很快让字符串过期即可。

在这里插入图片描述

获取验证码方法重构

将验证码存到redis里面,那就需要key,key有需要随机字符串,所以先写生成随机字符串

凭证需要发给客户端(浏览器),在cookie中保存,并设置过期时间和生效路径

添加到response里面

将验证码存入redis

2)redis记录登陆凭证

将ticket字符串传入

将之前的login_ticket表废弃掉,登陆之后生成凭证,退出之后销毁凭证,查询凭证的方法

image-20211221140118905

销毁凭证就是在redis里面先将值取出来再将值修改一下再存进去(1表示删除态)

image-20211221140230413

image-20211221140258473

后续的开发可能会用到redis里面的凭证,所以退出时只是修改凭证而不是删除,但是用户信息是临时存一下,提高效率而已,还有user表,要删除的话就直接删除

在查询user的时候先尝试在redis里面取值,取不到再初始化进去,修改用户数据后(头像密码),删除缓存。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值