当前位置: 首页 > news >正文

Redis:redis通用命令;redis常见数据结构;redis客户端;redis的序列化

一、redis命令

1.redis通用命令

Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令
常见的命令有:

keys

查看符合模板的所有key,不建议在生产环境设备上使用,因为keys会模式匹配所有符合条件的key,而redis是一个单线程的数据库,这样会导致很多其它操作阻塞。如果redis是集群分布的,则可以在重库中进行匹配,保证主库中的业务不被阻塞。
例如 keys *,(心号是通配符,还有另外两种通配符?和 [],具体功能自行查看。
在这里插入图片描述

del

删除一个指定的key。
比如现在库中有三个name,我们要删除name3,del name3,返回值为1,说明删除成功。
在这里插入图片描述
在这里插入图片描述

exists

判断key是否存在。
刚才在上面我们删除了name3,现在我们来判断它是否存在,exists name3,返回0,说明不存在
在这里插入图片描述

expire

给一个已经存在的key设置有效期,单位为,有效期到期时会自动删除。
我们给name2设置5秒的有效期测试一下,返回1,设置成功,5秒后name2会被删除
在这里插入图片描述

ttl

查看一个key的剩余有效期。
刚才我们给name2设置有效期后,使用ttl查看name2的剩余有效期,返回2,说明还剩2秒。
使用ttl查看name1的有效期,返回-1,说明name1是永久有效。
使用ttl查看name3的有效期,返回-2,说明name2在内存中不存在。
在这里插入图片描述

help [command]

help [command]可以帮助我们在命令行中查看命令的书写格式以及命令的作用,如:
在这里插入图片描述
当然也可以在redis官网文档中查询redis文档

2.Redis中key的层级结构

redis中的key可以用 “:” 进行分隔,比如:
key = “nation:city:area”,value=“中国北京海淀区”
在这里插入图片描述

3.Redis中的数据结构

  • String
    String类型,也就是字符串类型,是Redis中最简单的存储类型。
    其value是字符串,不过根据字符串的格式不同,又可以分为3类:
    string: 普通字符串
    int: 整数类型,可以做自增、自减操作
    float: 浮点类型,可以做自增、自减操作
    不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m

  • hash
    在这里插入图片描述

  • list
    Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。(实际数据结构比较复杂,可以自行了解)
    特征也与LinkedList类似:
    ●有序
    ●元素可以重复
    ●插入和删除快
    ●查询速度一般,常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

  • set
    Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。 因为也是一个hash表, 因此具备与HashSet类似的特征:
    ●无序,set中的元素存放顺序和插入顺序不是一致的。
    ●元素不可重复
    ●查找快
    ●支持交集、并集、差集等功能

  • SortedSet
    Redis的SortedSet是- -个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList) 加hash表。
    SortedSet具备下列特性:
    ●可排序
    ●元素不重复
    ●查询速度快
    因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

二、redis客户端

redis常用客户端对比,SpringDataReids集成了jedis和lettuce
在这里插入图片描述

1.jedis

jedis是java和redis两个单词的简写,我们可以使用java代码操作jedis客户端对redis数据库进行操作。

导入包

  <dependencies><!--单元测试依赖--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.1</version><!--注释掉test作用域,让junit在全域有效-->
<!--<scope>test</scope>--></dependency><!--jedis依赖--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency></dependencies>

编写测试类

public class TestJedis {private Jedis jedis;//在每个单元测试前建立连接@BeforeEachvoid setUp(){//1.建立连接jedis = new Jedis("127.0.0.1",6379);// Jedis jedis = JedisConnectionFactory.getJedisFromPool();//2.设置密码
//        jedis.auth("");//3.选择库,默认为0jedis.select(0);}//在每个单元测试后关闭连接@AfterEachvoid tearDown(){if (jedis != null){jedis.close();}}//测试使用jedis访问redis@Testvoid testString(){jedis.set("name1","jack");String s = jedis.get("name1");System.out.println(s);}
}

jedis中操作redis的方法的方法名和reids原生的指令名称一致
执行testString就可以对redis数据库进行操作了

2.jedis连接池

上面创建jedis连接操作redis的方法有一个问题,如果存在大量的redis操作,我们就需要频繁的创建销毁jedis连接,这样会造成很大的性能消耗。
所以我们引入jedis连接池

创建jedis连接池工厂

/*** @author Watching* * @date 2023/3/31* * Describe:jedis连接池工厂类*/
public class JedisConnectionFactory {//创建一个静态常量jedispool引用,用于指向我们创建jedis连接池private static final JedisPool jedisPool;static {JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();//设置jedis连接池最大连接数量jedisPoolConfig.setMaxTotal(8);//设置jedis连接池最大空闲连接数量jedisPoolConfig.setMaxIdle(8);//设置jedis连接池最小空闲连接数量jedisPoolConfig.setMinIdle(0);//设置jedis连接池连接最长等待时间jedisPoolConfig.setMaxWaitMillis(200);jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, "root", "cdut2019");}//提供一个静态方法从jedis连接池中获取jedis连接public static Jedis getJedisFromPool() {return jedisPool.getResource();}
}

