【Redis基础篇】详细讲解Redis

news2025/1/12 4:03:54

这篇文章让你详细了解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);
        //设置最长等待时间,ms
        jedisPoolConfig.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: localhost
      port: 6379
      #password: 123456
      database: 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 {
    @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;
    }
}
 @Test
    void 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();

    @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("user1 = " + user1);
    }

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


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

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

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

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

相关文章

docker版Elasticsearch安装,ik分词器安装,用户名密码配置,kibana安装

1、安装es和ik分词器 创建映射目录并赋予权限&#xff1a; mkdir -p /docker_data/elasticsearch/conf mkdir -p /docker_data/elasticsearch/data mkdir -p /docker_data/elasticsearch/plugins chmod -R 777 /docker_data/elasticsearch编写配置文件&#xff1a; vi /dock…

基于java+SpringBoot+Vue的校园交友网站设计与实现

基于javaSpringBootVue的校园交友网站设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含&#xff1a; 校园交友网站是一个为在校师生提供一个交流互动、寻找朋友的…

【数据库系统工程师】软考2024年5月报名流程及注意事项

2024年5月软考数据库系统工程师报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息…

C++核心高级编程 --- 4.类和对象

文章目录 第四章&#xff1a;4.类和对象4.1 封装4.1.1 封装的意义4.1.2 struct与class的区别 4.2 对象的初始化和清理4.2.1 构造函数和析构函数4.2.2 构造函数的分类及调用4.2.3 拷贝构造函数调用时机4.2.4 构造函数调用规则4.2.5 深拷贝与浅拷贝4.2.6 初始化列表4.2.7 类对象作…

Python实现BOA蝴蝶优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

使用kubeadm工具搭建Kubernetes集群

本文目录 一、CentOS7最小化安装&#xff08;master&#xff09;1、下载ISO镜像2、安装3、进入centos安装界面4、安装最小化安装必要的一些工具 二、克隆虚拟机&#xff08;node1、node2&#xff09;三、基础配置1、节点规划——部署架构图2、防火墙和SElinux配置2、主机名和ho…

nginx与tomcat的区别?

关于nginx和tomcat的概念 网上有很多关于nginx和tomcat是什么东西的定义&#xff0c;我总结了一下: tomcat是Web服务器、HTTP服务器、应用服务器、Servlet容器、web容器。 Nginx是Web服务器、HTTP服务器、正向/反向代理服务器&#xff0c;。 这里有两个概念是交叉的&#xff…

科技团队治理能力成长路线图

点击&#x1f446;蓝字 关注我们 本文观点&#xff5c;吴穹 主笔&#xff5c;AI小助手 温馨提示&#xff1a;干货长文&#xff0c;建议收藏阅读喔&#xff5e; 引言 2024年3月20日&#xff0c;吴穹博士于上海交通大学上海高级金融学院同一众信托行业金融科技管理者进行了《金融…

软件架构风格_2.调用/返回体系结构风格

调用/返回风格是指在系统中采用了调用与返回机制。利用调用-返回实际上是一种分而治之的策略&#xff0c;其主要思想是将一个复杂的大系统分解为若干子系统&#xff0c;以便降低复杂度&#xff0c;并且增加可修改性。程序从其执行起点开始执行该构件的代码&#xff0c;程序执行…

海外媒体软文发稿:带动海外宣发新潮流,迈向国际舞台

引言 随着全球化的发展&#xff0c;越来越多的中国企业希望在国际舞台上展示自己的实力。而海外媒体软文发稿作为一种全新的海外宣传方式&#xff0c;正逐渐成为带动海外宣发新潮流的有力工具。本文将探讨海外媒体软文发稿的优势和如何迈向国际舞台。 海外媒体软文发稿的优势…

tcpdump + wireshark 服务器抓包分析

tcpdump wireshark 服务器抓包分析 1.tcpdump安装2.tcpdump使用3.安装wireshark4.使用wireshark 本文用以总结使用tcpdump进行抓包&#xff0c;然后使用wireshark工具打开抓包出来的pacp文件进行分析。通过tcpdump可以实时监控到linux服务器中tcp和http、https等通讯的内容和信…

LVGL:拓展部件——日历 lv_calendar

一、概述 此控件特点&#xff1a; 以7x7矩阵的形式展示任何一个月的日期&#xff0c;即在一个7行7列的网格中呈现。显示星期的名称&#xff0c;即每一列对应一个特定的星期几&#xff08;如周一、周二等&#xff09;。高亮显示当前日期&#xff08;即今天&#xff09;。支持高…

强大缓存清理工具 NetShred X for Mac激活版

NetShred X for Mac是一款专为Mac用户设计的强大缓存清理工具&#xff0c;旨在帮助用户轻松管理和优化系统性能。这款软件拥有直观易用的界面&#xff0c;即使是初次使用的用户也能快速上手。 软件下载&#xff1a;NetShred X for Mac激活版下载 NetShred X能够深入扫描Mac系统…

深入理解MySQL:拼接字符串、查询、删除表和创建索引的关键命令

MySQL是一种功能强大的关系型数据库管理系统&#xff0c;广泛应用于各种类型的应用程序中。本文将介绍MySQL中一些常用的关键命令&#xff0c;包括拼接字符串、查询、删除表和创建索引&#xff0c;帮助读者更好地理解和利用MySQL数据库。 mysql拼接字符串 在MySQL中&#xf…

[RK3588-Android12] 调试MIPI-双通道-压缩屏(Video Mode/MIPI Dphy 8Lane/DSC 144HZ)

问题描述 被测屏幕&#xff1a;小米Pad6 分辨率&#xff1a;1800X2880 模式&#xff1a;Video Mode/MIPI Dphy 8Lane/DSC 144HZ PPS: 11 00 00 89 30 80 0B 40 03 84 00 14 01 C2 01 C2 02 00 01 F4 00 20 01 AB 00 06 00 0D 05 7A 06 1A 18 00 10 F0 03 0C 20 00 06 0B 0B 33…

谈谈考研数学几个常见误区

25考研数学&#xff0c;一定一定要吃透基础&#xff0c;练好计算 我之所以要强调这个&#xff0c;是因为现在的考研数学&#xff0c;越来越重视基础和计算的考察&#xff0c;题海战术已经过时&#xff0c;如果想要有效的提升自己&#xff0c;要进行针对性的学习。我去年考研的…

【云呐】固定资产清查盘点报告模板

固定资产清查盘点报告的大致框架:一、前言说明本次清查盘点的背景和目的清晰表述清查盘点的责任与相关依据二、清查盘点范围按部门或区域明确清查范围口径明确被清查项目,如所有原值一定数额以上的固定资产三、清查盘点时间确定清查盘点实施的时间节点 四、清查盘点方法描述清查…

01 Python进阶:正则表达式

re.match函数 使用 Python 中的 re 模块时&#xff0c;可以通过 re.match() 函数来尝试从字符串的开头匹配一个模式。以下是一个简单的详解和举例&#xff1a; import re# 定义一个正则表达式模式 pattern r^[a-z] # 匹配开头的小写字母序列# 要匹配的字符串 text "h…

采用大语言模型进行查询重写——Query Rewriting via Large Language Models

文章&#xff1a;Query Rewriting via Large Language Models&#xff0c;https://arxiv.org/abs/2403.09060 摘要 查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展&#xff0c;因为它容易出错并且需要深厚的专业知识。 类似地…

异常-模块-包-Python

师从黑马程序员 异常的概念 异常演示 捕获异常的方法 try:fopen("D:/abc.txt","r",encoding"UTF-8") except:print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开")fopen("D:/a…