Redis——redis的java客户端+(Jedis和SpringDataRedis)

news2024/11/26 4:30:25

客户端对比

一个Spring Data Redis底层可以兼容前两个

 Jedis快速入门

直接使用命令名作为方法名就是Jedis好学的原因

第一步 :

创建一个maven项目并导入如下依赖,除了redis的以来还有一个junit5的依赖

 <!--redis的依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>5.0.0-alpha2</version>
        </dependency>
        <!--junit5的依赖-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.9.2</version>
            <scope>test</scope>
        </dependency>

第二步:

在测试类中调试,先进行数据库连接,使用到一个注解@BeforeEach,这个方法又junit5提供,可以在每个@Test方法执行前先执行一遍

 @BeforeEach
    void setup(){
        //1.建立连接,端口号默认为6379,不过我是容器部署,要看你具体映射到外面哪个端口号
        jedis=new Jedis("XXX.XX.XXX.XXX",6379);
        //2.设置密码
        jedis.auth("XXXXXX");
        //3.选择库
        jedis.select(X);
    }

第三步:

进行增加数据并查询数据测试,使用到junit5提供的@Test注解

    @Test
    void test(){
        //存入数据
        String result=jedis.set("name","yhy");
        System.out.println("result:"+result);
        //获取并打印数据
        System.out.println(jedis.get("name"));


        //存入hash数据
        jedis.hset("user:1","name","yhy");
        jedis.hset("user:1","age","21");
        //获取hash数据,这里默认封装成了map类型
        Map<String,String> mp=jedis.hgetAll("user:1");
       String str=jedis.hget("user:1","age");
        System.out.println(mp);
        System.out.println(str);
    }

第三步:

关闭数据库连接,使用到@AfterEach注解,可以在所有@Test方法执行后执行

 @AfterEach
    void tearDown(){
        if(jedis!=null){
            jedis.close();
        }
    }

运行测试成功如下

让我回想起初学jdbc的日子

 Jedis的连接池

 第一步:创建一个连接池配置类

这里将其作为静态全局变量,使用静态代码块进行初始化

public class JedisConnectionFactory {
    private static final JedisPool jedisPool;
    static{
        //配置连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        //最大连接数
        jedisPoolConfig.setMaxTotal(8);
        //最大空闲连接
        jedisPoolConfig.setMaxIdle(8);
        //最小空闲连接
        jedisPoolConfig.setMinIdle(0);
        //最长等待时间
        jedisPoolConfig.setMaxWaitMillis(1000);
        //创建连接池对象
        jedisPool=new JedisPool(jedisPoolConfig,
                "xxx.xx.xxx.xxx",6379,1000,"xxxx");
    }
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

 第二步:从线程池获取连接

就只是在上面那个的初始化代码里面改了改而已

    @BeforeEach
    void setup(){
        //1.建立连接
        jedis= JedisConnectionFactory.getJedis();
        //2.选择库,如果不选,默认选择0库
        jedis.select(0)
    }

成功运行输出 

 

认识SpringDataRedis

springdata封装了对许多数据库操作的模块,而SpringDataRedis底层就整合了lettuce和jedis客户端

redis底层存的都是字符串或者字节数组,所以存数据时需要手动转换成字符串或者字节数组。

然后 springdataredis就支持数据序列化和反序列化。

SpringDataRedis快速入门

第一步:创建一个springboot项目并导入相关依赖

这里创建的是psingboot2.x版本,jdk用的8,然后添加下面两个依赖 

然后再增加一个连接池依赖

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

第二步:在配置文件配置连接信息

 在这里配置连接池时有两个选项,一个是jedis一个是lettuce,默认选择lettuce-core,选jedis的话还需要添加jedis连接池的依赖。

spring:
  redis:
    host: xxx.xx.xxx.xxx
    port: 6379
    password: xxxxxx
    database: 0
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 100ms
        

第三步:在测试类中调试运行

@SpringBootTest
class SdrDemo1ApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;


    @Test
    void testString() {
        //写入一条String数据
        redisTemplate.opsForValue().set("name","北岭山脚鼠鼠");
        //获取String数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name="+name);
    }

}

输出如下

