《程序猿之Redis缓存实战(1) · 基础知识》

news2024/9/29 2:04:02

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • Redis 技术简介
    • Redis 数据结构
    • Redis 客户端工具
    • Key 的专栏
      • Key 定义规范
      • Key 层级结构
    • SpringBoot 整合 Redis
    • 专栏预告
    • 总结陈词

写在前面的话

近期博客正在更新设计模式和微信小程序专栏,工作流引擎LiteFlow也才更新了一集。但由于工作繁忙起来,又忘记推迟更新进度了。

这天,刚好工作中遇到有新人提问Redis相关内容,顺势温习了之前的Redis知识,发现内容还不少,就先插播介绍一下。

荒废不多说,直接先从枯燥的基础部分来介绍。


Redis 技术简介

Redis是一个基于内存的 key-value 键值存储的、可持久化的数据库,并且提供了非常丰富的数据结构,同时还支持非常丰富的功能特性。

Redis官网:https://redis.io/

特征:

  • 键值(Key-Value)型,Value支持多种不同的数据结构,功能丰富
  • 单线程,每个命令具有原子性
  • 低延迟,速度快(基于内存、IO多路复用、良好的编码)
  • 支持数据持久化
  • 支持主从集群、分片集群
  • 支持多语言客户端

Redis 数据结构

Redis是典型的key-value数据库,key一般是字符串,而value包含很多不同的数据类型。

先看一下五大基础数据结构:

● 字符串(Strings): 存储字符串类型的值。
● 哈希表(Hashes): 存储字段和对应值的映射。
● 列表(Lists): 存储有序的字符串列表。
● 集合(Sets): 存储不重复的字符串集合。
● 有序集合(Sorted Sets): 类似集合,但每个元素都关联一个分数,可以按分数排序。

再看看新增的高级数据结构:

  • 位图(Bitmap)
  • 超日志(HyperLogLog)
  • 地理空间(Geospatial)

注意事项:

学习不同的数据结构,除了掌握他们的基础命令外,应该明确各种类型分别运用在什么场景,才是最主要的。


Redis 客户端工具

【使用官方 Redis Insight】

RedisInsight 是一个强大的图形用户界面工具,旨在帮助用户更好地管理和监控 Redis 数据库。它提供了丰富的功能,包括数据浏览、性能监控、查询分析等。如果你在寻找 Redis 的可视化工具,RedisInsight 是一个非常不错的选择。你可以从 Redis 的官方网站下载并安装它。

Redis Insight 是 Redis 官方推荐的客户端工具,功能非常的齐全,不过不支持中文。

【使用第三方工具 Tiny】

强烈推荐大家使用 Tiny RDM,UI 很好看,支持中文和字体设置。

官网地址:https://redis.tinycraft.cc/zh/

下载地址:https://github.com/tiny-craft/tiny-rdm/tree/main


Key 的专栏

Key 定义规范

【背景说明】

在 Spring Boot 项目中,Redis Key 的定义需要遵循一定的规范,以确保代码的可读性、可维护性和可扩展性。

在团队开发中,制定并遵循 Redis key 的命名规范不仅能提高代码的可读性和可维护性,还能减少潜在的错误和冲突。因此,团队应该重视并共同遵循这些规范,以提高整体开发效率和代码质量。

【规范说明】

1、Key 命名规范

  • 使用前缀:为不同的业务模块或功能使用不同的前缀,以避免 key 冲突,例如:user:1001:session。
  • 使用冒号分隔:使用冒号(:)分隔 key 的各个部分,使其结构清晰,例如:app:module:submodule:key。
  • 避免使用特殊字符:尽量避免使用空格、斜杠等特殊字符,以防止在某些情况下出现解析错误。
  • 使用有意义的: Key 的名称应该清晰地描述存储的数据类型和用途,避免使用过于简短或模糊的名称。
  • 使用小写字母: 为了保持一致性,建议使用小写字母命名 Key。

2、Key 的长度

控制 key 的长度:尽量保持 key 的简短,避免过长的 key 影响性能。一般建议不超过 64 个字符。

3、使用常量类

在 Spring Boot 项目中,可以定义一个常量类来集中管理 Redis 的 key。

这样可以避免硬编码,提高代码的可读性和可维护性。

另外,如果项目中有多个模块,建议集中管理 Redis 的 key 定义,避免各个模块之间的 key 冲突。

