【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);
        //设置最长等待时间,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反序列化为对象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Electron 打包自定义NSIS脚本为安装向导增加自定义页面增加输入框

Electron 打包工具有很多&#xff0c;如Electron-build、 Electron Forge 等&#xff0c;这里使用Electron-build&#xff0c;而Electron-build使用了nsis组件来创建安装向导&#xff0c;默认情况nsis安装向导不能自定义安装向导界面&#xff0c;但是nsis提供了nsis脚本可以扩展…

探索未来外贸电商系统的创新架构

在全球化、数字化的时代背景下&#xff0c;外贸电商行业呈现出蓬勃发展的态势。为了适应市场竞争的激烈和用户需求的多样化&#xff0c;外贸电商系统的架构设计显得尤为重要。本文将深入探讨未来外贸电商系统的创新架构&#xff0c;以期为行业发展提供新的思路和方向。 随着全…

UE4_X光效果设置_法线图影响透明度

UE4_X光效果设置_法线图影响透明度 2019-03-22 13:37 Exponentin 设置轮廓光扩散度 baseReflectFactionIn 设置内部黑色的亮度值。nromal&#xff0c;连接应用一张法线图&#xff0c;Lerp两色插值&#xff0c;给两个数值&#xff0c;制造一个渐变。 法线图影响透明度&#xf…

企业邮箱给谷歌Gmail报错550-5.7.25解决方案

企业邮箱给谷歌Gmail报错550-5.7.25解决方案 问题表现 今天接到同事报告企业邮箱发送报错的问题&#xff0c;具体问题表现如下&#xff1a; 我司内部邮箱 xxXXX.com 邮箱给国内的163和新浪和企业内部发送邮件可以成功给Hotmail发送邮件&#xff0c;成功。给Gmail发送邮件&am…

蓝牙学习九(定向广播 ADV_DIRECT_IND)

一、简介 广播类型有如下&#xff1a; 非定向可连接广播&#xff08;ADV_IND&#xff09;。可连接的非定向广播&#xff0c;表示当前设备可以接受任何设备的连接请求。 定向可连接广播&#xff08;ADV_DIRECT_IND&#xff09;。可连接的定向广播&#xff0c;设备不能被主动扫描…

Python中批量修改文件名,去除某些内容

环境&#xff1a;Window10 Python3.9 PyCharm(2023.1.3) -------------------------------------****************** ** *********************----------------------------------------- 这是在Python中批量将指定文件夹下相似的文件名&#xff0c;提取文件名有效信息&am…

第二十一章 RabbitMQ

一、RabbitMQ 介绍 在介绍 RabbitMQ 之前&#xff0c;我们先来看下面一个电商项目的场景&#xff1a; - 商品的原始数据保存在数据库中&#xff0c;增删改查都在数据库中完成。 - 搜索服务数据来源是索引库&#xff08;Elasticsearch&#xff09;&#xff0c;如果数据库商品…

35.Python从入门到精通—Python CGI编程 什么是CGI

35.从入门到精通&#xff1a;Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部 Python CGI编程什么是CGI网页浏览CGI架构图Web服务器支持及配置第一个CGI程序HTTP头部 Python CGI编程 什么是CGI CGI是一种通用网关接口&#xff0c;它…

Java基础 - 代码练习

第一题&#xff1a;集合的运用&#xff08;幸存者&#xff09; public class demo1 {public static void main(String[] args) {ArrayList<Integer> array new ArrayList<>(); //一百个囚犯存放在array集合中Random r new Random();for (int i 0; i < 100; …

yolov9文献阅读记录

本文记录了yolov9文献的阅读过程&#xff0c;对主要内容进行摘选翻译&#xff0c;帮助理解原理和应用&#xff0c;包括摘要、主要贡献、网络结构、主要模块&#xff0c;问题描述和试验对比等内容。 文献摘要前言摘选主要贡献相关工作可逆性结构辅助监督 问题描述信息瓶颈原理可…

windows上配置Redis主从加哨兵模式实现缓存高可用

