Java与SpringBoot对redis的使用方式

news2024/12/23 9:38:17

目录

  • 1.Java连接redis
    • 1.1 使用Jedis
    • 1.2 使用连接池连接redis
    • 1.3 java连接redis集群模式
  •  2.SpringBoot整合redis
    • 2.1 StringRedisTemplate
    • 2.2 RedisTemplate

1.Java连接redis

redis支持哪些语言可以操作 (去redis官网查询)

 

 

1.1 使用Jedis

 (1)添加jedis依赖

?

1

2

3

4

5

6

7

8

9

10

11

12

<dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.12</version>

            <!--只能在测试类中使用-->

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>redis.clients</groupId>

            <artifactId>jedis</artifactId>

            <version>3.6.0</version>

        </dependency>

(2)代码测试

?

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

public class TestJedis {

    @Test

    public void test01(){

        //连接redis--必须保证你的redis服务运行远程连接

        //该对象把每个redis命令封装成对应的方法

        //注意端口号

        //xshell中的redis要运行起来,注意防火墙释放端口号,注意配置文件的修改

        Jedis jedis=new Jedis("192.168.1.16",6379);

        //对于字符串操作的命令

        String set = jedis.set("k1", "v1");

        System.out.println(set);

        String set1 = jedis.set("k2", "v2");

        System.out.println(set1);

        String set2 = jedis.set("k3", "v3");

        System.out.println(set2);

        //对于hash的操作

        jedis.hset("k4","name","小花");

        Long hset = jedis.hset("k4", "age", "18");

        System.out.println(hset);

       Map<String ,String> map=new HashMap<>();

        map.put("name","小明");

        map.put("age","20");

        Long k = jedis.hset("k5", map);

        System.out.println(k);

        jedis.close();

    }

}

1.2 使用连接池连接redis

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

@Test

   public void test02(){

       //创建连接池的配置类

       JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();

       jedisPoolConfig.setMaxIdle(20);

       jedisPoolConfig.setMinIdle(5);

       jedisPoolConfig.setMaxWait(Duration.ofMillis(3000));

       JedisPool jedisPool=new JedisPool(jedisPoolConfig,"192.168.1.16",6379);

       long start = System.currentTimeMillis();

       for (int i = 0; i < 1000; i++) {

           //从jedis连接池获取资源

           Jedis jedis=jedisPool.getResource();

           String ping = jedis.ping();

           jedis.close();//是否关闭池子

       }

       long end=System.currentTimeMillis();

       //是为了比较使用池子还是不使用快,结论是使用池子快

       System.out.println("总耗时:"+(end-start));

   }

1.3 java连接redis集群模式

连接集群时要保证集群里面没有存值, 要是存值需要删除之前生成的文件(注意删除干净)

还有就是放行对应的端口:6001、6002、6003、6004、6005、6006,因为之前放行的实在10000端口,注意以上两点,才可以使用idea创建成功。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

@Test

    public void test03(){

      Set<HostAndPort> nodes=new HashSet<>();

      nodes.add(new HostAndPort("192.168.227.175",6001));

      nodes.add(new HostAndPort("192.168.227.175",6002));

      nodes.add(new HostAndPort("192.168.227.175",6003));

      nodes.add(new HostAndPort("192.168.227.175",6004));

      nodes.add(new HostAndPort("192.168.227.175",6005));

      nodes.add(new HostAndPort("192.168.227.175",6006));

        JedisCluster jedisCluster=new JedisCluster(nodes);

      jedisCluster.set("k6", "小老虎和小兔子");

        jedisCluster.close();

    }

 

 2.SpringBoot整合redis

springboot对redis的操作封装了两个StringRedisTemplate和RedisTemplate类,StringRedisTemplate是RedisTemplate的子类,StringRedisTemplate它只能存储字符串类型,无法存储对象类型。要想用StringRedisTemplate存储对象必须把对象转为json字符串。

springboot整合redis时提供了两个模板工具类,StringRedisTemplate和RedisTemplate。

2.1 StringRedisTemplate

(1) 引入相关的依赖

?

1

2

3

4

<dependency>

         <groupId>org.springframework.boot</groupId>

         <artifactId>spring-boot-starter-data-redis</artifactId>

    </dependency>

(2)注入StringRedisTemplate该类对象

?

1

2

@Autowired

private StringRedisTemplate redisTemplate;

(3)使用StringRedisTemplate

该类把对每种数据类型的操作,单独封了相应的内部类。

此处不会有乱码,因为已经给它序列化方式和反序列化方式换成为String型。

?

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

