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