redis的客户端

news2024/11/28 2:40:47

关系型数据库存储在磁盘当中,非关系型数据库存储在内存中 

Jedis

第一步:导入依赖包

    <dependencies>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.7.0</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.7.0</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
        </dependency>
    </dependencies>

第二步:建立连接

private Jedis jedis;

    @BeforeEach
    void setUp(){
        //建立连接
        jedis=new Jedis("localhost",6379);
        //设置密码(window端我没有设置密码)
        //jedis.auth("123456");
        //选择库
        jedis.select(0);
    }

第三步:操作库

@Test
    void testString(){
        //插入数据
        String result = jedis.set("name", "张三");
        System.out.println("result="+result);
        //获取数据
        String name = jedis.get("name");
        System.out.println("name="+name);
    }

第四步:关闭资源

@AfterEach
    void tearDown(){
        //释放资源
        if (jedis!=null){
            jedis.close();
        }
    }

 jedis本身线程不安全,频繁的创建和销毁连接是有性能损耗的,推荐使用Jedis连接池代替Jedis直连方式

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("localhost",6379);
    }

    //获取对象
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

上面第二步中建立连接修改为

        //建立连接
        //jedis=new Jedis("localhost",6379);
        jedis= JedisConnectionFactory.getJedis();

SpringDataRedis  

第一步:引入spring-boot-starter-data-redis依赖

<!--redis依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

		<!--commons-pool依赖-->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
		</dependency>
<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.7</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

 第二步:在application.yaml配置Redis信息,需要把版本号降低为2.5.7

spring:
  redis:
    port: 6379
    lettuce:
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 1000ms
    host: 127.0.0.1

第三步:注入RedisTemplate

@Autowired
    private RedisTemplate redisTemplate;

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

执行成功通过,但是redis数据获取name,并不是胡歌,而是Jack,实际上它存进去了,只不过name被序列化了

 

RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认采用JDK序列化,得到结果如下: 

缺点:可读性差、内存占用较大 

解决方法:定义RedisConfig类

package com.huhu.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        //创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂
        template.setConnectionFactory(connectionFactory);
        //创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        //设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        //返回
        return template;
    }
}
package com.huhu;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class RedisDemoApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

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

}

运行报错原因:没有导入Jackson依赖

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

导入依赖后运行成功,并且之前name的值Jack已经被替代了

StringRedisTemplate 

Java序列化就是指把Java对象转换为字节序列的过程 Java反序列化就是指把字节序列恢复为Java对象的过程。

为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销 

 

Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是string方式 

@Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void testString() {
        //写入一条String数据
        stringRedisTemplate.opsForValue().set("name", "胡歌");
        //获取String数据
        Object name = stringRedisTemplate.opsForValue().get("name");
        System.out.println("name=" + name);
    }

 

手动序列化和手动反序列化

private static final ObjectMapper mapper=new ObjectMapper();

    @Test
    void testSaveUser() throws JsonProcessingException {
        //创建对象
        User user=new User("胡歌",21);
        //手动序列化
        String json = mapper.writeValueAsString(user);
        //写入数据
        stringRedisTemplate.opsForValue().set("user:200",json);
        //获取数据
        String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
        //手动反序列化
        User user1 = mapper.readValue(jsonUser, User.class);
        System.out.println("use1r="+user1);
    }

RedisTemplate操作hash类型(注意方法)

@Test
    void testHash(){
        stringRedisTemplate.opsForHash().put("user:400","name","虎哥");
        stringRedisTemplate.opsForHash().put("user:400","age","21");
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");
        System.out.println("entries="+entries);
    }

 

 

 

 

 

 

 

 

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

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

相关文章

操作系统学习笔记

1.1 操作系统的概念、功能和目标 1.1.1 操作系统的功能和目标–系统资源的管理者 进程是一个程序的执行过程。执行前需要将该程序放到内存中&#xff0c;才能被CPU处理。 1.1.2 用户和计算机硬件之间的接口 联机命令接口交互式命令接口 脱机命令接口批处理命令接口 1.1.3…

