🍃前言
本篇文章重点内容如下:
- 了解String类型的三种内部编码
- 了解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类型的内部编码与使用环境》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下