【Redis基础篇】详细讲解Redis

这篇文章让你详细了解Redis的相关知识,有代码讲解以及图片剖析,让你更轻松掌握

制作不易,感觉不错,请点赞收藏哟 !!!


目录

1  redis基础

1.1  定义

1.2  SQL和NOSQL不同点

1.3  特征

1.4  Redis通用命令

1.5  Redis数据结构介绍

1.6  Redis的java客户端

2  Jedis快速入门

2.1  操作步骤

2.2  Jedis连接池

3  SpringDataRedis

3.1  定义

3.2  优势

3.3  API

3.4  操作步骤

3.5  乱码解决方案

3.5.1  GenericJackson2JsonRedisSerializer优势

3.5.2  GenericJackson2JsonRedisSerializer缺陷

3.5.3  改进方案

3.5.4  RedisTemplate的两种序列化实践方案:


史诗级mysqlicon-default.png?t=N7T8https://blog.csdn.net/2301_77358195/article/details/137121480

1  redis基础

1.1  定义

Redis诞生于2009年全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库。


1.2  SQL和NOSQL不同点

①.数据结构:SQL是结构化的,NOSQL是非结构化的
②.数据关联:SQL是关联的,NOSQL是无关联的
③.查询方式:SQL是SQL查询,NOSQL是非SQL查询
④.事务特性:SQL是ACID,NOSQL是BASE
⑤.存储方式:SQL数据保存在磁盘,NOSQL数据保存在内存


1.3  特征

①.键值(key-value)型,value支持多种不同数据结构,功能丰富
②.单线程,每个命令具备原子性
③.低延迟,速度快(基于内存、IO多路复用、良好的编码)。
④.支持数据持久化(会定期将内存数据保存到磁盘中)
⑤.支持主从集群、分片集群
⑥.支持多语言客户端

原子性(Atomicity)是指事务中的所有操作要么全部成功执行,要么全部失败回滚,不存在部分执行的情况。这确保了数据库在任何情况下都能保持一致性,即事务要么完全执行,要么完全不执行,不会出现中间状态。


1.4  Redis通用命令

①.KEYS:查看符合模板的所有keys,不建议在生产环境设备中使用(因为redis是单线程,当要查找的数据量很大时,redis服务会被阻塞)
,pattern可以是*,表示查找全部,a*表示查找以a开头的keys
②.DEL:删除一个指定的key
③.EXISTS:判断key是否存在
④.EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
⑤.TTL:查看一个KEY的剩余有效期(-1表示永久有效,-2表示已被删除,整数代表还剩多长时间)

通过help [command] 可以查看一个命令的具体用法

1.5  Redis数据结构介绍

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样

数据类型的使用详细访问:https://www.redis.net.cn/tutorial/3508.html

基本数据类型:String、Hash、List、Set、SortedSet

特殊类型:GEO、BitMap、HelperLog


1.6  Redis的java客户端

①.Jedis:以Redis命令作为方法名称,学习成本低。但是Jedis实例是线程不安全的,多线程环境下需要基于线程池来连接

②.Lettuce:Lettuce是基于Netty实现的,支持同步,异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式,集群和管道模式.

③.Spring Data Redis整合了这两个客户端,可以兼容Jedis,Lettuce,也就是说Spring Data Redis定义了一套API既可以用Jedis实现也可以用Lettuce实现


2  Jedis快速入门

访问官方网址:https://redis.io/docs/connect/clients/java/jedis/#jedis


2.1  操作步骤

①.引入依赖
②.建立连接
Jedis jedis = new Jedis("host","port");
jedis.auth("password");
③.测试方法
④.关闭资源


@BeforeEach 和 @AfterEach 是测试框架中常见的注解,用于在执行每个测试方法之前和之后执行特定的操作,通常用于准备测试环境和清理测试数据。

@BeforeEach可以用于建立连接, @AfterEach用于关闭资源


2.2  Jedis连接池

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

注意:如果是连接池取出来的Jedis,Jedis.close不是直接断开,而是pool.returnResource(this),归还给连接池

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


3  SpringDataRedis

3.1  定义