public class RedisKeys {
    public static final String USER_SESSION_PREFIX = "user:";
    public static String getUserSessionKey(Long userId) {
        return USER_SESSION_PREFIX + userId + ":session";
    }
}

4、版本控制(可选)

在 key 中加入版本号,以便在需要时进行 key 的迁移或更新。例如:user:v1:1001:session。

5、使用 Hash 数据结构(按需)

使用 Hash:对于相关联的数据,可以使用 Redis 的 Hash 数据结构来存储,减少 key 的数量。

例如,存储用户信息时,可以使用 user:1001 作为 key,用户的各个属性作为 Hash 的字段。

6、设置过期时间(按需)

对于临时数据,设置合理的过期时间,避免 Redis 中存储过多无用数据。

7、监控和清理(可选)

监控使用情况,定期监控 Redis 的 key 使用情况,清理不再使用的 key。

8、文档化(可选)

文档化 key 的用途:为每个 key 的命名和用途编写文档,方便团队成员理解和使用。

9、避免使用用户输入(可选)

避免直接使用用户输入:在生成 key 时,避免直接使用用户输入的内容,以防止注入攻击或意外的 key 冲突。


Key 层级结构

【问题背景】

Redis 没有类似数据库表空间和表的概念,那么我们该如何区分不同业务类型的Key呢?

如果都根据id直接作为Key,那如果用户ID和订单ID重复的话,岂不是乱套了?

答案是,我们可以通过给key添加前缀加以区分,不过这个前缀不是随便加的,有一定的规范。

【层级结构】

  • key允许有多个单词形成层级结构,多个单词之间用:隔开,格式:项目名:业务名:id
  • 以项目名称是portal,业务是user,以此缓存为例,可以是portal:user:001
  • 注意如果业务是通用的,也可以省去项目层级,直接使用user:001
  • 在Redis的客户端工具中,也会以相同前缀作为层次结构,让数据看起来层次分明,关系清晰。

SpringBoot 整合 Redis

【知识介绍】

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

官网地址:https://spring.io/projects/spring-data-redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

【具体步骤】

Step1、引入依赖

<!-- 整合Redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!-- JSON处理 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>${fastjson.version}</version>
</dependency>

Step2、添加配置

spring:
  data:
    redis:
      host: 192.168.75.129    # Redis服务器地址
      port: 6379              # Redis服务器连接端口
      password: lyd           # Redis服务器连接密码(默认为空)
      database: 0              # Redis数据库索引(默认为0)
      # 建议不要采用url的方式
      # url: redis://192.168.75.129:6379     # Redis服务器的连接URL,在Spring中相当于是password+ip+port,格式为:redis://[password@]host:port[/database]
      timeout: 60s             # 连接空闲超过N(s秒、ms毫秒,不加单位时使用毫秒)后关闭,0为禁用,这里配置值和tcp-keepalive值一致
      # Lettuce连接池配置
      lettuce:
        pool:
          max-active: 10       # 允许最大连接数,默认8(负值表示没有限制),推荐值:大于cpu * 2,通常为(cpu * 2) + 2
          max-idle: 8          # 最大空闲连接数,默认8,推荐值:cpu * 2
          min-idle: 0          # 最小空闲连接数,默认0
          max-wait: 5s         # 连接用完时,新的请求等待时间(s秒、ms毫秒),超过该时间抛出异常,默认-1(负值表示没有限制)

Step3、添加自定义RedisTemplate

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        // 设置键序列化器为 StringRedisSerializer,所有的键都会被序列化为字符串
        redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
        redisTemplate.setHashKeySerializer(StringRedisSerializer.UTF_8);

        // 设置值序列化器为 GenericJackson2JsonRedisSerializer,所有的值都会被序列化为 JSON 格式
        GenericFastJsonRedisSerializer serializer = new GenericFastJsonRedisSerializer();
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashValueSerializer(serializer);

        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }
}

Step4、测试效果

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringBaseTest {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void test() {
        redisTemplate.opsForValue().set("K1", "战神");
        System.out.println(redisTemplate.opsForValue()
                .get("K1"));
        System.out.println(stringRedisTemplate.opsForValue()
                .get("K1"));
    }
}

专栏预告

本篇仅仅是为了知识连贯性,先介绍一篇基础部分的,后续会针对Redis各项专栏进行实战讲解。

包含但不限于:

1、五大基础结构以及三大高级结构;