虽然但是,在图形化界面却看见没有修改成功,但是获取时确实获取了正确数据。

在图形化界面可以看见有两个name的key

 

 实际上这一长串的\xAC\xED\x00\x05t\x00\x12\xE5\x8C\x97\xE5\xB2\xAD\xE5\xB1\xB1\xE8\x84\x9A\xE9\xBC\xA0\xE9\xBC\xA0

就是上面修改的北岭山脚鼠鼠。

原因是set方法应该接受的是一个object,而不是一个字符串。springdataRedis的一个功能就是接受任何类型的对象,然后转成redis可以处理的字节。

传进去的字符串都被用序列化工具处理了。

如下针对的不同的数据类型有不同的序列化方法处理 

 

 在源码底层有这么一个处理,将对象转换成流 

 这样有一个更大的缺陷,用的java客户端存时,如果用别的客户端取出来时没有反序列化工具转换回去的话别人就无法使用这些数据。

 故这里不能使用RedisTemplate默认的序列化方法了

故查看提供的别的一些方法有如下两个可以使用

 一个是StringRedisSerializer,直接就是getBytes(),在key和hashkey都是字符串的情况下使用,string序列化类型。

在value有可能是对象时使用GenericJack2JsonRedisSerializer,转json序列化类型

 修改序列化方式

 还需要引入一个jackson的依赖,如果是有引入了springmvc的话就会带有这个依赖了

        <!--Jackson依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.2</version>
        </dependency>

 在配置类注册一个Bean对象如下,然后就可以注册到IOC容器实现自动装配了

@Configuration
public class RedisConfig {
    //连接工厂由spring自动创建并注入进来
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        //设置JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        //返回
        return template;
    }
}

然后修改上面测试类中的代码,指定参数类型

@SpringBootTest
class SdrDemo1ApplicationTests {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;


    @Test
    void testString() {
        //写入一条String数据
        redisTemplate.opsForValue().set("name","北岭山脚鼠鼠");
        //获取String数据
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name="+name);
    }

}

运行测试输出 

 这一次成功修改。

对象的序列化

在pojo层添加一个实体类

@Data 
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String User;
    private Integer age;
}

新增测试方法

    @Test
    void testOUser(){
        //写入数据
        redisTemplate.opsForValue().set("user:100",new User("yhy",21));
        //获取数据并强转数据
        User user = (User) redisTemplate.opsForValue().get("user:100");
        System.out.println("user:"+user);
    }

控制台输出如下 

 图形化界面查看有如下json风格的结果,获取结果的自动化反序列成上面的User对象,正是因为有"@class": "com.example.pojo.User",这个属性,在反序列时才能读取到User类并自动反序列化.

反射创建对象,设置属性值。

springRedisTemplate 

多出的字节码会导致内存空间占用大。

因此不会使用json的序列化器处理value,而是统一使用string的序列化器处理value。

string的序列化器要求只能处理字符串。

spring提供了一个springRedisTemplate ,其中key和value的序列化方式吗,默认就是string序列化方式。

但是对象还是要我们手动转成json字符串,这里有两个选择,一个是用fast json,要自己导依赖一个是使用ObjectMapper,这个是json里面默认提供的json序列化处理工具。

代码修改如下。

将来可以封装成一个工具类进行处理。

@SpringBootTest
class SdrDemo1ApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final ObjectMapper mapper=new ObjectMapper();

    @Test
    void testString() {
        //写入一条String数据
        stringRedisTemplate.opsForValue().set("name","北岭山脚鼠鼠");
        //获取String数据
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println("name="+name);
    }
    @Test
    void testOUser() throws JsonProcessingException {
        //创建对象
        User user=new User("yhy",21);
        //手动序列化
        String json = mapper.writeValueAsString(user);
        //写入数据
        stringRedisTemplate.opsForValue().set("user:100",json);
        //获取数据并强转数据
       String jsonUser=stringRedisTemplate.opsForValue().get("user:100");
       //手动反序列化,需要提供实体类的字节码
        User user1=mapper.readValue(jsonUser,User.class);
        System.out.println("user:"+user1);
    }
}

 控制台和图形化界面都没问题,没有多余的字节码存入数据库了。

 小结

补充

RedisTemplate类型处理Hash类型 