点击化学标记试剂N3-PEG-DBCO,DBCO-PEG-azide,二苯并环辛炔聚乙二醇叠氮

N3-PEG-DBCO &#xff0c;DBCO PEG N3 &#xff0c;DBCO-PEG-azide&#xff0c;叠氮聚乙二醇环辛炔&#xff0c;二苯并环辛炔聚乙二醇叠氮产品规格&#xff1a; 1.分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k&#xff08…

百度地图三维盒子模型标注

效果图 利用百度地图mapv实现地图盒子模型标准 代码 function box() {var griddata [];for (var i 0; i < arr.length; i) {griddata.push({geometry: {type: Point,coordinates: arr[i]},properties: {count: Math.random() * (i 1) * 10000}});}var grid new mapvgl…

MySQL索引下推

1.什么是索引下推? 索引下推(Index Condition PushDown,简称ICP)是从MySQL5.6开始引入的一个特性,索引下推通过减少回表的次数来提高数据库的查询效率; 2.案例 准备: ①.为了演示索引下推,需要安装MySQL5.5和MySQL5.7两个版本的MySQL,因为索引下推是MySQL5.6版本中开始引入…

Java学习之断点调试

目录 应用场景 重要提示 定义 快捷键 运行图 案例1 案例2 案例3 案例4 练习题 第一题 题目 代码 toString方法 第二题 题目 应用场景 查找错误时&#xff0c;用断点调试一步一步的看源码执行的过程&#xff0c;从而发现错误所在 重要提示 在断点调试&#xff08;…

搭建hadoop单机环境

hadoop 笔记 sbin: 一些启动脚本 【服务端的 server bin】logs: 存放 hadoop 相关日志bin: 客户端的脚本etc: hadoop 相关的配置文件 格式化文件系统 配置免密码登录 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys# 启动…

Android DataBinding之布局中(layout)事件、运算逻辑、资源、工具类的使用与详解(七)

一、介绍 如果你学习了我前面的六篇文章&#xff0c;基本能够熟悉的处理data binding在开发过程的大多数业务&#xff0c;但是由于layout中的数据不一定满足UI上的效果&#xff0c;正常都是提前处理好数据&#xff0c;如果我们在layout引入中事件、运算逻辑、资源、工具类&…

【离散数学】代数系统 测试

1.判断题 代数系统中一个元素的左逆元一定等于该元素的右逆元。 正确答案&#xff1a; 错误 2.判断题 一个循环群的生成元不是唯一的。 正确答案&#xff1a; 正确 3.判断题 任何循环群必定是阿贝尔群&#xff0c;反之亦真。 正确答案&#xff1a; 错误 4.判断题 任何一个循环群…

gitlab-runner 的安装

Gitlab-ci说明 是GitLab内置的进行持续集成的工具&#xff0c;只需要在仓库根目录下创建.gitlab-ci.yml 文件&#xff0c;并配置GitLab Runner&#xff1b;每次提交的时候&#xff0c;gitlab将自动识别到.gitlab-ci.yml文件&#xff0c;并且使用Gitlab Runner执行该脚本 Gitl…

关于Redis数据库,我问了ChatGPT几个问题

最近互联网刮起了一阵ChatGPT风&#xff0c;从程序猿、产品经理、运营再到大学生&#xff0c;都在跟ChatGPT对话&#xff01;例如&#xff1a; 请帮我检查这段代码的BUG 请帮我设计一款功能像虹科VUZIX一样的智能AR眼镜 虹科Domo数据可视化工具有什么功能 帮我写一篇关于Weka并…

(C1)卷积层特点及torch.nn.Conv2d()

卷积层 文章目录卷积层一、常规卷积1.1 特点1.2 参数量 和 计算量二、可分离卷积2.1 逐深度卷积(Depthwise Convolution)2.2 逐点卷积(Pointwise Convolution)三、代码实现 ⭐一、常规卷积 参考资料 卷积神经网络之卷积层中的多输入多输出通道 卷积中参数量和计算量 有图文讲解…

数字孪生堆场集成箱的管理运维,可视化构建

为优化集装箱码头生产作业流程、提高生产效率&#xff0c;借鉴数字孪生在工业体系应用的经验&#xff0c;采用数字孪生技术对集装箱码头堆场这一典型的具有不确定性、多目标、复杂性的离散内部交通物流系统进行数字化运维&#xff0c;可显著提升作业效率。数字孪生技术正在成为…

(17)深度点云学习--python安装openni打开奥比中光RGBD

1、主要参考 &#xff08;1&#xff09;安装 点云数据处理之安装python-openni_mengjiexu_cn的博客-CSDN博客_openni python &#xff08;2&#xff09;打开摄像头 2、安装openni和测试摄像头 2.1 下载安装摄像头驱动 &#xff08;1&#xff09;去以下地址下载驱动 https…

为什么 OpenCV 计算的视频 FPS 是错的

作者 | 王伟、刘一卓 导读 网络直播功能作为一项互联网基本能力已经越来越重要&#xff0c;手机中的直播功能也越来越完善&#xff0c;电商直播、新闻直播、娱乐直播等多种直播类型为用户提供了丰富的直播内容。 随着直播的普及&#xff0c;为用户提供极速、流畅的直播观看体验…

通过商业智能(BI)可视化数据分析了解布洛芬的产销情况

我们都知道&#xff0c;在我们的生活中&#xff0c;处处都是数据。但是只有数据&#xff0c;比如1、2、45、68、137.5&#xff0c;这些数据单一来看并不能反映任何问题。必须通过数据的分析才能将这些单一、无意义的数字变成我们能了解的信息。简单来说&#xff0c;就是数据≠信…

将多个Word表格中的指定值提取到Excel中,方便查看、统计、汇总。Word精灵

01需求说明 图1是简历样&#xff0c;简历中各项数据都放在表格中。现要求将图2中所有简历表的姓名、性别、出生日期、学历、籍贯、民族等等信息逐一提取出来&#xff0c;整理到Excel中&#xff0c;方便查看及汇总。 图1 简历表 图2 要汇总的简历表 02操作步骤 要提取所有简…

C#启程—开发环境搭建

文章目录ideRider下载和安装创建C#基础工程&#xff08;.Net_Desktop_Form&#xff09;Rider去除语法警告C#笔记namespace找不到某个class&#xff08;命名空间&#xff09;ide Rider ide我们选择Rider 为何不选vs&#xff1f;vs占硬盘内存太高了&#xff08;20多G&#xff0…

DATAKIT CrossManager 2022.4 Crack

CrossManager 是一款独立软件&#xff0c;可让您转换大多数 CAD 格式的文件。 使用 Cross Manager&#xff0c;您只需选择一个或多个 CAD 文件&#xff0c;即可将它们自动翻译成您想要的格式。 DATAKIT CrossManager是一款独立软件&#xff0c;可让您转换大多数 CAD 格式的文件…

java对接打码平台用selenium实现对图片验证码识别(对接文档看这一个就够了)

在很多平台软件中&#xff0c;咱们登录之后都有一些验证&#xff0c;例如图片数字验证&#xff0c;还有现在流行的滑块验证码&#xff0c;点选验证码&#xff0c;这么复杂的事情&#xff0c;我们程序员当然要用程序的方式解决啦&#xff0c;所以也有一些平台提供了快捷验证的方…

ElasticSearch的读写更新数据流程

读数据流程 客户端向 Node1&#xff08;协调节点&#xff09; 发送获取请求。节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个节点上。为了负载均衡&#xff0c;可以轮询所有节点&#xff0c;最后它将请求转发到 Node 2 。Node 2 将文档返回给 N…