• springboot使用redis


    springboot使用redis

    redis-service.exe : 服务端,启动后不要关闭
    redis-cli.exe : 客户端,访问redis中的数据
    redisclient-win32.x86_64.2.0.jar : redis的图形界面客户端,执行方式是在这个文件的目录执行

    java -jar redisclient-win32.x86_64.2.0.jar
    
    • 1

    或者在这个jar包的目录下点击即可直接执行
    描述
    点击server,点击add,设置端口号就可以访问redis了

    springboot使用redis步骤

    1. 添加依赖
      添加依赖
      redis起步依赖,导入后可以直接使用RedisTemplate
      RedisTemplate实际上使用的是lettuce客户端库

      	
      		org.springframework.boot
      		spring-boot-starter-data-redis
      	
      
      • 1
      • 2
      • 3
      • 4
    2. 在application.properties中配置redis连接

      #指定redis信息 (如 host, ip, password)
      spring.redis.host=localhost
      spring.redis.port=6379
      #没有密码可以不用配置这个
      #spring.redis.password=123456

    3. 使用redisTemplate来访问redis服务器

      import org.springframework.data.redis.core.RedisTemplate;
      import org.springframework.data.redis.core.StringRedisTemplate;
      import org.springframework.data.redis.core.ValueOperations;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.PathVariable;
      import org.springframework.web.bind.annotation.PostMapping;
      import org.springframework.web.bind.annotation.RestController;

      import javax.annotation.Resource;

      @RestController
      public class RedisController {

      /**
       * 需要注入redis模板
       *
       * 对于RedisTemplate的泛型情况,
       * 可以使用
       *       
       *       或者不写泛型
       *
       *  注意,属性的名称必须为redisTemplate,因为按名称注入,框架创建的对象就是这个名字的
       */
      @Resource
      private RedisTemplate redisTemplate;
      
      @Resource
      private StringRedisTemplate stringRedisTemplate;
      
      // 添加数据到redis
      @PostMapping("/redis/addstring")
      public String addToRedis(String name, String value) {
      
          // 操作Redis中的string类型的数据,先获取ValueOperation
          ValueOperations valueOperations = redisTemplate.opsForValue();
      
          // 添加数据到redis
          valueOperations.set(name, value);
          return "向redis添加string类型的数据";
      }
      
      // 从redis获取数据
      @GetMapping("/redis/getk")
      public String getData(String key) {
      
          ValueOperations valueOperations = redisTemplate.opsForValue();
          Object v = valueOperations.get(key);
          return "key是" + key + ",它的值是:" + v;
      }
      
      @PostMapping("/redis/{k}/{v}")
      public String addStringKV(@PathVariable String k,
                                @PathVariable String v) {
      
          // 使用StringRedisTemplate对象
          stringRedisTemplate.opsForValue().set(k,v);
          return "使用StringRedisTemplate对象添加";
      }
      
      @GetMapping("/redis/{k}")
      public String getStringValue(@PathVariable String k) {
      
          // 获取String类型的value
          String v = stringRedisTemplate.opsForValue().get(k);
          return "从redis中通过" + k + "获取到string类型的v=" + v;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53

      }

    redisTemplate对象有好几种,上面代码中给了两种
    一种为RedisTemplate,这种是有泛型的,泛型类型为 或者 或者不添加泛型,当用它来向redis服务器中存入String类型的数据时,会出现乱码

    使用postman
    存入数据
    明明存入成功了,在redis中查询的时候是带有乱码前缀的
    乱码前缀
    乱码
    直接通过"lisi"它的值是可以取出的
    结果
    可见在RedisTemplate在存取中做了手脚.

    当我们使用StringRedisTemplate对象存取String类型的数据时,是没有乱码的


    存

    取
    redis服务器中的数据
    数据
    数据正常展示
    数据

    StringRedisTemplate和RedisTemplate

    上面说到了这两者在存取中的差异

    • StringRedisTemplate : 这个类将key和value都做String处理,使用的是String的序列化,可读性好
    • RedisTemplate : 把key和value经过了序列化,key和value都是序列化的内容,不能直接识别,默认使用的是JDK的序列化,可以修改为其他的序列化

    序列化作用 :
    序列化是将对象转换为可传输字节序列的过程,反序列化是将字节序列还原为原对象的过程.序列化最终的目的是为了对象可以跨平台存储和进行网络的传输

    序列化的方式 :
    序列化只是一种拆装对象的规则,那么这种规则也就多种多样,常见的有JDK(不支持跨语言),json,xml,Hessian等
    我们上面的RedisTemplate类的存储就是JDK方式的

    jdk方式的序列化
    jdk序列化
    java的序列化 : 把java对象转换为byte[],二进制数据
    json序列化 : json序列化功能将对象转换为json格式或者将其转换回对象,如Student对象转换为{“name”:“张三”,“age”:“20”}

    序列化的方式可以改变

        /** 设置RedisTemplate序列化机制
         *  可以设置 key 的序列化,也可以设置 value 的序列化
         *  也可以同时设置
         */
        @PostMapping("/redis/addstr")
        public String addString(String k, String v) {
    
            // 设置RedisTemplate的序列化机制
            // 设置key为string类型的序列化
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            // 设置value的序列化
            redisTemplate.setValueSerializer(new StringRedisSerializer());
    
            redisTemplate.opsForValue().set(k, v);
            return "添加了k和v";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    使用json方式的序列化

    1. 创建实体类,需要实现序列化接口,最好有序列化的UID

      import java.io.Serializable;

      public class Student implements Serializable {

      private static final long serialVersionUID = -7839813688155519106L;
      private Integer id;
      private String name;
      private Integer age;
      
      public Integer getId() {
          return id;
      }
      
      public void setId(Integer id) {
          this.id = id;
      }
      
      public String getName() {
          return name;
      }
      
      public void setName(String name) {
          this.name = name;
      }
      
      public Integer getAge() {
          return age;
      }
      
      public void setAge(Integer age) {
          this.age = age;
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28

      }

    idea生成序列化UID的方式,需要先在setting中开启,如下
    idea可以自动生成序列化版本号
    然后将光标放在类名上,alt+enter
    alt + enter

    1. 在方法中设置序列化方式

      /**
       * 使用json序列化
       */
      @PostMapping("/redis/addjson")
      public String addJson() {
      
          Student student = new Student();
          student.setName("zhangsan");
          student.setAge(20);
          student.setId(1);
      
          // 设置key为string的序列化方式
          redisTemplate.setKeySerializer(new StringRedisSerializer());
          // 设置value为json的序列化方式,json为Student类型的方式组织,所以需要传入Student.class
          redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
          redisTemplate.opsForValue().set("myStudent", student);
          return "存入json类型的数据student";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
    2. 测试访问url
      测试访问url

    3. 在redis服务端检查数据

    检查检查数据果然,数据的value已经以json的方式存入内存中了.

    1. 使用json的方式反序列化将数据取出

      /**
      * 使用json序列化
      */
      @PostMapping(“/redis/addjson”)
      public String addJson() {

          Student student = new Student();
          student.setName("zhangsan");
          student.setAge(20);
          student.setId(1);
      
          // 设置key为string的序列化方式
          redisTemplate.setKeySerializer(new StringRedisSerializer());
          // 设置value为json的序列化方式,json为Student类型的方式组织,所以需要传入Student.class
          redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Student.class));
          redisTemplate.opsForValue().set("myStudent", student);
          return "存入json类型的数据student";
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

    结果
    反序列化的时候必须得指定序列化的方式,要不然不能取出数据
    空指针

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Oracle.xs.dll‘ for module DBD::Oracle: load_file:找不到指定的模块
    【NeurIPS 2020】基于蒙特卡罗树搜索的黑箱优化学习搜索空间划分
    vite3 + vue3 异步加载路由后挂载 APP 实例,生产环境下页面空白问题解决
    C++异步变化:libunifex实现!
    WordPress丸子小程序问题常见解决方案
    git进阶
    【配电网故障定位】基于二进制混合灰狼粒子群算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#79】
    Day13:vw 和 vh 基本使用
    深度思考计算机网络面经之三
    工程化面试题汇总
  • 原文地址:https://blog.csdn.net/m0_67401055/article/details/126114425