一、哨兵模式 哨兵&#xff08;sentinel&#xff09;是Redis的高可用性(High Availability)的解决方案&#xff1a;由一个或多个sentinel实例组成sentinel集群可以监视一个或多个主服务器和多个从服务器。当主服务器进入下线状态时&#xff0c;sentinel可以将该主服务器下的某…

Appium如何自动判断浏览器驱动

问题&#xff1a;有的测试机chrome是这个版本&#xff0c;有的是另一个版本&#xff0c;怎么能让自动判断去跑呢&#xff1f;&#xff1f; 解决办法&#xff1a;使用appium的chromedriverExecutableDir和chromedriverChromeMappingFile 切忌使用chromedriverExecutableDir和c…

vue处理后端返回的日志

vue处理后端返回的日志&#xff0c;并保持日志内容最新&#xff08;滚动到最新内容&#xff09; 1、后端返回的日志格式如下所示&#xff0c;该如何处理成正常的文本换行 2、在获取日志的接口中做如下处理&#xff0c;把返回的/n替换成换行标签&#xff0c;并根据任务状态判断…

Python构建高效可扩展的Web应用程序库之aiohttp使用详解

概要 在Python异步编程领域中,aiohttp库以其强大的功能成为构建高效可扩展的Web应用程序的重要工具。它利用asyncio提供异步HTTP客户端和服务器功能,使其成为处理并发请求和优化性能的理想选择。在本全面指南中,将深入探讨aiohttp库,包括安装方法、特性、基本和高级功能、…

突破校园网限速:使用 iKuai 多拨分流负载均衡 + Clash 代理(内网带宽限制通用)

文章目录 1. 简介2. iKuai 部署2.1 安装 VMware2.2 安装 iKuai(1) 下载固件(2) 安装 iKuai 虚拟机(3) 配置 iKuai 虚拟机(4) 配置 iKuai(5) 配置多拨分流 2.3 测试速度 3. Clash 部署3.1 准备工作(1) 配置磁盘分区(2) 安装 Docker(3) 安装 Clash(4) 设置代理 1. 简介 由于博主…

DETR【Transformer+目标检测】

End-to-End Object Detection with Transformers 2024 NVIDIA GTC&#xff0c;发布了地表最强的GPU B200&#xff0c;同时&#xff0c;黄仁勋对谈《Attention is All You Need》论文其中的7位作者&#xff0c;座谈的目的无非就是诉说&#xff0c;Transformer才是今天人工智能成…

vtk,ITK,DICOM3.0

(14 封私信 / 80 条消息) VTK ITK OPENCV&#xff0c;从图像处理的角度来说&#xff0c;哪种用的人多&#xff1f; - 知乎 (zhihu.com) 医学领域&#xff1a;通常要求使用ITK和VTK。 ITK做底层处理算法。 VTK做可视化显示。 ITK:Insight Segment and Regestration Toolkit …

链表之单链表

上一篇博客我们学习了线性表中的顺序表&#xff0c;这一篇博客让我们继续往下了解线性表的链表&#xff0c;链表分为好几种结构&#xff0c;活不多说&#xff0c;让我们开始学习吧&#xff01; 目录 1.链表 2.链表的结构 3.单链表的实现 1.链表 1.概念&#xff1a;它是一种物…

【QT入门】 自定义标题栏界面qss美化+按钮功能实现

往期回顾&#xff1a; 【QT入门】 鼠标按下和移动事件实现无边框窗口拖动-CSDN博客【QT入门】 设计实现无边框窗口拉伸的公用类-CSDN博客【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客 【QT入门】 自定义标题栏界面qss美化按钮功能实现 一、最终效果 二、…

Linux简单介绍

Linux简单介绍 编译器VMware虚拟机Ubuntu——LinuxOS为什么使用LinuxOS&#xff1f; 目录结构Windows目录结构Linux操作系统home是不是家目录&#xff1f; Linux常用命令终端命令行提示符与权限切换命令tab 作用&#xff1a;自动补全上下箭头pwd命令ls命令mkdir命令touch命令rm…