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

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 【Redis从头学-4】Redis中的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中的应用场景。


测试效果


测试描述:首先通过获取验证码接口,获取验证码;之后通过注册接口将用户名、密码、以及输入的验证码输入来验证注册功能。


生成验证码:


2cc3263fb299d2f51e693af2edc04f79_8ca9f23cccd4428ba1b4e1a784764bfb.png


redis存储查看


7c6677b4a38f2efd96f6380d07b6aa78_a4ee827ac6cd45e7a69207ea064dba06.png


进行注册


52f2bb0001d001bfb8d02ef3a7def02e_55681dd6f2f44fc4b42aa238248cdb52.png


场景代码


场景:


  • 用户在前台输入用户名、密码
  • 点击获取验证码按钮,获取验证码(经过以下代码中的/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数据类型的应用,实际场景的逻辑根据具体需求而定。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
14天前
|
缓存 NoSQL Java
Java高并发实战:利用线程池和Redis实现高效数据入库
Java高并发实战:利用线程池和Redis实现高效数据入库
34 0
|
20天前
|
消息中间件 缓存 NoSQL
day40--Redis(二)实战篇
day40--Redis(二)实战篇
14 2
|
25天前
|
机器学习/深度学习 XML NoSQL
【Redis】 String 字符串类型常见命令
【Redis】 String 字符串类型常见命令
|
1月前
|
Java Redis
redis-学习笔记(Jedis string 简单命令)
redis-学习笔记(Jedis string 简单命令)
27 2
|
25天前
|
存储 缓存 负载均衡
【Redis】 String类型的内部编码与使用环境
【Redis】 String类型的内部编码与使用环境
|
1月前
|
存储 NoSQL Java
redis-学习笔记(string)
redis-学习笔记(string)
25 0
|
存储 缓存 NoSQL
DB,Cache和Redis应用场景分析
最近做一产品,微博方面的。数据存储同时用到了DB(mysql),Cache(memcache),Redis。其实最开始架构设计的时候是准备用MongoDB的,由于学习成本太高,最终选择放弃了,采用了比较保守的方案。
1139 0
|
12天前
|
存储 运维 NoSQL
Redis Cluster集群模式部署
Redis Cluster集群模式部署
38 4
|
14天前
|
监控 NoSQL 算法
手把手教你如何搭建redis集群(二)
手把手教你如何搭建redis集群(二)
25 1
|
14天前
|
存储 NoSQL 容灾
手把手教你如何搭建redis集群(一)
手把手教你如何搭建redis集群(一)
31 1