@Autowired

    private StringRedisTemplate stringRedisTemplate;

 @Test

    public void test01(){

        //对hash类型的操作

        HashOperations<String, Object, Object> forHash = stringRedisTemplate.opsForHash();

        forHash.put("k1","name","张三");

        forHash.put("k1","age","15");

        Map<String,String> map=new HashMap<>();

        map.put("name","李四");

        map.put("age","25");

        forHash.putAll("k36",map);

  

        Object o = forHash.get("k1", "name");

        System.out.println(o);

  

        Set<Object> k1 = forHash.keys("k1");

        System.out.println(k1);

  

        List<Object> k11 = forHash.values("k1");

        System.out.println(k11);

  

        //获取k1对于的所有的field和value

        Map<Object, Object> k12 = forHash.entries("k1");

        System.out.println(k12);

    }

    @Test

    void contextLoads() {

        //删除指定的key

       // stringRedisTemplate.delete("k");

        //查看所有的key

        //stringRedisTemplate.keys("k");

        //是否存在指定的key

        //stringRedisTemplate.hasKey("k");

        //对字符串数据类型的操作ValueOperations

        ValueOperations<String, String> forValue = stringRedisTemplate.opsForValue();

        //存储字符串类型--key value long uint  setex()

        forValue.set("k1","张三",30, TimeUnit.SECONDS);

        //等价于setnx 存入成功返回true ,失败返回false

        Boolean absent = forValue.setIfAbsent("k11", "李四", 30, TimeUnit.SECONDS);

        System.out.println(absent);

        //append拼接

        Integer append = forValue.append("k11", "真好看");

        String k11 = forValue.get("k11");

        System.out.println(k11);

  

    }

2.2 RedisTemplate

此处会有乱码,因为它序列化方式和反序列化方式默认为JDK。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

@SpringBootTest

class SbredisApplicationTests02 {

    //当你存储的value类型为对象类型使用redisTemplate

    //存储的value类型为字符串。StringRedisTemplate 验证码

    @Autowired

    private RedisTemplate redisTemplate;

  

    @Test

    public void test01(){

        //必须认为指定序列化方式

        redisTemplate.setKeySerializer(new StringRedisSerializer());

        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));

  

        //对String类型操作类

        ValueOperations forValue = redisTemplate.opsForValue();

        //redis中key和value都变成了乱码

        //key和value都没有指定序列化方式,默认采用jdk的序列化方式

        forValue.set("k1","张三");

  

        //value默认采用jdk,类必须实现序列化接口

        forValue.set("k44",new User(1,"haha",12));

    }

}

上面的RedisTemplate需要每次都指定key value以及field的序列化方式,能不能搞一个配置类,已经为RedisTemplate指定好序列化。以后再用就无需指定。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

@Configuration

public class RedisConfig {

    @Bean

    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Object> template = new RedisTemplate<>();

        RedisSerializer<String> redisSerializer = new StringRedisSerializer();

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(om);

        template.setConnectionFactory(factory);

        //key序列化方式

        template.setKeySerializer(redisSerializer);

        //value序列化

        template.setValueSerializer(jackson2JsonRedisSerializer);

        //value hashmap序列化  filed value

        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        template.setHashKeySerializer(redisSerializer);