Spring Data Redis是Spring Data项目的一部分,旨在简化Spring应用程序中的数据访问。Spring Data Redis专门提供与Redis集成

官网地址:https://spring.io/projects/spring-data-redis

3.2  优势

①.提供了对不同Redis客户端的整合(Lettuce和Jedis)

②.提供了RedisTemplate统一API来操作Redis

③.支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化

④.支持基于Redis的JDKCollection实现

3.3  API

API                        返回值类型                     说明
    
opsForValue()        ValueOperations            操作String类型
opsForHash()        HashOperations              操作Hash类型
opsForList()           ListOperations                操作List类型
opsForSet()            SetOperations                操作Set类型
opsForZSet()          ZSetOperations              操作SortedSet类型
redisTemplate                                                通用命令    

3.4  操作步骤

①.引入依赖(需要两个依赖)

//Redis依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>//连接池依赖(因为Jedis和Lettuce底层都会基于commons-pool来实现连接池效果)
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>

②.配置文件

spring:data:redis:host: localhostport: 6379#password: 123456database: 0 #操作的是0号数据库jedis:  #如果不配置这一项,默认为Lettuce#Redis连接池配置pool:max-active: 8 #最大连接数max-wait: 1ms #连接池最大阻塞等待时间max-idle: 4 #连接池中的最大空闲连接min-idle: 0 #连接池中的最小空闲连接

③.注入RedisTemplate

@Autowired
private RedisTemplate redisTemplate;

④.编写测试

SpringDataRedis的序列化方式

默认序列化器是 this.defaultSerializer = new JdkSerializationRedisSerializer,如果你没有去实现其他序列化器,

会导致中文乱码问题


3.5  乱码解决方案

自己配置<key,value>序列化器,一般key是String类型,value是Object类型,value可能存储是一个对象

因此一般key实现StringRedisSerializer序列化器,value实现GenericJackson2JsonRedisSerializer序列化器

实现如下图:

@Configuration
public class RedisConfig {@Beanpublic 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;}
}
 @Testvoid testSaveUser() {// 写入数据redisTemplate.opsForValue().set("user:100", new User("大老鼠", 21));// 获取数据User o = (User) redisTemplate.opsForValue().get("user:100");System.out.println("o = " + o);}

3.5.1  GenericJackson2JsonRedisSerializer优势

GenericJackson2JsonRedisSerializer好处就是会将User对象序列化成JSON格式,然后

再将JSON格式序列化为@class里面的User对象,而这些都是自动化进行的

3.5.2  GenericJackson2JsonRedisSerializer缺陷

GenericJackson2JsonRedisSerializer通过上面这张图,也可以看出

GenericJackson2JsonRedisSerializer的缺陷,就是为了记录序列化的对象占用的内存比数据本身

还多,如果数据量很多的话,就不能突显redis的效率快特性

3.5.3  改进方案

让key和value都实现StringRedisSerializer序列化器,然而这并不需要我们再去配置序列化器,

因为底层 StringRedisTemplate已经整合并实现了StringRedisSerializer序列化器,因此只需要

@Autowired
private  StringRedisTemplate  stringRedisTemplate;

但是序列化和反序列化要我们手动操作

private static final ObjectMapper mapper = new ObjectMapper();@Testvoid 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("user1 = " + user1);}

3.5.4  RedisTemplate的两种序列化实践方案:


方案一:
自定义RedisTemplate
修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案二(推荐):
使用StringRedisTemplate
写入Redis时,手动把对象序列化为JSON
读取Redis时,手动把读取到的JSON反序列化为对象

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

门户系统商城模块

商城系统&#xff1a;快递商品本地团购到店核销购物场景全覆盖&#xff0c;全新商销解决方案 商城系统是指一套用于构建和运营电商平台的软件系统&#xff0c;可以帮助企业快速搭建网上商城&#xff0c;实现商品销售、订单管理、客户服务等功能。 商城系统的功能&#xff1a;…

基于多数据源融合的医疗知识图谱框架构建研究

