发布时间:2026/8/14 13:17:29
Redis_基础篇 一、初识 Redis1、认识 NoSQL1.1 简介NoSQL Not Only SQL释义不仅仅是 SQL泛指非关系型数据库是区别于 MySQL、Oracle 这类传统关系型数据库 (RDBMS) 的数据库统称不采用关系模型表、行、字段、外键存储数据。1.2 NoSQL 和SQL 核心区别特性关系型数据库 (MySQL/Oracle)NoSQL (Redis/MongoDB 等)数据结构固定表结构、行列、字段、约束灵活无固定 schema【键值类型Redis】、【文档类型MongoDB】、【列类型HBase】、【graph类型Neo4j】事务完整 ACID 事务强一致性大多 BASE弱 / 最终一致性事务支持有限扩展性垂直扩容为主水平分库分表复杂天然支持分布式、横向无限扩容性能磁盘存储高并发读写性能一般内存 / 磁盘混合高并发读写性能极强适用场景1、结构化数据2、强事务订单、财务1、非结构化 / 半结构化2、高并发缓存、海量日志性能要求高3、对一致性、安全性要求不高2、认识 RedisRedis诞生于2009年全称是RemoteDictionaryServer远程词典服务器是一个基于内存的键值型NoSQL数据库。特征键值key-value型value支持多种不同数据机构功能丰富单线程每个命令具备原子性低延迟速度快基于内存、IO多路复用、良好的编码支持数据持久化支持主从集群、分片集群支持多种语言客户端3、安装 Redis由于大多数企业都是基于Linux服务器来部署项目而且Redis官方也没有提供Windows版本的安装包。因此文章中采用基于Linux系统来安装Redis进行演示。此处选择的Linux版本CentOS 9. Redis版本redis-8.8.0Redis的官方https://redis.io/ Redis安装包下载地址Index of /releases/3.1 安装Redis依赖Redis是基于C语言编写的因此首先需要安装Redis所需要的gcc依赖yum install -y gcc tcl3.2 上传安装包并解压上传完成后进行解压并指定解压后存储的目录也可不指定与安装包在同一目录下也可以。tar -zxvf redis-8.8.0.tar.gz -C /usr/local/解压完成后进入Redis目录运行编译命令make make install默认的安装路径是在/usr/local/bin目录下出现图中的信息代表安装成功可以进行运行了。该目录已经默认配置到环境变量因此可以在任意目录下运行这些命令。其中redis-cli是Redis提供的命令行客户端redis-server是Redis的服务端启动脚本redis-sentinel是Redis的哨兵启动脚本3.3 启动Redis的启动方式有很多种例如3.3.1、默认启动命令redis-server这种启动属于前台启动会阻塞整个会话窗口窗口关闭或者按下CTRLC则Redis停止。不推荐使用。3.3.2、指定配置启动如果要让Redis以后台方式启动则必须修改Redis配置文件就在我们之前解压的Redis安装包下/usr/local/src/redis-8.8.0名字叫redis.conf。在修改配置文件之前先进行备份以防有误时方便回滚修复。cp redis.conf redis.conf.bck然后修改redis.conf文件中的一些配置# 监听的地址, 默认是127.0.0.1, 会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问, 生产环境不要设置为0.0.0.0 bind 0.0.0.0 # 守护进程, 修改为yes后即可后台运行 daemonize yes # 密码, 设置后访问Redis必须输入密码 requirepass 123456Redis的其他常见配置# 监听的端口 port 6379 # 工作目录, 默认是当前目录, 也就是运行redis-server时的命令, 日志、持久化等文件会保存在这个目录 dir . # 数据库数量, 设置为1, 代表只使用1个库, 默认有16个库, 编号0~15 databases 1 # 设置redis能够使用的最大内存 maxmemory 512mb # 日志文件, 默认为空, 不记录日志, 可以指定日志文件名 logfile redis.log启动Redis:# 进入Redis安装目录 cd /usr/local/redis-8.8.0 # 启动 redis-server redis.conf停止服务# 利用redis-cli来执行 shutdown 命令即可停止Redis服务 # 因为之前配置了密码因此需要通过 -u 来指定密码 redis-cli -u 123456 shutdown3.3.3、开机自启我们也可以通过配置来实践开机自启。首先新建一个系统服务文件vim /etc/systemd/system/redis.service内容如下[Unit] Descriptionredis-server Afternetwork.target [Service] Typeforking ExecStart/usr/local/bin/redis-server /usr/local/redis-8.8.0/redis.conf PrivateTmptrue [Install] WantedBymulti-user.target添加完成后需要进行重载系统服务让配置文件生效systemctl daemon-reload现在我们可以使用下面这组命令来操作Redis了# 启动 systemctl start redis # 停止 systemctl stop redis # 重启 systemctl restart redis # 查看状态 systemctl status redis执行下面的命令可以让Redis开启自启# 设置开机自启Redis的命令 systemctl enable redis # 查看Redis启动进程 ps -ef|grep redis出现下图内容就代表设置成功了3.3.4、Redis命令行客户端进入Redis的安装目录/usr/local/bin/下的redis-cli就是Redis命令行的客户端启动命令。连接客户端执行redis-cli -h 127.0.0.1 -p 6379 -a 123456-hRedis服务器IP地址-pRedis服务端口号-aRedis连接密码校验是否连接成功输入命令ping客户端会响应pong使用-a 密码连接后会有警告提示如图如果不想看到该警告提示那么在连接的时候可以不指定 -a 在连接成功后使用 auth 密码 如图二、Redis 常见命令1、5种常见数据结构Redis是一个kue-value的数据库key一般是string类型不过value的类型多种多样value类型示例说明分类Stringhello world字符串形式基本类型Hash{name: Jack, age: 23}哈希表基本类型List[A - B - C - C]有序集合本质是链表基本类型Set{A, B, C}无序不重复的集合基本类型SortedSet{A:1, B:2, C:3}有序的不重复的集合基本类型GEO{A: (120.3, 30.5) }地理坐标特殊类型BitMap0110110101110101011按位存储的Map特殊类型HyperLog0110110101110101011按位存储特殊类型除了上述的数据类型还有很多其他的数据类型。2、通用命令通过指令是部分数据类型的都可以使用的指令常见的有KEYS查看符合模版的所有key。通过help [command] 可以查看一个命令的具体用法例如DEL删除一个或多个指定的key多个key用空格分开删除不存在的key不会报错。EXISTS判断key是否存在存在返回1不存在返回0。EXPIRE给一个key设置有效期单位是秒有效期到期时该key会被自动删除。例如短信验证码TTL查看一个key的剩余有效期当查看的key返回-2时代表库中已不存在该key当返回的是-1时代表该key是永久有效。Redis提供的数据操作命令可通过以下两种方式进行查看1、官方网站commands介绍https://redis.io/docs/latest/commands/redis-8-8-commands/2、Redis命令行客户端输入help 后按tab键进行切换数据类型或者直接在符号后输入需要查看的数据类型名称。help 数据类型名称3、不同数据结构的操作命令key 的结构Redis 的 key 允许有多个单词形成层级结构多个单词之间用:隔开格式如下项目名:业务名:类型:id这个格式并非固定也可以根据自己的需求来删除或添加词条。例如我们的项目名称叫 yuxi有 user 和 product 两种不同类型的数据我们可以这样定义 keyuser 相关的 key: yuxi:user:1product 相关的 key: yuxi:product:1如果 Value 是一个 Java 对象例如一个 User 对象则可以将对象序列化为 JSON 字符串后存储KEYVALUEyuxi:user:1{id:1, name: Jack, age: 21}yuxi:product:1{id:1, name: 小米11, price: 4999}3.1、String类型String类型也就是字符串类型是Redis中最简单的存储类型其value是字符串不过根据字符串的格式不同又可以分为3类string普通字符串int整数类型可以做自增、自减操作float浮点类型可以做自增、自减操作不管是哪种格式底层都是字节数组形式存储只不过编码方式不同。字符串类型的最大空间不超过512M。KEYVALUEmsghello worldnum10score99.53String的常见命令有SET添加或者修改已经存在的一个 String 类型的键值对GET根据 key 获取 String 类型的 valueMSET批量添加多个 String 类型的键值对MGET根据多个 key 获取多个 String 类型的 valueINCR让一个整型的 key 自增 1INCRBY: 让一个整型的 key 自增并指定步长例如incrby num 2 让 num 值自增 2INCRBYFLOAT让一个浮点类型的数字自增并指定步长SETNX添加一个 String 类型的键值对前提是这个 key 不存在否则不执行SETEX添加一个 String 类型的键值对并且指定有效期3.2、Hash类型hash类型也叫散列其value是一个无序字典类似于Java中的HashMap结构。String结构是将对象序列化为JSON字符串后存储当需要修改对象某个字段时很不方便KEYVALUEyuxi:user:1{name:jack,age:21}yuxi:user:2{name:rose,age:22}Hash结构可以将对象中的每个字段独立存储可以针对单个字段做CRUDKEYVALUEfieldvalueyuxi:user:1namejackage21yuxi:user:2nameroseage22Hash类型的常见命令HSET key field value添加或者修改hash类型key的field的值HGET key field获取一个hash类型的key的field的值HMSET批量添加多个hash类型key的field的值HMGET批量获取多个hash类型key的field的值HGETALL获取一个hash类型的key中的所有的field和valueHKEYS获取一个hash类型的key中所有的fieldHVALS获取一个hash类型的key中所有的valueHINCRBY让一个hash类型key的字段值自增并指定步长HSETNX添加一个hash类型的key的field值前提是这个field不存在否则不执行3.3、List类型Redis中的List类型与Java中的linkedlist类似可以看做是一个双向链接表结构。既可以支持正向检索也可以支持反向检索。特征也与linkedList类似有序元素可以重复插入和删除快插叙速度一般常用来存储一个有序数据例如朋友圈点赞列表评估列表等。List的常用命令LPUSH Key element...向列表左侧插入一个或多个元素LPOP Key移除并返回列表左侧的第一个元素没有则返回nilRPUSH Key element...向列表右侧插入一个或多个元素RPOP Key移除并返回列表右侧的第一个元素LRANGE Key start end返回一段角标范围内的所有元素BLPOP和BRPOP与LPOP和RPOP类似只不过在没有元素时等待指定时间而不是直接返回nilLPUSH示例RPUSH示例LPOP与RPOP示例3.4、Set类型Redis的Set结构与Java中的HashSet类似可以看做一个value为null的hashmap。因为也是一个hash表因此具备与hashSet类似的特征无序元素不可重复查找快支持交集、并集、差集等功能Set类型的常见命令SADD Key member... 向Set中添加一个或多个元素SREM Key member.. 移除Set中的指定元素SCARD Key返回Set中元素的个数SISMEMBER key member 判断一个元素是否存在于Set中SMEMBERS获取Set中的所有元素SINTER key1 key2 ... 求Key1与Key2的交集SDIFF Key1 Key2... 求Key1与Key2的差集SUNION Key1 Key2... 求Key1与Key2的并集3.5、SortedSet类型Redis的sortedSet是一个可排序的Set集合与Java中的treeSet有些类似但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性可以基于score属性对元素排序底层的实现是一个跳表skipList加上hash表。SortedSet具备下列特性可排序元素不重复查询速度快因为sortedSet的可排序特性经常被用来实现排行榜这样的功能。SortedSet 的常见命令有ZADD key score member添加一个或多个元素到 sorted set如果已经存在则更新其 score 值ZREM key member删除 sorted set 中的一个指定元素ZSCORE key member获取 sorted set 中的指定元素的 score 值ZRANK key member获取 sorted set 中的指定元素的排名ZCARD key获取 sorted set 中的元素个数ZCOUNT key min max统计 score 值在给定范围内的所有元素的个数ZINCRBY key increment member让 sorted set 中的指定元素自增步长为指定的 increment 值ZRANGE key min max按照 score 排序后获取指定排名范围内的元素ZRANGEBYSCORE key min max按照 score 排序后获取指定 score 范围内的元素ZDIFF、ZINTER、ZUNION求差集、交集、并集注意所有的排名默认都是升序如果要降序则在命令的 Z 后面添加 REV 即可。三、Redis 的 Java 客户端在Redis官网中提供了各种语言的客户端地址redis官网Spring Data RedisJedis以Redis命令作为方法名称、学习成本低简单实用。但是Jedis实例是线程不安全的多线程环境下需要基于连接池来使用。地址Jedis 指南 | Redis - Redis 教程lettuceLettuce是基于Netty实现的支持同步、异步和响应式编程方式并且是线程安全的。支持Redis哨兵模式、集群模式和管道模式。地址Lettuce 指南 | Redis - Redis 教程RedissonRedisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如Map、queue、lock、semaphore、atomicLong等强大功能1、Jedis 客户端1.1 引入依赖dependency groupIdredis.clients/groupId artifactIdjedis/artifactId version7.2.0/version /dependency​1.2 建立连接1.2.1、Jedis直连方式// 建立连接Host主机地址port端口号默认是6379 Jedis jedis new Jedis(host, port); // 设置密码 jedis.auth(passworld); // 选择库可以不指定默认连接的是0号库 jedis.select(num);​1.2.2、 Jedis连接池方式Jedis本身是线程不安全的并且频繁的创建和销毁连接会有性能损耗因此推荐使用Jedis连接池来代替Jedis的直连方式。public class JedisConnectionFactory { private static final JedisPool jedisPool; static { // 配置链接池 JedisPoolConfig jedisPoolConfig new JedisPoolConfig(); // 最大连接数 jedisPoolConfig.setMaxTotal(8); // 最大空闲连接 jedisPoolConfig.setMaxIdle(8); // 最小空闲连接 jedisPoolConfig.setMinIdle(0); // 设置最长等待时间单位ms jedisPoolConfig.setMaxWaitMillis(1000); // 创建连接池对象 jedisPool new JedisPool(jedisPoolConfig, 10.211.55.8, 6379, 1000, 123456); } // 获取Jedis对象 public static Jedis getJedis() { return jedisPool.getResource(); } }​​1.3 测试String数据类型// 存入数据 String result jedis.set(name, jack); System.out.println(result result); // 获取数据 String name jedis.get(name); System.out.println(name name);​1.4 释放资源 直连方式jedis.close()​注方法头上使用的 BeforeEach 与 AfterEach 注解是单元测试中的生命周期注解作用于每个测试方法执行前后。1. BeforeEach作用每一个 Test 方法执行之前自动运行适用场景初始化测试对象、创建数据库连接重置变量、初始化 Mock打开文件、初始化页面等前置准备2. AfterEach作用每一个 Test 方法执行完成后自动运行无论测试成功 / 失败都会执行 适用场景关闭流、断开数据库连接清理临时数据、删除测试产生的数据释放资源、重置环境2、SpringDataRedis 客户端SpringData是Spring中数据操作的模块包含对各种数据库的集成其中对Redis的集成模块就叫做SpringDataRedis官网地址Spring Data Redis提供了对不同Redis客户端的整合Lettuce和Jedis提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于lettuce的响应式编程支持基于JDK、JSON、字符串、Spring对象的数据序列化和反序列化支持基于Redis的JDKCollection实现SpringDataRedis 中提供了 RedisTemplate 工具类其中封装了各种对 Redis 的操作。并且将不同数据类型的操作 API 封装到了不同的类型中API返回值类型说明redisTemplate.opsForValue()ValueOperations操作 String 类型数据redisTemplate.opsForHash()HashOperations操作 Hash 类型数据redisTemplate.opsForList()ListOperations操作 List 类型数据redisTemplate.opsForSet()SetOperations操作 Set 类型数据redisTemplate.opsForZSet()ZSetOperations操作 SortedSet 类型数据redisTemplate—通用的命令2.1、引入依赖采用springboot项目进行演示勾选NoSQL中勾选Spring Data Redis!--spring-boot-starter-data-redis依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency !--commons-pool2依赖-- dependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId /dependency2.2、在aplication.yml中配置Redis信息spring: data: redis: host: 10.211.55.8 port: 6379 password: 123456 timeout: 1000ms lettuce: pool: max-active: 8 max-idle: 8 min-idle: 8 max-wait: 1000ms2.3、注入RedisTemplate2.4、SpringDataRedis的序列化方式RedisTemplate可以接收任意Object作为值写入Redis只不过写入前会把Object序列化为字节形式默认是采用JDK序列化得到的结果是这样的缺点可读性差内存占用较大我们可以自定义RedisTemplate的序列化方式代码如下pom.xml中引入依赖!--jackson依赖-- dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId /dependency自定义序列化方式Configuration public class RedisConfig { Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory) { // 创建RedisTemplate对象 RedisTemplateString, Object template new RedisTemplate(); // 设置连接工厂 template.setConnectionFactory(connectionFactory); // 创建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer new GenericJackson2JsonRedisSerializer(); // 设置键的序列化器 template.setKeySerializer(RedisSerializer.string()); // 设置哈希键的序列化器 template.setHashKeySerializer(RedisSerializer.string()); // 设置值的序列化器 template.setValueSerializer(jsonRedisSerializer); // 设置哈希值的序列化器 template.setHashValueSerializer(jsonRedisSerializer); return template; } }运行测试结果Redis可视化界面尽管JSON的序列化方式可以满足我们的需求但依然存在一些问题如上图Keyuser:100value{class: com.yuxi.redisdemo.com.yuxi.redis.config.com.yuxi.redis.pojo.User,name: 张三,age: 21}为了在反序列化时知道对象的类型JSON序列化器会将类的class类型写入JSON结果中存入Redis会带来额外的内存开销。占用103B为了节省内存空间我们并不会使用JSON序列化器来处理value而是统一使用String序列化器要求只能存储String类型的Key和value。当需要存储Java对象时手动完成对象的序列化和反序列化。Spring默认提供了一个StringRedisTemplate类它的Key和value的序列化方式默认就是String方式。省去了我们自定义redisTemplate的过程。内存占用26B。与JSON序列化对比节省了不少的内存空间并且数据也清晰简明。但是代码量会相对多了手动处理部分各有优缺具体选用还需根据自身情况与业务进行。

