技术文章

【Redis从头学-4】Redis中的String数据类型实战应用场景之验证码、浏览量、点赞量、Json格式存储

DaenCode

An editor at Blogzine


  • 2023-08-20
  • 45天前
  • 3384
  • 18 Views
  • 100

🧑‍💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:Redis从头学


在这里插入图片描述


🌟前言

之前的篇章对Redis已经做出了具体介绍,并且对其命令的使用也做出了相应的案例。本文就结合String数据类型结构的特性,一起探讨其实战中的应用场景。

🌟String数据类型分析

1.底层实现分析:其基于SDS数据结构实现。SDS作为一种动态字符串,不仅保存了字符串的值,还保存了字符串的长度信息,这样可以快速获取字符串的长度,不用重新计算。
2.空间效率分析:Redis的String类型以字节数数组形式存在,采用了一些优化策略节省空间。当一个字符串长度较小,redis会自动调整SDS的空间大小,减少内存浪费。
3.存储位置分析:Redis将值存储在内存中,读写效率搞笑。此外,还提高了大量的基础命令以及批量操作命令,提高了数据处理效率。
4.key过期策略:通过设置key的过期时间来节省冗余数据造成的空间浪费。

🌟String类型实战应用场景

通过上述对String类型的分析,可以结合实际需求选择适合String类型结构的场景,比如使用String类型实现验证码存储功能、文章浏览量统计功能、JSON格式热点数据功能等等。

验证码存储功能

场景描述

在用户注册功能中,要为用户生成和验证验证码,并设置相应的过期时间。此例子为简单演示功能,具体生产场景中比这个要复杂很多!旨在让大家感受String数据类型在redis中的应用场景。

测试效果

测试描述:首先通过获取验证码接口,获取验证码;之后通过注册接口将用户名、密码、以及输入的验证码输入来验证注册功能。
生成验证码
在这里插入图片描述
redis存储查看
在这里插入图片描述
进行注册
在这里插入图片描述

场景代码

场景:

  • 用户在前台输入用户名、密码
  • 点击获取验证码按钮,获取验证码(经过以下代码中的/captcha接口)
  • captcha接口中生成验证码,并存储到redis中,60秒过期时间。
  • 用户根据生成的验证码以及输入的用户名、密码进行注册
  • 验证验证码是否与redis中获取的一致。若一致再将注册的用户信息存入到数据库,否则注册失败。

具体的代码解释可以看相应的代码注释

@RestController
@RequestMapping("/api/v1/cap")
public class TestCodeController {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @PostMapping("/register")
    public JsonData registerUser(@RequestBody UserLogin userLogin) {
        // 验证验证码是否正确
        if (validateCaptcha(userLogin.getUsername(),userLogin.getCaptcha())) {
            //保存到数据库,这里就不写了。
           return JsonData.buildSuccess("注册成功");
        }
        return JsonData.buildError("注册失败");
    }
    @GetMapping("/captcha")
    public JsonData getCaptcha(String userName) throws IOException {
        // 生成随机四位0-9的验证码
        String captcha = generateRandomCaptcha();
        // 将验证码保存在缓存中,用于后续验证。key的名称使用register拼接当前用户名
        String key="registry:"+userName;
        stringRedisTemplate.opsForValue().set(key,captcha,60, TimeUnit.SECONDS);
        return JsonData.buildSuccess(captcha);
    }
    //生成随机数
    private String generateRandomCaptcha() {
        Random random = new Random();
        StringBuilder captcha = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            captcha.append(random.nextInt(10));
        }
        return captcha.toString();
    }
    private boolean validateCaptcha(String userName,String code) {
    //通过当前用户名相应的key来获取存储到redis中的code。来进行校验验证码。
     String codeUserName=stringRedisTemplate.opsForValue().get("registry:"+userName);
        if (code.equals(codeUserName)){
            return true;
        }
        return false;
    }
}

文章浏览量、点赞统计

这里由于篇幅原因,给出了简单的浏览量、点赞量统计的简单逻辑代码。主要实现是通过其increment这个API实现其key对应的值进行自增1,取消点赞则自减1。

//文章浏览量统计
    public JsonData browCount(int userId,int articleId){
        //browCount
        Long browCount=0L;
       browCount=stringRedisTemplate.opsForValue().increment(articleId+":"+userId);
       return JsonData.buildSuccess(browCount);
    }
    //点赞量。
    public JsonData likeCount(int userId,int articleId){
        //likeCount,可以通过文章的getter方法获取当前文章数量
        Long likeCount=0L;
       likeCount=stringRedisTemplate.opsForValue().increment(articleId+":"+userId);
        return JsonData.buildSuccess(likeCount);
    }

存储JSON格式数据

通过Jackson将数据库查询到的对象,转为json格式并存储到redis中。

//存储json格式数据
    public JsonData detail() throws JsonProcessingException {
    //假设数据是从数据库查询而来,将其存入到redis中
        User user=new User(1,"username","123456");
        ObjectMapper objectMapper=new ObjectMapper();
        String userJson=objectMapper.writeValueAsString(user);
        stringRedisTemplate.opsForValue().set(user.getId()+":"+"userInfo",userJson);
        return JsonData.buildSuccess();
    }

🌟写在最后

有关于String数据类型实战场景到此就结束了。功能演示代码的逻辑简单,目的是理解String数据类型的应用,实际场景的逻辑根据具体需求而定。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


请添加图片描述

版权声明:

本文为[DaenCode]所创,转载请带上原文链接,感谢

https://blog.csdn.net/2302_79094329/article/details/132327385


评论数 0



留下回复

如果您是个网络喷子或者键盘侠,那么建议您多看少说。