编写测试类

测试类和直接使用jedis连接的测试类基本相同,唯一不同的点是我们不需要通过new jedis(host,psssword)来获取连接,而是直接调用jedis连接池工厂中的静态方法。

/*** @author Watching* * @date 2023/3/30* * Describe:*/public class TestJedis {private Jedis jedis;//在每个单元测试前建立连接@BeforeEachvoid setUp(){//1.建立连接
//        jedis = new Jedis("127.0.0.1",6379);Jedis jedis = JedisConnectionFactory.getJedisFromPool();//2.设置密码
//        jedis.auth("");//3.选择库,默认为0jedis.select(0);}//在每个单元测试后关闭连接@AfterEachvoid tearDown(){if (jedis != null){jedis.close();}}//测试使用jedis访问redis@Testvoid testString(){jedis.set("name1","jack");String s = jedis.get("name1");System.out.println(s);}
}

3.SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。

  • 提供了对不同Redis客户端的整合( Lettuce和Jedis )
  • 提供了RedisTemplate统- -API来操作Redis
  • 支持Redis的发 布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响 应式编程
  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现,JDK原生的Collection不支持分布式
    在这里插入图片描述

引入SpringDataRedis依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

编写redis配置

spring:redis:host: 127.0.0.1port: 6379password: cdut2019lettuce:pool:min-idle: 8max-wait: 1000msmax-active: 8max-idle: 8

测试

在springboot测试类中注入redistemplate进行测试
在这里插入图片描述

更改默认的客户端

SpringDataRedis默认使用的客户端时Lettuce,如果想要使用jedis可以通过修改依赖文件:

<!--整合redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><!--排除lettuce,使用jedis 避免堆外内存溢出异常--><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><!--引入jedis--><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>

4.redisTemplate的序列化

在上面的测试中我们发现存在redis中的key和value有点奇怪,这是redistemplate使用了默认的序列化器(JDKSerializer)
在这里插入图片描述
添加一个配置类,就可以解决这个问题