相关新闻

2026/8/14 13:12:29

目视化建设赋能线下实体,释放商超酒店餐饮门店商业价值

当下线下实体行业竞争激烈,商超、酒店、餐饮及各类门店,想要站稳脚跟,离不开体验感、规范性与辨识度。目视化管理作为直观高效的管理工具,将制度、流程、安全规范转化为可视化标识,简化管理、优化体验,现已…

2026/8/14 13:12:29

清远市建设局网站:揭秘城市发展的数字化引擎与办事指南全解析

在这个快节奏的时代,我们每个人都像是被无形的大鞭子驱赶着的陀螺,转个不停。特别是在清远这座充满活力与潜力的城市里,每一个致力于在这里扎根、创业或者只是单纯想拥有一个舒适家园的人,都时刻关注着脚下的这片土地正在发生怎样的变化。提到城市发展,很多人脑海中浮现的…

2026/8/14 14:17:38

图像校正算法如何消除摆放位置偏移的影响的?

你是否也有过这样的疑问:在电商平台购买衣服时,看到模特图旁边标注着精确的尺码数据,但衣服在图片中的摆放角度千变万化——有的平铺,有的微微倾斜,甚至有些褶皱。这些“放歪了”的衣服,其尺寸究竟是如何被…

2026/8/14 14:17:38

