码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Redis】五种数据String,List,Hash,Set,Zset类型的缓存操作分享


    14天阅读挑战赛
    努力是为了不平庸~

    String类型的缓存操作:

    缓存思路:

    首先根据对应的key值去redis中获取String类型的缓存数据;

    将获取到的String类型的数据加以判断,如果存在数据则使用JSON.parseArray()转换成对应的集合数据,直接返回给前端处理;

    如果不存在对应的数据,则查询数据库获取数据集合,再将查到的数据使用;JSONUtil.toJsonStr()缓存到Redis中。并将获取到的数据集合返回给客户端进行处理。

    1. public Result queryTypeList() {
    2. //1.根据Key值获取Redis中的缓存值
    3. String s = stringRedisTemplate.opsForValue().get("shop::Type");
    4. log.info("中Redis中获取到的数据是"+s);
    5. //2.判断是否有值,有值则返回
    6. if (!StringUtil.isNullOrEmpty(s)) {
    7. List shopTypeList = JSON.parseArray(s, ShopType.class);
    8. return Result.ok(shopTypeList);
    9. }
    10. //3.没有值则查询数据库
    11. QueryWrapper queryWrapper = new QueryWrapper();
    12. queryWrapper.orderByAsc("sort");
    13. List shopTypeList = shopTypeMapper.selectList(queryWrapper);
    14. //4.将查到的数据缓存到redis中
    15. stringRedisTemplate.opsForValue().set("shop::Type", JSONUtil.toJsonStr(shopTypeList));
    16. if (null == shopTypeList){
    17. return Result.fail("数据为空");
    18. }
    19. return Result.ok(shopTypeList);
    20. }

    List数据类型的操作

    缓存思路:

    首先创建一个List类型的集合数据,用于接收数据以及缓存的数据源,

    使用range()方法获取对应的List数据集合

    将数据集合加以判断,是否存在数据,如果存在则创建以实体为泛型的数据集合,并遍历数据,使用JSONUtil.toBean()获取数据集合所需要的实体对象,并且封装到该数据集合中。再将数据返回给客户端处理;

    如果数据不存在则查询数据库,将查询到的数据进行遍历,使用JSONUtil.toJsonStr()方法转换为String类型的json格式并封装进Lsit作为Redis的数据源缓存;

    之后再将从数据库获取到的数据返回给客户端处理。

    1. @Override
    2. public Result queryTypeList() {
    3. List range = new ArrayList<>();
    4. range = stringRedisTemplate.opsForList().range("shop::Type", 0, -1);
    5. log.info("列表数据是"+range);
    6. //如果有值返回
    7. if (null != range && range.size()>0) {
    8. List shopTypeList = new ArrayList<>();
    9. for (String s : range){
    10. ShopType shopType = JSONUtil.toBean(s, ShopType.class);
    11. shopTypeList.add(shopType);
    12. }
    13. return Result.ok(shopTypeList);
    14. }
    15. //缓存为空---查询数据库数据
    16. QueryWrapper queryWrapper = new QueryWrapper();
    17. queryWrapper.orderByAsc("sort");
    18. List shopTypeList = shopTypeMapper.selectList(queryWrapper);
    19. for (ShopType shopType : shopTypeList){
    20. String s = JSONUtil.toJsonStr(shopType);
    21. range.add(s);
    22. }
    23. //缓存到redis中
    24. stringRedisTemplate.opsForList().rightPushAll("shop::Type",range);
    25. if (null == shopTypeList){
    26. return Result.fail("数据为空");
    27. }
    28. return Result.ok(shopTypeList);
    29. }

    hash的数据类型操作:

    缓存思路:

    首先通过opsForHash().entries().values()获取Collection的集合对象,并判断数据是否存在。如果存在则先创建List的集合对象,用于接收Collection集合对象遍历所得到的数据,并返回给客户端;

    如果不存在则查询数据库,并遍历缓存到redis中,并将数据返回给客户端

    1. public Result queryTypeList() {
    2. //1.根据Key值获取Redis中的缓存值
    3. Collection shopTypes = stringRedisTemplate.opsForHash().entries("shop::type::hash").values();
    4. log.info("中Redis中获取到的数据是" + shopTypes);
    5. //2.判断是否有值,有值则返回
    6. if (!shopTypes.isEmpty()) {
    7. List shopTypeList = new ArrayList<>();
    8. shopTypes.forEach(a -> shopTypeList.add(JSONObject.parseObject(a.toString(), ShopType.class)));
    9. return Result.ok(shopTypeList);
    10. }
    11. //3.没有值则查询数据库
    12. QueryWrapper queryWrapper = new QueryWrapper();
    13. queryWrapper.orderByAsc("sort");
    14. List shopTypeList = shopTypeMapper.selectList(queryWrapper);
    15. //4.将查到的数据缓存到redis中
    16. shopTypeList.forEach(shopType -> stringRedisTemplate.opsForHash().put("shop::type::hash",shopType.getId().toString(),JSONObject.toJSONString(shopType)));
    17. if (null == shopTypeList) {
    18. return Result.fail("数据为空");
    19. }
    20. return Result.ok(shopTypeList);
    21. }
    22. Set数据类型的缓存操作:
      缓存思路:

      首先通过members()方法根据key获取到set集合数据,如果数据存在,先创建List shopTypeList用于封装数据返回给客户端,循环获取到的数据封装进该集合中,如果数据不存在则从数据库中获取数据,之后循环遍历通过opsForSet().add();方法放入缓存中,再将源数据返回给客户端。

      1. public Result queryTypeList() {
      2. //1.根据Key值获取Redis中的缓存值
      3. Set members = stringRedisTemplate.opsForSet().members("shop::type::set");
      4. log.info("中Redis中获取到的数据是" + members);
      5. //2.判断是否有值,有值则返回
      6. if (!members.isEmpty()) {
      7. List shopTypeList = new ArrayList<>();
      8. members.forEach(a -> shopTypeList.add(JSONUtil.toBean(a, ShopType.class)));
      9. return Result.ok(shopTypeList);
      10. }
      11. //3.没有值则查询数据库
      12. QueryWrapper queryWrapper = new QueryWrapper();
      13. queryWrapper.orderByAsc("sort");
      14. List shopTypeListDate = shopTypeMapper.selectList(queryWrapper);
      15. //4.将查到的数据缓存到redis中
      16. shopTypeListDate.forEach(shopType -> stringRedisTemplate.opsForSet().add("shop::type::set",JSONUtil.toJsonStr(shopType)));
      17. if (null == shopTypeListDate) {
      18. return Result.fail("数据为空");
      19. }
      20. return Result.ok(shopTypeListDate);
      21. }

      zset数据类型的缓存操作:
      缓存思路:首先通过range()方法根据key获取到set集合数据,如果数据存在,先创建List shopTypeList用于封装数据返回给客户端,循环获取到的数据封装进该集合中,如果数据不存在则从数据库中获取数据,之后循环遍历通过opsForZSet() .add();方法放入缓存中,再将源数据返回给客户端。

      1. @Override
      2. public Result queryTypeList() {
      3. //1.根据Key值获取Redis中的缓存值
      4. Set range = stringRedisTemplate.opsForZSet().range("shop::type::zet", 0, -1);
      5. log.info("中Redis中获取到的数据是" + range);
      6. //2.判断是否有值,有值则返回
      7. if (!range.isEmpty()) {
      8. List shopTypeList = new ArrayList<>();
      9. range.forEach(a -> shopTypeList.add(JSONUtil.toBean(a, ShopType.class)));
      10. return Result.ok(shopTypeList);
      11. }
      12. //3.没有值则查询数据库
      13. QueryWrapper queryWrapper = new QueryWrapper();
      14. queryWrapper.orderByAsc("sort");
      15. List shopTypeListDate = shopTypeMapper.selectList(queryWrapper);
      16. //4.将查到的数据缓存到redis中
      17. shopTypeListDate.forEach(shopType -> stringRedisTemplate.opsForZSet().add("shop::type::zet",JSONUtil.toJsonStr(shopType),shopType.getSort()));
      18. if (null == shopTypeListDate) {
      19. return Result.fail("数据为空");
      20. }
      21. return Result.ok(shopTypeListDate);
      22. }

    23. 相关阅读:
      HMS Core Discovery第17期直播预告|音随我动,秒变音色造型师
      常见的实时操作系统(RTOS)(嵌入式和物联网操作系统)介绍
      并发编程系列 - ReadWriteLock
      【Linux】线程池&读写锁
      Java手写HashMap及拓展实践
      个人博客系统(附源码)
      第二十届北京消防展即将开启,汉威科技即将精彩亮相
      Linux 设备驱动模型platform==Linux驱动开发5
      Hadoop 3.x(MapReduce)----【Hadoop 数据压缩】
      php中explode函数存在的陷阱
    24. 原文地址:https://blog.csdn.net/ggjklncffd/article/details/127606946
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号