【Redis】 String类型的内部编码与使用环境

【Redis】 String类型的内部编码与使用环境

码农世界 2024-05-27 前端 76 次浏览 0个评论

文章目录

  • 🍃前言
  • 🌴内部编码
  • 🎄典型使用场景
    • 🚩缓存功能
    • 🚩计数(Counter)功能
    • 🚩共享会话(Session)
    • 🚩验证码功能
    • ⭕总结

      🍃前言

      本篇文章重点内容如下:

      1. 了解String类型的三种内部编码
      2. 了解String类型的典型使用环境

      🌴内部编码

      虽然我们使用的是 String 类型的数据,但是Redis底层是如何存储的呢?

      起始 Reids 对字符串类型的有三种内部编码方式:

      • int:8 个字节的⻓整型。
      • embstr:⼩于等于 39 个字节的字符串。
      • raw:⼤于39 个字节的字符串。

        🎄典型使用场景

        🚩缓存功能

        缓存功能是⽐较典型的缓存使⽤场景,其中 Redis 作为缓冲层,MySQL 作为存储层,绝⼤部分请求的数据都是从 Redis 中获取。由于 Redis 具有⽀撑⾼并发的特性,所以缓存通常能起到加速读写和降低后端压⼒的作⽤

        🚩计数(Counter)功能

        许多应⽤都会使⽤ Redis 作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。

        例如视频⽹站的视频播放次数可以使⽤ Redis 来完成:⽤⼾每播放⼀次视频,相应的视频播放数就会⾃增 1。

        🚩共享会话(Session)

        ⼀个分布式 Web 服务将⽤⼾的 Session 信息(例如⽤⼾登录信息)保存在各⾃的服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将⽤⼾的访问请求均衡到不同的服务器上,并且通常⽆法保证⽤⼾每次请求都会被均衡到同⼀台服务器上,这样当⽤⼾刷新⼀次访问是可能会发现需要重新登录,这个问题是⽤⼾⽆法容忍的。

        为了解决这个问题,可以使⽤ Redis 将⽤⼾的 Session 信息进⾏集中管理,在这种模式下,只要保证 Redis 是⾼可⽤和可扩展性的,⽆论⽤⼾被均衡到哪台Web 服务器上,都集中从 Redis 中查询、更新 Session 信息。

        🚩验证码功能

        很多应⽤出于安全考虑,会在每次进⾏登录时,让⽤⼾输⼊⼿机号并且配合给⼿机发送验证码,然后让⽤⼾再次输⼊收到的验证码并进⾏验证,从⽽确定是否是⽤⼾本⼈。为了短信接⼝不会频繁访问,会限制⽤⼾每分钟获取验证码的频率,例如⼀分钟不能超过 5 次。此功能也可使用Redis来进行实现

        伪代码实现如下:

        String 发送验证码(phoneNumber) {
            key = "shortMsg:limit:" + phoneNumber;
            // 设置过期时间为 1 分钟(60 秒)
            // 使⽤ NX,只在不存在 key 时才能设置成功
            bool r = Redis 执⾏命令:set key 1 ex 60 nx
            if (r == false) {
                // 说明之前设置过该⼿机的验证码了
                long c = Redis 执⾏命令:incr key
                if (c > 5) {
                    // 说明超过了⼀分钟 5 次的限制了
                    // 限制发送
                    return null;
                }
            }
            // 说明要么之前没有设置过⼿机的验证码;要么次数没有超过 5 次
            String validationCode = ⽣成随机的 6 位数的验证码();
            validationKey = "validation:" + phoneNumber;
            // 验证码 5 分钟(300 秒)内有效
            Redis 执⾏命令:set validationKey validationCode ex 300;
            // 返回验证码,随后通过⼿机短信发送给⽤⼾
            return validationCode ;
        }
        // 验证⽤⼾输⼊的验证码是否正确
        bool 验证验证码(phoneNumber, validationCode) {
            validationKey = "validation:" + phoneNumber;
            String value = Redis 执⾏命令:get validationKey;
            if (value == null) {
                // 说明没有这个⼿机的验证码记录,验证失败
                return false;
            }
            if (value == validationCode) {
                return true;
            } else {
                return false;
            }
        }
        

        ⭕总结

        关于《【Redis】 String类型的内部编码与使用环境》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

转载请注明来自码农世界,本文标题:《【Redis】 String类型的内部编码与使用环境》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,76人围观)参与讨论

还没有评论,来说两句吧...

Top