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

文章目录
- 🌟前言
- 🌟String数据类型分析
- 🌟String类型实战应用场景
- 验证码存储功能
- 场景描述
- 测试效果
- 场景代码
 
- 文章浏览量、点赞统计
- 存储JSON格式数据
 
- 🌟写在最后
🌟前言
之前的篇章对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数据类型的应用,实际场景的逻辑根据具体需求而定。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。




