        return template;

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML+CSS实训——Day14——项目其他页面的完善

仓库地址&#xff1a;HTML实训 前言 今天我们继续用老师提供的api&#xff0c;完善一些剩余的功能&#xff0c;因为我的git push好像传乱了&#xff0c;所以仓库大家看看最新的就好&#xff0c;最新的一天一定包括前一天所做的内容。 Collect.htmlcss 收藏界面 <!DOCT…

Dijkstra迪杰斯特拉算法求最短路径(C++实现)

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 〇、Dijkstra迪杰斯特拉算法介绍1、Dijkstra算法是什么&#xff1f;2、Dijkstra算法…

低代码工具:jvs-list(列表引擎)2.1.7功能清单及新增功能介绍

在低代码开发平台中&#xff0c;列表页是一个用于显示数据列表的页面。它通常用于展示数据库中的多条记录&#xff0c;并提供搜索、排序和筛选等功能&#xff0c;以方便用户对数据进行查找和浏览。 jvs-list是jvs快速开发平台的列表页的配置引擎&#xff0c;它和普通的crud 具…

Rocky Linux9.的系统中安装MySQL8 实战

前言 Centos7 已经停止维护&#xff0c;学习其他linux系统势在必行&#xff0c;今天我们要探讨的是&#xff1a; 在Rocky linux9的系统上安装MySQL8 文章目录 前言1. 从Appstream中进行安装1.1 更新系统中的所有软件包1.2 安装MySQL1.3 启动并测试1.4 查看MySQL版本 2. 初始化操…

获取地理位置请求免费天气接口

需求&#xff1a;根据地理位置信息去请求免费的天气接口数据&#xff0c;拿到数据后进行展示&#xff0c;这边我用到了俩个key&#xff0c;一个是高德天气的key和心知天气的key&#xff0c;为什么要这么麻烦呢&#xff0c;是因为之前写过一版不需要获取地理位置&#xff0c;直接…

嵌入式系统开发中的常见挑战和困难

当涉及嵌入式系统开发时&#xff0c;可能会遇到以下一些常见的挑战和困难&#xff1a; 复杂的硬件和软件集成&#xff1a;嵌入式系统通常涉及硬件和软件的紧密集成&#xff0c;需要同时理解和处理硬件和软件层面的问题。这种复杂性可能导致调试和故障排除变得更加困难。 有限…

【哈佛积极心理学笔记】第19讲 让爱情天长地久

第19讲 让爱情天长地久 What makes relationship thrive, some characteristic: work hard the fix mindset: “you are so smart, you are so intelligent” the malleable mindset: “you work so hard” Finding mindset: “finding the right partner” (fix) some thin…

PLC领域从业者的工作待遇现状如何?

目前从事可编程逻辑控制器&#xff08;PLC&#xff09;领域的人员在工作待遇方面相对较好。PLC是工业自动化中广泛使用的控制设备&#xff0c;用于监控和控制各种工业过程和机械设备。以下是关于从事PLC的人员工作待遇的一些常见情况和趋势&#xff1a; 薪资水平&#xff1a;P…

【算法与数据结构】242、LeetCode有效的字母异位词

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;题目要求判断两个字符串是否为字母异位词。什么是字母异位词呢&#xff1f;顾名思义&#xff0c;就是字…

深入理解相机硬件抽象层

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、概览二、Camera HIDL 接口三 、Camera Provider 主程序四、Camera HAL3 接口 一、概览 始于谷歌的Treble开源项目&#xff0c;基于接口与实现的分离…

【AUTOSAR】UDS协议的代码分析与解读(二)----ECU诊断协议概述

UDSO诊断服务技术规范 1 范围 本规范规定了增强型诊断需求的诊断服务部分的内容&#xff0c;定义了通用电子系统需遵循的UDS通用执行 规则。 本规范适用于集团x事业部所有平台车型&#xff0c;所有电子控 制单元(ECU) 的诊断需求&#xff0c;均需按此规范执行。 本规范定义的…

Python神经网络编程学习笔记

文章目录 神经网络基本原理线性分类器学习率一个线性分类器的局限性逻辑AND、逻辑OR逻辑XOR 神经元sigmoid function的logistic function(逻辑函数) 多层神经元演示只有两层&#xff0c;每层两个神经元的神经网络的工作矩阵大法(点乘)使用矩阵乘法的三层神经网络示例反向传播误…

AJAX概述

1.1什么是AJAX. Ajax即AsynchronousJavascript And XML&#xff1a;异步数据回调。 使用Ajax技术网页应用能够快速地将更新呈现在用户界面上&#xff0c;不需要重载&#xff08;刷新&#xff09;整个页面【只刷新局部】&#xff0c;这使得程序能够更快地回应用户的操作。、 1…

H5U PLC EtherCAT总线伺服回原(6098H=3)

回原方式35请参看下面文章 汇川H5U PLC通过 EtherCAT总线控制伺服回原_RXXW_Dor的博客-CSDN博客大部分运动控制都会对机械回原点进行大篇幅讲解,也可以看出机械回原点的重要性。常规的回原点方式大概有几十种吧,本文会给出常用回原点的注意事项,和编程推荐写法。如果原点回…

二层和三层交换机到底有啥区别?二者如何切换?

概要 计算机网络中的交换机是用于在局域网&#xff08;LAN&#xff09;中转发数据包的重要设备。其中&#xff0c;二层交换机和三层交换机是两种常见的交换机类型。本文将详细介绍二层交换机和三层交换机的特点、工作原理、各自的优缺点以及在思科、华为、瞻博网络三家厂商如何…

互联网架构师联合总结的 Java 面试攻略,GitHub 标星 30K!

2023 年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套 1000道的 Java 面试手册是行业内各大神联合总结出来的&#xff0c;上传到 Git 上目前 star 数达到了 30K 这套互…

金九银十Java面试八股文汇总(2023最新整理)

前言 这才刚刚进入 6 月&#xff0c;我就看到了许多朋友在焦急的准备“金九银十”跳槽面试&#xff0c;甚至很多即将毕业的大学生都在备战秋招&#xff0c;对于学历还算优秀的大学生来说&#xff0c;这是一次离大厂最近的机会&#xff0c;毕竟是应届毕业生&#xff0c;不会对技…

LatticeXP2深力科 LFXP2-8E-6TN144I 灵活的flexiFLASH架构 应用笔记介绍

LatticeXP2深力科 LFXP2-8E-6TN144I 是一款瞬时上电、安全、小尺寸的FPGA&#xff0c;具有多功能的开发平台,采用flexiFLASH™架构&#xff0c;结合了一个基于FPGA基本结构的 4输入查找表&#xff08;LUT&#xff09;以及用于设计数据片上存储的闪存非易失性单元。flexiFLASH架…

Triton教程 -- 利用Triton部署你自己的模型

Triton教程—利用Triton部署你自己的模型 给定一个经过训练的模型&#xff0c;我如何使用 Triton 推理服务器以最佳配置大规模部署它&#xff1f; 本文档旨在帮助回答这个问题。 对于那些喜欢高级概述的人&#xff0c;下面是大多数用例的通用流程。 对于那些希望直接进入的人…

ceph分布式存储实战

ceph分布式存储实战 分布式存储系统简介 性能与优势对比 虚拟机安装ceph集群 ceph存储系统简介 分布式存储概述 ceph基础 高可用ceph分布式存储系统部署 部署ceph集群 节点管理 ceph使用基础及数据存储案例 PG状态、数据读写流程及存储池操作 mon服务器的高可用: # apt in…