2、发布订阅模式;

3、流处理模式;

4、延迟队列;

5、分布式锁;

6、各类部署方案;

7、缓存数据库一致性;

8、持久化策略;

9、缓存三大问题;

10、其他专栏,比如序列化、事务等等。。。


总结陈词

本篇算是Redis系列文章的开篇,仅简单介绍了Redis的基础知识。后续会逐个将前面提到的知识领域在实战中的用法,全部展示出来。

💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

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

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

相关文章

OpenGL ES 绘制一个三角形(2)

OpenGL ES 绘制一个三角形(2) 简述 本节我们基于Android系统&#xff0c;使用OpenGL ES来实现绘制一个三角形。在OpenGL ES里&#xff0c;三角形是一个基础图形&#xff0c;其他的图形都可以使用三角形拼接而成&#xff0c;所以我们就的案例就基于这个开始。 在Android系统中…

添加vscode插件C/C++ snippets,快速生成LVGL .c/.h文件模版

文章目录 一、安装插件二、在安装目录下添加c.json和cpp.json文件①在 C:/Users/yourname/AppData/Roaming/Code/User/snippets/ 目录下创建 c.json 并填入如下内容&#xff1a;②在 C:/Users/yourname/AppData/Roaming/Code/User/snippets/ 目录下创建 cpp.json 并填入如下内容…

SQL学习1

24.9.28学习目录 一.数据库1.SQL语句基础2.匹配条件 一.数据库 对于嵌入式的数据库&#xff0c;其使用的是SQLite这种小型数据库&#xff1b; 在ubuntu中的下载方法 //字符界面 sudo apt-get install sqlite3//图形界面 sudo apt-get install sqlitemanSQLite特点&#xff1a…

windows系统中后台运行java程序

在windows系统中后台运行java程序&#xff0c;就是在启动java程序后&#xff0c;关闭命令行行窗口执行。 1、命令行方式 命令行方式运行java程序 启动脚本如下&#xff1a; echo off start java -jar app.jar exit启动后的结果如下 这种方式下&#xff0c;会马上启动一个命…

【RocketMQ】RocketMQ发送不同类型消息

&#x1f3af; 导读&#xff1a;本文介绍了RocketMQ消息队列系统中的几种消息发送模式及其应用场景&#xff0c;包括同步消息、异步消息以及事务消息。同步消息确保了消息的安全性&#xff0c;但牺牲了一定的性能&#xff1b;异步消息提高了响应速度&#xff0c;适用于对响应时…

搬砖6、Python函数和模块的使用

函数和模块的使用 在讲解本章节的内容之前&#xff0c;我们先来研究一道数学题&#xff0c;请说出下面的方程有多少组正整数解。 事实上&#xff0c;上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。 可以用Python的程序来…

人工智能开发实战照片智能搜索功能实现

内容提要 项目分析预备知识项目实战 一、项目分析 1、提出问题 随着人民生活水平的提高和手机照相功能的日趋完美&#xff0c;我们不经意中拍摄了很多值得回忆的时刻&#xff0c;一场说走就走的旅行途中也记录下许多令人心动的瞬间&#xff0c;不知不觉之中&#xff0c;我们…

Time-MoE : 时间序列领域的亿级规模混合专家基础模型

Time-MoE : 时间序列领域的亿级规模混合专家基础模型 时间序列预测一直是量化研究和工业应用中的重要课题。随着深度学习技术的发展&#xff0c;大规模预训练模型在自然语言处理和计算机视觉领域取得了显著进展&#xff0c;但在时间序列预测领域&#xff0c;这些模型的规模和运…

【归回预测】归回预测│PSO-ELM与标准ELM多输入预测对比源代码

摘要 本文比较了基于粒子群优化&#xff08;PSO&#xff09;和标准极限学习机&#xff08;ELM&#xff09;算法的电力负荷多输入预测模型。利用真实电力负荷数据集&#xff0c;对两种方法的预测性能进行了全面的评估&#xff0c;使用了均方误差&#xff08;MSE&#xff09;、平…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款旅游类智能体的开发,来体验一下我的智能体『​​​​​​​厦门CityWalk』

目录 1.1、智能体运行效果 1.2、创作灵感来源 1.3、如何制作智能体 1.4、可能会遇到的几个问题 1.5、快速调优指南 『厦门CityWalk&#x1f680;』我的优质智能体&#xff1a;https://0nxj3k.smartapps.baidu.com/?_swebfr1&_swebScene3621000000000000 在当今这个全…

