🧑💻作者名称: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数据类型的应用,实际场景的逻辑根据具体需求而定。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。