【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.rhkb.cn/news/296097.html

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

相关文章

Firefox 关键词高亮插件的简单实现

目录 1、配置 manifest.json 文件 2、编写侧边栏结构 3、查找关键词并高亮的方法 3-1&#xff09; 如果直接使用 innerHTML 进行替换 4、清除关键词高亮 5、页面脚本代码 6、参考 1、配置 manifest.json 文件 {"manifest_version": 2,"name": &quo…

【芯片验证】通关寄存器与ral_model —— 寄存器生成流程中加入backdoor后门配置

前言 【芯片验证】通关寄存器与ral_model —— backdoor后门访问实操测试-CSDN博客 上一篇文章中,我们通过在环境中配置后门路径的方式来实现了寄存器的后门访问,但是在实际应用中,无论寄存器RTL文件、例化还是寄存器模型大概率都是工具生成的,比如在本专栏中实现的gen_r…

Day57:WEB攻防-SSRF服务端请求Gopher伪协议无回显利用黑白盒挖掘业务功能点

目录 SSRF-原理&挖掘&利用&修复 SSRF无回显解决办法 SSRF漏洞挖掘 SSRF协议利用 http:// &#xff08;常用&#xff09; file:/// &#xff08;常用&#xff09; dict:// &#xff08;常用&#xff09; sftp:// ldap:// tftp:// gopher:// &#xff08;…

vue 内嵌第三方网页

需要将另一个系统嵌套到当前网页中 一、frame 方法一就是通过html的标签 iframe 实现网页中嵌入其他网站 标签属性 属性含义src嵌套的网页地址width设置嵌套网页的宽度&#xff0c;单位为像素height设置嵌套网页的高度&#xff0c;单位为像素frameborder控制嵌套的网页是否…

高性价比的挂耳式耳机哪个好用?五大高口碑品牌深度测评严选!

入耳式耳机虽然普及度极高&#xff0c;但其缺点也不容忽视。首先&#xff0c;长时间佩戴可能导致耳朵不适&#xff0c;甚至影响听力健康。其次&#xff0c;入耳式耳机往往因为隔音效果过好&#xff0c;导致用户与周围环境脱节&#xff0c;失去了一定的生活便利性。相比之下&…

医学图像处理 利用pytorch实现的可用于反传的Radon变换和逆变换

医学图像处理 利用pytorch实现的可用于反传的Radon变换和逆变换 前言代码实现思路实验结果 前言 Computed Tomography&#xff08;CT&#xff0c;计算机断层成像&#xff09;技术作为如今医学中重要的辅助诊断手段&#xff0c;也是医学图像研究的重要主题。如今&#xff0c;随…

2024年第三期丨全国高校大数据与人工智能师资研修班邀请函

2024年第三期 杭州线下班 数据采集与机器学习实战&#xff08;Python&#xff09; 线上班 八大专题 大模型技术与应用实战 数据采集与处理实战&#xff08;Python&八爪鱼&#xff09; 大数据分析与机器学习实战&#xff08;Python&#xff09; 商务数据分析实战&…

GridLayoutManager 中的一些坑

前言 如果GridLayoutManager使用item的布局都是wrap_cotent 那么会在布局更改时会出现一些出人意料的情况。&#xff08;本文完全不具备可读性和说教性&#xff0c;仅为博主方便查找问题&#xff09; 布局item: <!--layout_item.xml--> <?xml version"1.0&qu…

arm交叉编译器工具

下载地址&#xff1a; Builds & Downloads | Linaro 进入首页后&#xff0c;点击" GNU Toolchain Integration Builds" 有以下版本&#xff1a; 根据自己的选择下载对应的版本&#xff0c;本例选择14.0-2023.06-1 根据板端对应的版本选择相应的下载 比如下载3…

来个自定义的电子木鱼吧

<!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>自定义木鱼</title> </head> <body style"background-…

R语言中的常用数据结构

目录 R对象的基本类型 R对象的属性 R的数据结构 向量 矩阵 数组 列表 因子 缺失值NA 数据框 R的数据结构总结 R语言可以进行探索性数据分析&#xff0c;统计推断&#xff0c;回归分析&#xff0c;机器学习&#xff0c;数据产品开发 R对象的基本类型 R语言对象有五…

运筹学基础(三):求解整数规划的切平面法(cutting plane method)

文章目录 算法思想一个例子参考文档 算法思想 先将整数规划问题松弛为线性规划问题&#xff0c;然后割掉线性规划问题可行域的一部分&#xff08;只包含非整数解&#xff09;&#xff0c;使得线性规划问题的最优解在原整数规划问题的可行域某顶点上取得。 因此&#xff0c;割平…

内存管理是如何影响系统的性能的

大家好&#xff0c;今天给大家介绍内存管理是如何影响系统的性能的&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 内存管理对系统性能的影响至关重要&#xff0c;主要体现在以下…

揭开AI编程语言Mojo比Pyhon快6.8万倍的5个秘密!

最近&#xff08;2024年3月29日&#xff09;&#xff0c;号称比Python快6.8万倍的Mojo编程语言开源啦&#xff01;6.8万倍&#xff1f;你敢相信这个数字是真的吗&#xff1f;不过&#xff0c;就连Mojo官网都把这个结果贴了出来&#xff08;见下图&#xff09;&#xff0c;这就很…

瀚海贫者福,铜子恣意游

上学时打饭追求性价比的习惯一直不改&#xff0c;半个大鱼头三块钱&#xff0c;一份豆腐一块钱&#xff0c;还有一个红烧茄子2块5&#xff0c;再加三毛钱的饭&#xff0c;共6块8毛钱&#xff0c;早晚餐也会有这类性价比高又营养的选择&#xff0c;科大食堂现在越来越人性化&…

计算机视觉的应用26-关于Fast-R-CNN模型的应用场景,Fast-R-CNN模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用26-关于Fast-R-CNN模型的应用场景&#xff0c;Fast-R-CNN模型结构介绍。Fast R-CNN是一种深度学习模型&#xff0c;主要用于目标检测任务&#xff0c;尤其适用于图像中物体的识别与定位。该模型在基…

go包下载时报proxyconnect tcp: dial tcp 127.0.0.1:80: connectex错误的解决方案

一大早的GoLand就开始抽风了&#xff0c;好几个文件import都红了&#xff0c;于是我正常操作点击提示的sync&#xff0c;但是却报了一堆错&#xff1a; go: downloading google.golang.org/grpc v1.61.1 go: downloading google.golang.org/genproto v0.0.0-20240228224816-df9…

阿里云数据库服务器价格表查询,2024年最新

阿里云数据库服务器价格表&#xff0c;优惠99元一年起&#xff0c;ECS云服务器2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;优惠价格99元一年&#xff1b;阿里云数据库MySQL版2核2G基础系列经济版99元1年、2核4GB 227.99元1年&#xff0c;云数据库PostgreSQL、SQL Serve…

Java中线程详解

文章目录 相关概念多线程概念实现方式继承Thread类实现Runnable接口比较 常用方法线程安全产生的原因解决思想同步同步代码块同步方法Lock锁机制 死锁概念避免 状态线程间的通讯介绍方法 相关概念 并行&#xff1a;在同一时刻&#xff0c;有多个任务在多个CPU上同时执行并发&a…

Docker 笔记

1.Ubuntu安装Docker 安装Docker看这篇文章 http://t.csdnimg.cn/IsSsJ 2.在docker中运行python代码 2.1搭建python环境 docker部署python环境看这篇文章 http://t.csdnimg.cn/TYz0G 2.2在python shell中运行python代码 2.2.1查看镜像 2.2.1启动python&#xff0c;厦门这个…