青动CRM V3.2.1

全面解决企业销售团队的全流程客户服务难题旨在助力企业销售全流程精细化、数字化管理&#xff0c;全面解决企业销售团队的全流程客户服务难题&#xff0c;帮助企业有效盘活客户资源、量化销售行为&#xff0c;合理配置资源、建立科学销售体系&#xff0c;提升销售业绩。标准授…

【宝藏妙招,轻松拿捏!】如何防止U盘资料被复制?U盘文件防拷贝的五种措施!

小李&#xff1a;“小张&#xff0c;你上次借我的U盘还回来的时候&#xff0c;我总觉得里面的资料好像被人动过了&#xff0c;有没有什么办法可以防止U盘里的资料被复制啊&#xff1f;” 小张&#xff1a;“当然有啦&#xff01;现在数据安全这么重要&#xff0c;防止U盘资料被…

贪心的思想

803.区间合并 给定 n 个区间 [li,ri]&#xff0c;要求合并所有有交集的区间。 注意如果在端点处相交&#xff0c;也算有交集。 输出合并完成后的区间个数。 例如&#xff1a;[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。 输入格式 第一行包含整数 n。 接下来 n 行&#x…

如何通过GSR排名系统迅速提升谷歌排名?

如果你希望在谷歌上迅速提升某个关键词排名&#xff0c;或者某个关键词无论怎么优化都无法上首页&#xff0c;那么GSR关键词排名系统你就可以关注一下&#xff0c;GSR系统可以在短时间内帮助你进一步提升至首页。与传统的SEO方法不同&#xff0c;GSR侧重于外部优化&#xff0c;…

C语言进阶版第13课—字符函数和字符串函数2

文章目录 1. strstr函数的使用和模拟实现1.1 strstr函数的使用1.2 模拟实现strstr函数1.3 strstr函数和strncpy函数、puts函数的混合使用 2. strtok函数的使用**3. strerror函数的使用** 1. strstr函数的使用和模拟实现 1.1 strstr函数的使用 strstr函数是用来通过一个字符串来…

《迁移学习》—— 将 ResNet18 模型迁移到食物分类项目中

文章目录 一、迁移学习的简单介绍1.迁移学习是什么&#xff1f;2.迁移学习的步骤 二、数据集介绍三、代码实现1. 步骤2.所用到方法介绍的文章链接3. 完整代码 一、迁移学习的简单介绍 1.迁移学习是什么&#xff1f; 迁移学习是指利用已经训练好的模型&#xff0c;在新的任务上…

牛顿迭代法求解x 的平方根

牛顿迭代法是一种可以用来快速求解函数零点的方法。 为了叙述方便&#xff0c;我们用 C C C表示待求出平方根的那个整数。显然&#xff0c; C C C的平方根就是函数 f ( x ) x c − C f(x)x^c-C f(x)xc−C 的零点。 牛顿迭代法的本质是借助泰勒级数&#xff0c;从初始值开始快…

【软件测试】最新Linux大全(超详细!超级全!)

目录 前言1. 操作系统是干什么的2. Linux 是什么3. 为什么要学习 Linux4. Linux 发行版本5. Linux 系统特点6. Linux 安装7. Linux 系统启动8. Linux 操作方式9. Shell 与命令10. 命令格式 一、 Linux终端命令格式1. 终端命令格式2. 查阅命令帮助信息 二、 常用Linux命令的基本…

项目计划软件如何助力企业策略规划和执行监控

项目管理软件助力任务、时间和协作管理&#xff0c;如ZohoProjects集成了任务管理、时间跟踪、协作工具等功能&#xff0c;提高性价比&#xff0c;适合不同规模团队。其简化流程、专业度高&#xff0c;成为企业提升效率的重要工具。 一、项目计划软件的由来 项目计划软件的历史…

暴雨受邀出席2024 AI大模型生态算力峰会

9月25日&#xff0c;2024 AI大模型生态暨算力峰会在北京国家会议中心正式开幕&#xff0c;AI行业头部厂家、业界专家及人工智能行业精英齐聚一堂&#xff0c;暴雨华北大区产品总监丁海受邀出席并发表演《用AI奔赴新质生产力》的主题演讲&#xff0c;深度诠释了人工智能如何驱动…