/*** @author Watching* * @date 2023/3/31* * Describe:redis配置类* 更改jdk默认序列化*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<String,String> redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<String,String> redisTemplate = new RedisTemplate<>();//key和hashKey都设置为String序列化redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setKeySerializer(RedisSerializer.string());//value和hashValue都设置为JSON序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}

在运行测试类的时候报错

Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/jsontype/impl/StdTypeResolverBuilder

这是因为我们在使用GenericJackson2JsonRedisSerializer序列化,但是却没有引入jackson依赖,引入该依赖就行

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>

这下子就正常了
在这里插入图片描述
我们再尝试插入一个对象试试,成功了。并且json数据中还多了一条@class数据,所以在get这个value的时候,GenericJackson2JsonRedisSerializer可以帮我们反序列化。但是,多出来的@class信息会占用多余的空间,所以我们建议还是使用手动序列化,和反序列化,比如使用JSONutil.parse**等
在这里插入图片描述

StringRedisTemplate

StringRedisTemplate默认使用String序列化器,可以更方便在Redis中存储字符串类型的数据,可以阅读源码来了解一下。

相关文章:

Redis:redis通用命令;redis常见数据结构;redis客户端;redis的序列化

一、redis命令 1.redis通用命令 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有&#xff1a; keys 查看符合模板的所有key&#xff0c;不建议在生产环境设备上使用&#xff0c;因为keys会模式匹配所有符合条件的key&#…...

Java新特性

switch Java中switch的三种用法方式 JAVA中的switch Java switch 中如何使用枚举&#xff1f; 注解 天天用注解你真的知道怎么用吗&#xff1f;Java中的注解及其实现原理。 JAVA注解 JAVA注解 基础 集合判空 求和 Java8之List求和 JAVA中对list使用stream对某个字段求和…...

Java_Spring:8. Spring 中 AOP 的细节

目录 1 说明 2 AOP 相关术语 3 学习 spring 中的 AOP 要明确的事 4 关于代理的选择 1 说明 spring 的 aop通过配置的方式&#xff0c;实现上一章节的功能。 2 AOP 相关术语 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring …...

uni-app--》uni-app的生命周期讲解

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…...

fastp软件介绍

fastp软件介绍1、软件介绍2、重要参数解析2.1 全部参数2.2 使用示例2.3 重要参数详解&#xff08;1&#xff09;UMI去除&#xff08;2&#xff09;质量过滤&#xff08;3&#xff09;长度过滤&#xff08;4&#xff09;低复杂度过滤&#xff08;5&#xff09;adapter过滤&#…...

C++继承相关总结

文章目录前言1.继承的相关概念1.继承概念2.继承的相关语法3.基类和派生类对象赋值转换(赋值兼容规则&#xff09;2.继承中的注意事项1.继承中的作用域2.派生类的默认成员函数1.构造函数与拷贝构造2.赋值重载与析构3.友元关系与静态成员变量3.多继承(菱形继承)1.虚拟继承2.虚拟继…...

【从零开始学习 UVM】8.2、Reporting Infrastructure —— uvm_printer 详解

文章目录 老派风格在UVM中如何完成uvm 风格Table printerTree printerLine printerprint使用print使用条件使用konb更改print配置示例在一个随机验证环境中,数据对象不断地由不同的组件生成和操作,如果能够显示对象的内容,则调试会变得更加容易。 老派风格 传统上,这是通…...

Mybatis、TKMybatis对比

文章目录1.Mybatis&#xff08;1&#xff09;配置文件&#xff08;2&#xff09;实体类&#xff08;3&#xff09;Mapper&#xff08;4&#xff09;mybatis-config.xml2.TKMybatis&#xff08;1&#xff09;配置文件&#xff08;2&#xff09;实体类&#xff08;3&#xff09;M…...

37了解高可用技术方案,如冗余、容灾

高可用性技术方案是指在系统设计和架构中采用一系列措施来确保系统在遇到各种故障和问题时仍能保持持续的可用性&#xff0c;避免因单点故障而导致系统宕机、数据丢失等问题。其中包括冗余和容灾技术。 冗余技术&#xff1a; 冗余技术是指通过增加系统组件的冗余来提高系统可靠…...

jdb调试问题集锦

https://bbs.kanxue.com/thread-210049.htm蓝铁 1 2017-8-25 19:40 4 楼 0 根据提示&#xff0c;可知&#xff0c;出错的地方是&#xff0c;android.app.ActivityThread.handleBindApplication(), 行4,400 查看源码可以发现&#xff0c;代码中指向的是app.onCreate() …...

要和文心一言来一把你画我猜吗?

想和文心一言来一把你画我猜吗&#xff1f; ChatGPT的爆火&#xff0c;让AI对话模型再次走入大众视野。大家在感叹ChatGPT的智能程度时&#xff0c;总会忍不住想&#xff1a;如果我们也有自己的AI对话模型就好了。在社会的压力下&#xff0c;国内的厂商和研究机构也纷纷做出尝试…...

delete[] p->elems和free(p->elems)有什么区别?

delete[]和free()都是释放内存的函数&#xff0c;但它们具有不同的使用方法和适用情况。 delete[] 通常用于释放C中动态分配的数组空间。在使用new[]运算符分配内存时&#xff0c;应使用delete[]运算符来释放分配的内存。delete[] 运算符会调用每个数组元素的析构函数&#xf…...

CAS问题

CAS&#x1f50e;什么是CAS&#x1f50e;伪代码解析&#x1f50e;CAS是如何实现原子性的&#x1f50e;CAS的应用&#x1f33b;实现原子类&#x1f33b;实现自旋锁&#x1f50e;ABA问题&#x1f33b;ABA问题可能引起的BUG&#x1f33b;ABA问题的解决方案&#x1f50e;结尾&#…...

网络编程socket(下)

目录 一、TCP网络程序 1.1 服务端初始化 1.1.1 创建套接字 1.1.2 服务端绑定 1.1.3 服务端监听 1.2 服务端启动 1.2.1 服务端获取连接 1.2.2 服务端处理请求 1.3 客户端初始化 1.4 客户端启动 1.4.1 发起连接 1.4.2 发起请求 1.5 网络测试 1.6 单执行流服务端的…...

华为OD机试题【打折买水果】用 C++ 编码,速通

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:打折买水果 题目 有 m m m…...

JSON 数据类型

JSON 数据类型 JSON 格式支持以下数据类型&#xff1a; 类型描述数字型&#xff08;Number&#xff09;JavaScript 中的双精度浮点型格式字符串型&#xff08;String&#xff09;双引号包裹的 Unicode 字符和反斜杠转义字符布尔型&#xff08;Boolean&#xff09;true 或 fal…...

Python函数简介

Python是一种高级编程语言&#xff0c;它的函数是其中一个非常重要的特性。在程序中&#xff0c;函数是一段被命名的代码块&#xff0c;它可以接受输入并且返回输出。本篇文章将介绍Python函数的基本概念、定义、调用和参数。 基本概念 在Python中&#xff0c;函数是由def关键…...

一文读懂 mysql 为什么要两阶段提交以及两阶段提交原理

文章目录 为什么要两阶段提交redo log与binlog两份日志之间的逻辑不一致,会出现什么问题?两阶段提交是怎么保证逻辑一致的呢?当 binlog 写完,redo log 还没 commit 前发生 crash,那崩溃恢复后 MySQL 如何处理?redo 与 binlog 的刷盘时机MySQL 的双 1 配置能否只用 redo l…...

启动Hadoop报错【Error: JAVA_HOME is not set and could not be found.】

当用了一下午从0安装上Hadoop兴奋的启动的时候&#xff01; Error: JAVA_HOME is not set and could not be found. 他告诉我JAVA_HOME 没被找到&#xff1f; 我明明安装了java的&#xff0c;为什么找不到&#xff1f; java -version看了下发现是没问题的 解决&#xff1a; 后…...

《MySQL系列-InnoDB引擎35》索引与算法-B+树索引的使用

B树索引的使用 1 不同应用中B树索引的使用 在OLTP中&#xff0c;B树索引建立后&#xff0c;对该索引的使用应该只是通过该索引取得表中少部分的数据。这时建立B树索引才是有意义的&#xff0c;否则即使建立了&#xff0c;优化器也可能不选择使用索引。 在OLAP中&#xff0c;…...

【EHub_tx1_tx2_E100】不止科技NVISTAR ROC 300激光雷达Ubuntu18.04+ROS1ROS2 评测

介绍NVISTAR 的二维DTOF激光雷达 ROC 300在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS1驱动和ROS2的驱动&#xff0c;打开使用RVIZ 查看点云数据&#xff0c;本文的前提条件是你的TX1里已经安装了ROS1版本&#xff1a;Mel…...

C语言函数大全--d开头的函数

C语言函数大全 本篇介绍C语言函数大全–d开头的函数 1. detectgraph 1.1 函数说明 函数声明函数功能void detectgraph(int *graphdriver, int *graphmode);通过检测硬件确定图形驱动程序和模式 1.2 演示示例 #include <graphics.h> #include <stdlib.h> #incl…...

基于springboot实现福聚苑社区团购演示【项目源码】

基于springboot实现福聚苑社区团购演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#…...

动静态库的制作

文章目录&#xff1a;什么是程序库&#xff1f;动态链接和静态链接动静态库的认识静态库的创建与使用创建使用动态库的创建与使用创建使用什么是程序库&#xff1f; 程序库&#xff1a;一般是软件作者为了发布方便、替换方便或二次开发目的&#xff0c;而发布的一组可以单独与应…...

QMS-云质-质量软件-客诉,为什么应该用两段式来处理

-云质QMS原创文章&#xff0c;转载请注明来源- 客户满意度是决定企业是否能够基业长青的关键因素之一。 如果客诉处理的不好&#xff0c;会极大影响客户的满意程度。 通常处理客诉分为两个阶段。 第一个阶段是快反遏制&#xff0c;想方设法快速答复和解决客户提出的问题&…...

JS:关于邮箱的正则表达式及规则

常用正则表达式—邮箱&#xff08;Email&#xff09; 要验证一个字符串是否为邮箱的话&#xff0c;首先要了解邮箱账号的格式。我尝试过在网上找出一个标准的格式&#xff0c;但是很遗憾我没有找到。我也尝试使用RFC标准来判断邮箱的格式&#xff0c;但是也没有结果。网上些博…...

两句话,ChatGPT帮我写一个打飞机的游戏

大家好&#xff0c;我是全村的希望今天的主题是让 chatGPT 来帮我们写一个打飞机的游戏记得我刚学 Python 的时候&#xff0c;看的那本很经典的入门书《Python 编程&#xff1a;从入门到实践》&#xff0c;里面就有小项目就是教你编写一个打飞机的游戏我那时候是对着书一个一个…...

计算机图形学14:三维图形的投影变换

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、三维图形的投…...

【ChatGPT4】王老师零基础《NLP》(自然语言处理)第二课

我的已经在起、点开了书《王老师带我成为救世主》&#xff0c;那个更新及时 &#xff08;1&#xff09;---------------------------------------------------------------------------------------- 我&#xff1a; 1我/喜欢/吃/苹果&#xff0c;因为/它/们/很/好吃。 2 Th…...

设计模式之中介者模式在前端的应用

文章目录中介者模式在前端的应用场景1.实现组件之间的松耦合2. 实现异步请求的协同3. 实现事件驱动的编程模型4. 实现复杂交互的协调总结中介者模式在前端的应用场景 中介者模式是一种常见的设计模式&#xff0c;它可以将对象之间的通信集中处理&#xff0c;从而提高系统的可维…...