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;

    //在每个单元测试前建立连接
    @BeforeEach
    void setUp(){
        //1.建立连接
        jedis = new Jedis("127.0.0.1",6379);
       // Jedis jedis = JedisConnectionFactory.getJedisFromPool();
        //2.设置密码
//        jedis.auth("");
        //3.选择库,默认为0
        jedis.select(0);
    }

    //在每个单元测试后关闭连接
    @AfterEach
    void tearDown(){
        if (jedis != null){
            jedis.close();
        }
    }

    //测试使用jedis访问redis
    @Test
    void 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;

    //在每个单元测试前建立连接
    @BeforeEach
    void setUp(){
        //1.建立连接
//        jedis = new Jedis("127.0.0.1",6379);
        Jedis jedis = JedisConnectionFactory.getJedisFromPool();
        //2.设置密码
//        jedis.auth("");
        //3.选择库,默认为0
        jedis.select(0);
    }

    //在每个单元测试后关闭连接
    @AfterEach
    void tearDown(){
        if (jedis != null){
            jedis.close();
        }
    }

    //测试使用jedis访问redis
    @Test
    void 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.1
    port: 6379
    password: cdut2019
    lettuce:
      pool:
        min-idle: 8
        max-wait: 1000ms
        max-active: 8
        max-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 {
    @Bean
    public 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中存储字符串类型的数据,可以阅读源码来了解一下。

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

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

相关文章

js常见的9种报错记录一下

js常见报错语法错误(SyntaxError)类型错误(TypeError)引用错误(ReferenceError)范围错误(RangeError)运行时错误(RuntimeError)网络错误&#xff08;NetworkError&#xff09;内部错误&#xff08;InternalError&#xff09;URI错误&#xff08;URIError&#xff09;eval错误&a…

electron+vue3全家桶+vite项目搭建【五】集成Pinia全局状态管理

文章目录引入1.引入依赖2.集成Pinia3.使用pinia4.测试效果引入 在vue2的体系中&#xff0c;vuex是官方推荐的状态管理工具&#xff0c;而vue3的体系中&#xff0c;官网同样推荐了一款状态管理工具&#xff0c;他就是 Pinia Pinia官网 demo项目地址 1.引入依赖 npm install…

docker 安装运行 nacos2.0.3

目录 1、拉取镜像 2、挂载目录 mkdir -p /opt/nacos/logs/ #新建logs目录mkdir -p /opt/nacos/conf/ #新建配置目录vim /opt/nacos/conf/application.properties #修改配置文件 3、application.properties内容 4、初始化nacos的脚…

Vue的简单介绍

一、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;…

生成式 AI 背后的共同框架:Stable Diffusion、DALL-E、Imagen

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 框架 这些生成式 AI 的整体功能为&#xff1a;输入「文字」&#xff0c;返回「图像」&#xff0c;即 Text-to-image Gener…

DBeaver安装教程及基础使用手册

目录 一、简介 基本特性 二、DBeaver安装 三、连接SQL方法 一、简介 DBeaver是免费和开源&#xff08;GPL&#xff09;为开发人员和数据库管理员通用数据库工具。 它支持任何具有一个JDBC驱动程序数据库&#xff0c;也可以处理任何的外部数据源。 DBeaver 通过 JD…

自动化运维软件ansible

一、ansible 基于python语言。简单快捷&#xff0c;被管理端不需要启服务。直接走ssh协议,需要验证&#xff0c;所以机器多的话速度会较慢。 1、ansible环境搭建 5.确认和配置yum源(需要epel源) 免密登录复制的时候可以直接 写ip 不加参数-i 2、服务器分组&#xff08;主机清单…

java的Lambda表达式与方法引用详解

1. 定义 Lambda 表达式&#xff0c;也可称为闭包&#xff0c;它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数&#xff08;函数作为参数传递进方法中&#xff09;。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 1.1 通用定义 lambda 表达…

知识图谱实战应用4-知识图谱中寻找相似用户(协同过滤算法)

大家好&#xff0c;我是微学AI&#xff0c;今天给大家讲一下知识图谱中利用协同过滤算法寻找相似用户。大家会看到一个新的名词&#xff1a;“协同过滤”&#xff0c;下面来介绍一下协同过滤算法。 一、协同过滤算法 协同过滤算法是一种基于用户行为分析的推荐算法。它的基本…

php微信小程序java+Vue高校课程课后辅导在线教育系统nodejs+python

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.1 B/S架构 7 2.2 MySQL 介绍 7 2.3 MySQL环境配置 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 …

MySQL的查询完结,vju树状题组完结,cf补题

目录 MySQL 查询 比较条件 判空 逻辑条件 模糊条件 where in 聚合查询 排序查询 vju 线段树OR树状数组 - Virtual Judge cf Problem - A - Codeforces Problem - A - Codeforces Problem - B - Codeforces 周总结 MySQL 查询 比较条件 SELECT *FROM student WH…

细思极恐,第三方跟踪器正在获取你的数据,如何防范?

细思极恐&#xff0c;第三方跟踪器正在获取你的数据&#xff0c;如何防范&#xff1f; 当下&#xff0c;许多网站都存在一些Web表单&#xff0c;比如登录、注册、评论等操作需要表单。我们都知道&#xff0c;我们在冲浪时在网站上键入的数据会被第三方跟踪器收集。但是&#x…

[C++]C++基础知识概述

目录 C基础知识概述&#xff1a;&#xff1a; 1.什么是C 2.C发展史 3.C关键字 4.命名空间 5.C的输入输出 6.缺省参数 7.函数重载 8.引用 9.内联函数 10.auto关键字(C11) 11.基于范围的for循环(C11) 12.指针空值—nullptr(C11) C基础知识概述&#xff1…

React中使用lodash防抖失效解决

React中使用lodash防抖失效解决 import {Input} from antd; import lodash from lodash; // lodash下的防抖函数 const debounce lodash.debounce; // 防抖打印&#xff0c;希望输入的时候&#xff0c;延迟0.5s后打印值 const getSuggestion debounce((val:string) > {co…

SpringCloud微服务技术栈.黑马跟学(九)

SpringCloud微服务技术栈.黑马跟学 九今日目标1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾2.2.BASE理论2.3.解决分布式事务的思路3.初识Seata3.1.Seata的架构3.2.部署TC服务一、…

GPT-4老板:AI可能会杀死人类,已经出现我们无法解释的推理能力

来源: 量子位 微信号&#xff1a;QbitAI “AI确实可能杀死人类。” 这话并非危言耸听&#xff0c;而是OpenAI CEO奥特曼的最新观点。 而这番观点&#xff0c;是奥特曼在与MIT研究科学家Lex Fridman长达2小时的对话中透露。 不仅如此&#xff0c;奥特曼谈及了近期围绕ChatGPT…

《统计学习方法》学习笔记之第一章

统计学习方法的学习笔记&#xff1a;第一章 目录 第一节 统计学习的定义与分类 统计学习的概念 统计学习的分类 第二节 统计学习方法的基本分类 监督学习 无监督学习 强化学习 第三节 统计学习方法三要素 模型 策略 第四节 模型评估与模型选择 训练误差与测试误差 过…

Ubuntu设置清华源

本文为自己安装记录回顾用 下面的是ubuntu20.04Ubuntu 更换镜像源 Ubuntu默认的服务器是在国外&#xff0c;连接很慢。 更换成国内的镜像源&#xff0c;使用清华镜像源&#xff0c;连接就会快一点 下面介绍更换清华镜像源的方法 1.打开Ubuntu的控制台&#xff08;快捷键ctrlAlt…

Mysql事务(MVCC实现原理)、锁、sql优化

一.事务 数据库事务就是访问、操作各种数据的一个数据库操作序列, 是由事务开始到事务结束之间全部的执行过程组成的, 事务处理可以用来维护数据库的完整性, 保证成批的sql要么全部执行要么全部都不执行, 当然在mysql中只有使用了Innodb数据库引擎的数据库或表才有事务. 事…

2023值得我们关注的10种软件测试趋势

未来测试的趋势 随着软件在商业和日常生活中继续发挥关键作用&#xff0c;测试将不断发展以满足现代数字环境的需求。客户对软件得质量有着很高的要求并且测试时间应该更加快。因此&#xff0c;组织努力更快、更频繁地交付他们的软件&#xff0c;并且测试过程需要更多地集成到开…
最新文章