From e1c6b84e323d9553ed10d856976f42e90ea3df60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=B5=8E=E8=8A=9D?= Date: Sat, 27 Jul 2024 18:07:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(post):=20=E5=AE=8C=E5=96=84=E6=96=87?= =?UTF-8?q?=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../essays/Redis\350\257\246\350\247\243.md" | 375 +++++------ ...01\347\232\204\346\274\224\350\277\233.md" | 2 +- .../public/posts/essays/java-redis/index.html | 582 ++++++------------ .../redis-distributed-lock-evolve/index.html | 2 +- blog-site/public/posts/index.xml | 2 +- docs/index.xml | 2 +- docs/page/8/index.html | 2 +- docs/posts/essays/java-redis/index.html | 582 ++++++------------ .../redis-distributed-lock-evolve/index.html | 2 +- docs/posts/index.xml | 2 +- docs/tags/redis/index.xml | 2 +- .../index.xml" | 2 +- .../tags/\350\257\246\350\247\243/index.xml" | 2 +- 13 files changed, 559 insertions(+), 1000 deletions(-) diff --git "a/blog-site/content/posts/essays/Redis\350\257\246\350\247\243.md" "b/blog-site/content/posts/essays/Redis\350\257\246\350\247\243.md" index 8a390b077..1fb21c17f 100644 --- "a/blog-site/content/posts/essays/Redis\350\257\246\350\247\243.md" +++ "b/blog-site/content/posts/essays/Redis\350\257\246\350\247\243.md" @@ -7,158 +7,85 @@ slug: "java-redis" --- -## Redis概述 -参考文章: -- [https://www.runoob.com/redis/redis-intro.html](https://www.runoob.com/redis/redis-intro.html) -- [https://www.redis.com.cn/redis-interview-questions.html](https://www.redis.com.cn/redis-interview-questions.html) - -### 什么是Redis -Redis(**Remote Dictionary Server**) Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API 的**非关系型数据库**。 - -**简而言之,Redis是一个可基于内存亦可持久化的日志型、Key-Value非关系型数据库。** - -### 非关系型数据库 -非关系型数据库,简称NoSql,是Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称,泛指非关系型的数据库。 -NoSql 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。 - -NoSql特点: -- 不遵循SQL标准; -- 不支持ACID; -- 远超于SQL的性能; +## 概述 +`Redis`全称`Remote Dictionary Server`,是一个开源的使用`ANSI C`语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、`Key-Value`数据库,并提供多种语言的API的非关系型数据库。 +简而言之,`Redis`是一个可基于内存亦可持久化的日志型、`Key-Value`非关系型数据库。 -NoSql适用场景: -- 对数据高并发的读写; -- 海量数据的读写; -- 对数据高可扩展性的; +非关系型数据库,简称`NoSQL`,是`Not Only SQL`的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称,泛指非关系型的数据库。 +`NoSQL`不依赖业务逻辑方式存储,而以简单的`Key-Value`模式存储。因此大大的增加了数据库的扩展能力。 -NoSql不适用场景: -- 需要事务支持; -- 基于sql的结构化查询存储,处理复杂的关系,需要及时查询; -- 用不着sql的和用了sql也不行的情况,请考虑用NoSql; - -传统数据库遵循 ACID 规则。而 Nosql 一般为分布式,而分布式一般遵循 [CAP](/iblog/posts/essays/java-transaction/#cap理论) 定理。 - -### Redis相关知识 -Redis 默认16个数据库,类似数组下标从0开始,初始默认使用0号库。可使用命令 `select `来切换数据库。如: `select 8` 。 - -Redis是单线程+[多路IO复用技术](/iblog/posts/rookie/rookie-io/#reactor-模型) - -**多路复用:** -指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行,比如使用线程池。 +`Redis`提供高性能的内存存储和丰富的数据结构支持,具备灵活的持久化机制以及强大的高可用性和分布式扩展能力。同时,`Redis`通过事务和脚本增强了操作的原子性和灵活性。 +但是`Redis`面临内存限制问题,大数据集存储可能受限;持久化操作可能对性能造成影响;单线程模型在高并发情况下可能成为瓶颈;复杂的数据结构和操作也可能需要额外的优化。 -**Redis与原子性:** -所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。 -在单线程中,能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于指令之间;在多线程中,不能被其它进程或线程打断的操作就叫原子操作; -**Redis命令的原子性主要得益于Redis的单线程机制。** +`Redis`主要用于缓存数据、会话存储、实时数据处理、排行榜和计数器、分布式锁、发布/订阅系统、数据过期管理和全页缓存等场景。 +其高性能、支持丰富数据结构和操作的特性,使其成为处理高并发、快速读写和实时数据需求的理想解决方案。 -Redis使用场景: -- 配合关系型数据库做高速缓存 - - 高频次,热门访问的数据,放入Redis中可降低数据库IO - - 分布式架构,做session共享 -- 多样的数据结构存储持久化数据 - - 利用zset排序,做排行榜功能、大数据去重; - - 利用Redis key的实效性数据,如将手机验证码放入Redis; - - 发布订阅消息系统,构建队列; - - 利用Redis的原子性来做计数器、秒杀等; - -Redis特点: -- Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用; -- Redis 支持数据的备份,即master-slave模式的数据备份; -- Redis 可以存储键与不同数据结构类型之间的映射: - -Redis优点: -- 性能极高 – 因为是纯内存操作,Redis能读的速度是110000次/s,写的速度是81000次/s; -- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性; -- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作; -- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来; +## Redis数据类型 +Redis可以存储键和不同类型的值之间的映射。键的类型只能为字符串,值常见有五种数据类型,字符串、列表、集合、散列表、有序集合,`Redis`后续的更新中又新添加了位图、地理位置等数据类型。 -Redis缺点: -- Redis 的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 +| 数据类型 | 描述 | 使用场景 | +|-------------------|--------------------------------------------------|----------------------------------------| +| 字符串(String) | 最基本的数据类型,存储文本或二进制数据。 | 缓存、会话存储、简单数据存储 | +| 哈希(Hash) | 存储键值对集合,适用于表示对象或字典。 | 用户信息存储、配置管理 | +| 列表(List) | 双端链表,支持有序的元素集合。 | 消息队列、任务调度、栈操作 | +| 集合(Set) | 无序且不允许重复元素的集合。 | 标签管理、去重、社交网络好友关系 | +| 有序集合(Sorted Set) | 每个元素有一个分数,按分数排序。 | 排行榜、排名系统、延迟队列 | +| 位图(Bitmap) | 高效存储和操作位数据。 | 用户活跃度统计、权限管理 | +| 基数统计(HyperLogLog) | 用于估算唯一元素的数量,提供近似值。 | 大规模去重统计、唯一用户数统计 | +| 地理位置(Geospatial) | 存储和查询地理位置数据。 | 地理位置服务、位置附近的搜索 | +### String +`Redis`的`String`类型是`Redis`支持的最基本数据类型之一。它的主要特点是简单、高效,适用于存储和操作文本或二进制数据。 +`Redis` `String`类型是一种键值对存储结构,其中键是唯一的,值可以是任意的二进制数据,包括文本、图像等。`String`类型的值可以达到`512MB`,这是`Redis`中支持的最大值长度。 -### Redis基础命令 -> 如果你使用docker可以先启动Redis容器再用`docker exec -it <容器ID> redis-cli`命令进入redis客户端。 - -基础命令: -- 查看当前库所有key:`keys *` -- 判断某个key是否存在:`exists ` -- 查看key是什么类型:`type ` -- 删除指定的key数据:`del ` -- 根据value选择非阻塞删除,异步删除:`unlink ` -- 为给定的key设置过期时间:`expire key