@SpringBootTest
class SdrDemo1ApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void TestHash(){
        Map<String,String> map=new HashMap<>();
        map.put("weight","140");
        map.put("high","172");
        //存入数据,可以一个个存,也可以直接存个map
        stringRedisTemplate.opsForHash().put("user:200","name","北岭山脚鼠鼠");
        stringRedisTemplate.opsForHash().put("user:200","age","22");
        stringRedisTemplate.opsForHash().putAll("user:200",map);

        //取出对象,可以取一个,也可以取多个
        stringRedisTemplate.opsForHash().get("user:200","name");
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:200");
        System.out.println("entries="+entries);
    }

}

 输出如下

 

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

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

相关文章

如何使用3D转换工具HOOPS Exchange与LibConverter进行流缓存导出?

如果您正在使用HOOPS Communicator&#xff0c;您可能想在生成流缓存模型之前利用HOOPS Exchange的高级功能和转换选项。 申请HOOPS试用 HOOPS中文网 如何使用 如您所知&#xff0c;LibConverter是HOOPS Communicator软件包中包含的一个简单的API&#xff0c;conver…

【GeoDa实用技巧100例】003:GeoDa连接并打开多种格式的数据源

GeoDa支持 shapefile、地理数据库、GeoJSON、MapInfo、GML、KML 以及 GDAL 库支持的其他矢量数据格式。该程序还将表格格式&#xff08;.csv、.dbf、.xls、.ods&#xff09;中的坐标转换为这些空间数据格式之一&#xff0c;并在不同文件格式之间转换数据。 文章目录 一、连接文…

深入了解 CSS 变量,让 CSS 创造更多可能!

日常开发中所说的 CSS 变量&#xff0c;实际上是 CSS 的变量函数 var() 与 CSS 自定义属性的统称。 CSS 变量带来的提升: 使得开发和维护成本更低了&#xff0c;如让整个网站的换肤变得更容易&#xff1b;改变了在图形交互效果的实现中 JavaScript 的占据比重&#xff0c;使得…

EasyUI Pagination 分页的两种做法小结

EasyUI Pagination 分页的两种做法小结 EasyUI 的 datagrid 支持服务器端分页&#xff0c;但是官方的资料比较少&#xff0c;以下总结了两种 datagrid 的服务器端分页机制&#xff0c;一种是datagrid默认机制&#xff0c;另一种是利用 Ajax 获取数据并填充 Datagrid&#xff0c…

矩形面积 (力扣)数学推理 JAVA

给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形&#xff0c;请你计算并返回两个矩形覆盖的总面积。 每个矩形由其 左下 顶点和 右上 顶点坐标表示&#xff1a; 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。 第二个矩形由其左下顶点 (bx1, b…

系统驱动作业

作业1 myled_time.c #include <linux/init.h> #include <linux/module.h> #include<linux/of.h> #include<linux/gpio.h> #include<linux/of_gpio.h> #include<linux/timer.h>struct device_node *dnode; unsigned int gpiono; struct t…

Redis — 不仅仅是缓存

1*qIy3PMmEWNcD9Czh_21C8g.png Redis是一种快速、开源的内存键值&#xff08;NoSQL&#xff09;数据库&#xff0c;远远超越了缓存的功能。Redis使用RAM进行操作&#xff0c;提供亚毫秒级的响应时间&#xff0c;支持每秒数百万次请求。Redis主要用于缓存&#xff0c;但它也可以…

【CSS】文字渐变色