儿童主题网站的内容建设怎么做才能既吸引孩子又让家长放心全方位指南

做儿童主题网站的内容建设,这活儿看着挺光鲜亮丽,实则是个细致活儿。很多刚入行的人,以为把页面做得花哨点,颜色鲜艳点,把动画片截图放上去,就能招揽到小粉丝。结果呢?访客停留时间短得可怜,跳出率高得吓人。为什么呢?因为你没懂“内容建设”这四个字的分量。对于儿童…

2026/8/14 14:17:38

如何用 JADX 反编译 APK?从安装到导出 Java 源码的完整实战

如何用 JADX 反编译 APK?从安装到导出 Java 源码的完整实战 【免费下载链接】jadx Dex to Java decompiler 项目地址: https://gitcode.com/gh_mirrors/ja/jadx JADX 是一款老牌开源工具,能把 APK、DEX 这类 Android 安装包还原成接近原始样子的 …

2026/8/14 14:17:38

动作捕捉设备怎么选?从入门到专业,一篇读懂选购逻辑

动作捕捉技术早已不是好莱坞大片的专属。从影视动画、游戏开发到虚拟直播、体育科研,甚至人形机器人训练,动捕设备正走进越来越多创作者和研究者的工作台。但面对光学、惯性、无标记AI等多种技术路线,如何选对一套适合自己的动捕系统&#xf…

2026/8/14 4:27:24

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/14 4:27:24

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/14 0:00:09

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:09

VSCode高效Git管理:从入门到实战技巧

1. 为什么选择VSCode进行Git代码管理作为微软推出的轻量级代码编辑器,Visual Studio Code(简称VSCode)已经成为全球开发者使用率最高的编辑器之一。根据2023年Stack Overflow开发者调查,VSCode的市场占有率高达74.48%。它内置的Gi…

2026/8/14 4:27:24

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/14 4:27:24

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/14 4:27:24

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…