基于多数据源融合的医疗知识图谱框架构建研究 提出背景医学数据源医学数据获取方法知识图谱的构建 提出背景 论文&#xff1a;基于多数据源融合的医疗知识图谱框架构建研究 本文以医疗领域的实际应用需求为出发点&#xff0c;从医疗大数据获取、医疗实体及关系标注、医疗实体…

Linux-3 yum和vim

目录 本节目标&#xff1a; Linux 软件包管理器 yum 什么是软件包 1.yum是什么&#xff1f;软件包&#xff1f; 2.Linux(centos)的生态 3.yum的相关操作 我怎么知道我应该安装什么软件&#xff1f; 4.yum的本地配置 关于 rzsz 查看软件包 Linux编辑器-vim使用 1.v…

状态压缩DP

哈密顿路径问题&#xff1a; 一般设 表示 状态下&#xff0c;为最后一个最值情况 。 一般有两种稍微不同的写法&#xff0c;单纯就是写法不同&#xff0c;思路方法都相同。 第一个例题为第一种转移方法&#xff0c;有当前转移后面。 后面的都是由前面转移目前。 G. Shuff…

苹果IPA上传技巧:优化应用提交流程,提高通过率

目录 引言 摘要 第二步&#xff1a;打开appuploader工具 第二步&#xff1a;打开appuploader工具&#xff0c;第二步&#xff1a;打开appuploader工具 第五步&#xff1a;交付应用程序&#xff0c;在iTunes Connect中查看应用程序 总结 引言 在将应用程序上架到苹果应用商…

阿里云未来20%代码由AI编写;支付宝开放「AI 就医助理」

阿里云未来 20% 代码由通义灵码编写 阿里云于 4 月 2 日开始&#xff0c;在内部全面推行 AI 编程&#xff0c;使用通义灵码辅助程序员写代码、读代码、查 BUG、优化代码等。阿里云此次还专门给通义灵码分配了一个正式的员工工号—— AI001 。 有阿里云相关人士表示&#xff0c…

在电脑上怎么把视频做成二维码?视频生码的方法及步骤

在电脑上怎么把视频做成二维码呢&#xff1f;现在将视频存入二维码之后&#xff0c;将二维码分享或者打印出来&#xff0c;用这种方式来分享或者传递视频对比传统方式会更加的方便快捷。无需占用接收者的内存&#xff0c;手机扫码调取云端储存的视频&#xff0c;消耗视频流量来…

Flink 流批一体在模型特征场景的使用

摘要&#xff1a;本文整理自B站资深开发工程师张杨老师在 Flink Forward Asia 2023 中 AI 特征工程专场的分享。内容主要为以下四部分&#xff1a; 模型特征场景流批一体性能优化未来展望 一、 模型特征场景 以下是一个非常简化并且典型的线上实时特征和样本的生产过程。 前面…

鸿蒙OS开发实例:【应用状态变量共享】

平时在开发的过程中&#xff0c;我们会在应用中共享数据&#xff0c;在不同的页面间共享信息。虽然常用的共享信息&#xff0c;也可以通过不同页面中组件间信息共享的方式&#xff0c;但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景&#xff0c;ArkT…

基于单片机20v数字电压表仿真系统设计

**单片机设计介绍&#xff0c;基于单片机20v数字电压表仿真系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机20V数字电压表仿真系统设计的主要目标是实现一个能够准确测量和显示20V直流电压的仿真系统。以下是该设计的主…

算法学习——LeetCode力扣图论篇2(1020. 飞地的数量、130. 被围绕的区域、827. 最大人工岛)

算法学习——LeetCode力扣图论篇2 1020. 飞地的数量 1020. 飞地的数量 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个大小为 m x n 的二进制矩阵 grid &#xff0c;其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相…

C++——哈希(二)unordered_map和unordered_set的封装

前言 在上一篇文章中我们已经对闭散列的哈希表(线性探测法)和开散列的哈希表(哈希桶)进行了简单的模拟实现&#xff0c;由于是简单实现&#xff0c;功能简单、没有迭代器且不支持不同的类型(非泛型编程)。此时我们这篇文章主要是对上次开散列哈希表的完善并用其封装出unordere…