CSS设置文字渐变色 background-image: -webkit-linear-gradient(bottom,red,#fd8403,yellow); -webkit-background-clip: text; // 设置背景作用域 -webkit-text-fill-color: transparent;

docker数据卷权限管理--理论和验证

一、Docker容器中用户权限管理 Linux系统的权限管理是由uid和gid负责&#xff0c;Linux系统会检查创建进程的uid和gid&#xff0c;以确定它是否有足够的权限修改文件&#xff0c;而非是通过用户名和用户组来确认。 同样&#xff0c;在docker容器中主机上运行的所有容器共享同一…

【DC系列06】DC-6靶机复盘

【DC系列06】DC-6靶机复盘 我们打开这个靶机后首先还是先对靶机进行一个ip扫描&#xff0c;然后再单独对这个ip进行一个全局扫描。 扫描后ip地址是192.168.102.147。 我们再单独扫描一下 nmap -A 192.168.102.147 -p-这个靶机有一个特点就是扫描到ip后&#xff0c;你需要往…

vulnhub靶机渗透:PWNLAB: INIT

PWNLAB: INIT 靶机环境介绍nmap扫描端口扫描服务扫描漏洞扫描扫描总结 80端口目录爆破LFI利用 3306端口回到80端口文件上传 获得立足点横向移动提权总结参考 靶机环境介绍 https://www.vulnhub.com/entry/skytower-1,96/ 靶机IP&#xff1a;192.168.56.103 kali IP&#xff…

OceanBase 特殊的 INT 与时间类型隐式转换问题

本文作者分享了Oceanbase时间与数值类型隐式转换导致查询结果不符合预期或“不正确”问题的排查思路。 作者&#xff1a;任仲禹 爱可生 DBA 团队成员&#xff0c;擅长故障分析和性能优化&#xff0c;文章相关技术问题&#xff0c;欢迎大家一起讨论。 本文来源&#xff1a;原创投…

create-react-app -V 报错无法将“create-react-app”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

create-react-app -Vcreate-react-app : 无法将“create-react-app”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果 包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 + create-react-app -V + ~~~~~~~~~~~~~~~~+ CategoryInfo …

移动端 van-datetime-picker 组件不支持选择秒,自己写组件支持选择 “年月日时分秒”

需求 使用 van-datetime-picker 组件写时间选择时&#xff0c;不支持选择 “秒” 要求能够选择精确到秒 代码 封装组件 TimePicker <template><div><!-- 弹出层 --><van-popup get-container"body" v-model"isPicker" position&qu…

实时数仓-DWS层

理论依据&#xff1a;指标体系 如果表有相似&#xff0c;可以抽取成一张表 轻度聚合&#xff1a;比如聚合10秒的先放到DWS&#xff0c;这样ADS在计算的时候&#xff0c;会更快

计讯物联5G工业路由器加速赋能公交车监控系统解决方案智能升级

一、方案概述 为提升公交车智能化管理水平为目的&#xff0c;保障公交车营运人员和乘客的安全&#xff0c;计讯物联以公交车智能调度营运为核心&#xff0c;推出计讯物联5G公交车一站式解决方案&#xff0c;通过构建感知层、传输层、设备层、应用层四层架构&#xff0c;通过感…

将名为“普通高等学校本科专业目录.pdf”的pdf文件转换成csv文件

文章目录 任务描述2023年普通高等学校本科专业目录pdf链接代码代码解析运行截图 任务描述 将名为“普通高等学校本科专业目录.pdf”的pdf文件转换成csv文件。这个pdf每页是个表格&#xff0c;表格有7列。 下面是pdf的第一页和第二页&#xff1a; 2023年普通高等学校本科专业…

10.3.2 【Linux】历史命令:history

[dmtsaistudy ~]$ alias hhistory 在正常的情况下&#xff0c;历史命令的读取与记录是这样的&#xff1a; 当我们以 bash 登陆 Linux 主机之后&#xff0c;系统会主动的由主文件夹的 ~/.bash_history 读取以前曾经下过的指令&#xff0c;那么 ~/.bash_history 会记录几笔数据呢…

microblaze生成download.bit 报错:Program FPGA failed Reason: couldn‘t open......

报错信息&#xff1a; couldn’t open “E:/Xilinx_Project/……/……/…….sdk/top_wrapper_hw_platform_0/download.bit”: no such file or directory [Updatemem 57-153] Failed to update the BRAM INIT strings for E:\Xilinx_Project\……\……\…….sdk\……\Debug\……

基于vue的地方美食分享网站(spring boot)

本项目在开发和设计过程中涉及到原理和技术有&#xff1a;B/S、java技术和MySQL数据库等等。开发步骤如下&#xff1a; 绪论&#xff1b;剖析项目背景&#xff0c;说明研究的内容。 开发技术&#xff1b;系统主要使用了java技术&#xff0c;b/s模式和myspl数据库.