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 下可以作用在常用数据结构上的常用命令和一些基础的命令 常见的命令有: keys 查看符合模板的所有key,不建议在生产环境设备上使用,因为keys会模式匹配所有符合条件的key&#…...
Java新特性
switch Java中switch的三种用法方式 JAVA中的switch Java switch 中如何使用枚举? 注解 天天用注解你真的知道怎么用吗?Java中的注解及其实现原理。 JAVA注解 JAVA注解 基础 集合判空 求和 Java8之List求和 JAVA中对list使用stream对某个字段求和…...
Java_Spring:8. Spring 中 AOP 的细节
目录 1 说明 2 AOP 相关术语 3 学习 spring 中的 AOP 要明确的事 4 关于代理的选择 1 说明 spring 的 aop通过配置的方式,实现上一章节的功能。 2 AOP 相关术语 Joinpoint(连接点): 所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring …...
uni-app--》uni-app的生命周期讲解
🏍️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名在校大学生 🛵个人主页:亦世凡华、 🛺系列专栏:uni-app 🚲座右铭:人生亦可燃烧,亦可腐败…...
fastp软件介绍
fastp软件介绍1、软件介绍2、重要参数解析2.1 全部参数2.2 使用示例2.3 重要参数详解(1)UMI去除(2)质量过滤(3)长度过滤(4)低复杂度过滤(5)adapter过滤&#…...
C++继承相关总结
文章目录前言1.继承的相关概念1.继承概念2.继承的相关语法3.基类和派生类对象赋值转换(赋值兼容规则)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(1)配置文件(2)实体类(3)Mapper(4)mybatis-config.xml2.TKMybatis(1)配置文件(2)实体类(3)M…...
37了解高可用技术方案,如冗余、容灾
高可用性技术方案是指在系统设计和架构中采用一系列措施来确保系统在遇到各种故障和问题时仍能保持持续的可用性,避免因单点故障而导致系统宕机、数据丢失等问题。其中包括冗余和容灾技术。 冗余技术: 冗余技术是指通过增加系统组件的冗余来提高系统可靠…...
jdb调试问题集锦
https://bbs.kanxue.com/thread-210049.htm蓝铁 1 2017-8-25 19:40 4 楼 0 根据提示,可知,出错的地方是,android.app.ActivityThread.handleBindApplication(), 行4,400 查看源码可以发现,代码中指向的是app.onCreate() …...
要和文心一言来一把你画我猜吗?
想和文心一言来一把你画我猜吗? ChatGPT的爆火,让AI对话模型再次走入大众视野。大家在感叹ChatGPT的智能程度时,总会忍不住想:如果我们也有自己的AI对话模型就好了。在社会的压力下,国内的厂商和研究机构也纷纷做出尝试…...
delete[] p->elems和free(p->elems)有什么区别?
delete[]和free()都是释放内存的函数,但它们具有不同的使用方法和适用情况。 delete[] 通常用于释放C中动态分配的数组空间。在使用new[]运算符分配内存时,应使用delete[]运算符来释放分配的内存。delete[] 运算符会调用每个数组元素的析构函数…...
CAS问题
CAS🔎什么是CAS🔎伪代码解析🔎CAS是如何实现原子性的🔎CAS的应用🌻实现原子类🌻实现自旋锁🔎ABA问题🌻ABA问题可能引起的BUG🌻ABA问题的解决方案🔎结尾&#…...
网络编程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 格式支持以下数据类型: 类型描述数字型(Number)JavaScript 中的双精度浮点型格式字符串型(String)双引号包裹的 Unicode 字符和反斜杠转义字符布尔型(Boolean)true 或 fal…...
Python函数简介
Python是一种高级编程语言,它的函数是其中一个非常重要的特性。在程序中,函数是一段被命名的代码块,它可以接受输入并且返回输出。本篇文章将介绍Python函数的基本概念、定义、调用和参数。 基本概念 在Python中,函数是由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兴奋的启动的时候! Error: JAVA_HOME is not set and could not be found. 他告诉我JAVA_HOME 没被找到? 我明明安装了java的,为什么找不到? java -version看了下发现是没问题的 解决: 后…...
《MySQL系列-InnoDB引擎35》索引与算法-B+树索引的使用
B树索引的使用 1 不同应用中B树索引的使用 在OLTP中,B树索引建立后,对该索引的使用应该只是通过该索引取得表中少部分的数据。这时建立B树索引才是有意义的,否则即使建立了,优化器也可能不选择使用索引。 在OLAP中,…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
基于Python的气象数据分析及可视化研究
目录 一.🦁前言二.🦁开源代码与组件使用情况说明三.🦁核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.🦁演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...
AWSLambda之设置时区
目标 希望Lambda运行的时区是东八区。 解决 只需要设置lambda的环境变量TZ为东八区时区即可,即Asia/Shanghai。 参考 使用 Lambda 环境变量...
Gitlab + Jenkins 实现 CICD
CICD 是持续集成(Continuous Integration, CI)和持续交付/部署(Continuous Delivery/Deployment, CD)的缩写,是现代软件开发中的一种自动化流程实践。下面介绍 Web 项目如何在代码提交到 Gitlab 后,自动发布…...
Qt 按钮类控件(Push Button 与 Radio Button)(1)
文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button(鼠标点击不放连续移动快捷键) Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...
