Redis
1.windows安装redis服务
(1)命令行启动和停止服务
(2)配置文件--redis.windows.conf和redis.windos-service.conf
redis的windows版本安装目录下有两个配置文件:
(1)redis.windows-service.conf
(2)redis.windows.conf
默认加载的配置文件是redis.windows-service.conf,想要加载配置redis.windows.conf,运行redis-server redis.windows.conf即可。
note:不推荐对原始的redis.windows-service.conf进行修改,重新建立一个配置文件,运行自定义配置文件即可。
常用配置项
配置项 | 配置参数 | 说明 |
bind | 127.0.0.1 | 绑定地址:如果需要远程访问,注释此行 |
port | 6379 | 端口,默认6379 |
dbfilename | dump.rdb | 数据文件 |
dir | 数据文件目录 | 数据文件存储路径(提前创建/var/lib/redis目录),dir的默认值为./,表示当前目录 |
logfile | redis.log | 设置日志文件 |
database | 16 | 设置redis数据库总量 |
requirepass | 123456 | 设置使用密码 |
maxmemory | 1000000 | 设置最大使用内存 |
Windows不支持daemonize和pidfile,但可以将redis作为一项windows服务运行,指定一个logfile文件,logfile将包含运行的pid。
最好加一个访问认证,Redis因为支持高并发,暴力破解风险更大,需要复杂密码
(3)客户端测试
登录服务器
-h 服务器地址host
-p 服务器端口号 port
-a 服务器密码 accesskey
2.为什么不使用语言自带的内存管理来处理键值对而要使用redis?
(1) 跨进程存储与共享数据
- 内存管理: 编程语言自带的内存管理(例如,Java的
HashMap
、Python的字典)通常局限于单个进程内的内存。当进程结束或崩溃时,内存中的数据会丢失。而Redis作为一个外部数据存储系统,能够跨多个进程和服务共享数据,即使服务重启或崩溃,数据仍然可以持久化。 - Redis: 通过网络,多个不同的进程、服务器、应用程序都可以访问Redis存储的键值对。这对于分布式系统尤为重要。
(2) 持久化数据
- 内存管理: 编程语言的内存管理不会自动持久化数据,一旦程序结束,内存中的数据就会丢失。
- Redis: 提供多种持久化机制,如RDB(定期快照)、AOF(日志追加文件),确保数据即使在系统崩溃后也能恢复。对于需要持久化的应用程序,Redis提供了可靠的数据存储。
(3)性能优化
- 内存管理: 内存管理在速度上有优势,但它局限于进程内存,当数据量超出可用内存时,程序可能会面临性能瓶颈或内存溢出。
- Redis: Redis经过精心设计,在内存和存储效率上都做了优化,特别是在处理大量数据时,它能够高效地执行各种数据操作。对于需要高并发、大规模存储的应用,Redis可以在性能上提供显著优势。
(4)分布式支持
- 内存管理: 编程语言自带的内存管理一般是单机环境下的解决方案,难以在多台机器之间共享内存或数据。
- Redis: Redis内置了分布式支持,可以通过集群配置和复制机制,实现高可用、高并发的分布式数据存储。这使得Redis非常适合用于分布式系统和大规模的缓存机制。
(5) 高级功能
- 内存管理: 大多数编程语言的内存管理工具提供的功能非常基础,仅支持基本的键值对存储和查找。
- Redis: Redis不仅支持简单的键值存储,还支持复杂的数据结构,如列表、集合、有序集合、哈希表、位图、HyperLogLog等,这些高级功能使得Redis能够满足更复杂的业务需求。
(6) 持久化策略与故障恢复
- 内存管理: 语言自带的内存管理不会提供内存的持久化和故障恢复机制。
- Redis: Redis提供了多种持久化和备份策略,可以配置数据持久化的周期和方式,确保在遇到硬件故障或软件问题时,数据能够安全地恢复。
(7) 简化开发与维护
- 内存管理: 直接在应用程序中处理内存会增加开发和维护的复杂度,尤其在处理大规模数据时,内存泄漏、并发问题等都会增加开发难度。
- Redis: Redis作为一个独立的服务,抽象了数据存储的细节,开发人员可以通过简单的API操作数据,而不需要考虑底层内存管理、并发控制等问题。
总结:
编程语言自带的内存管理通常用于处理小规模、短生命周期的数据存储,而Redis作为外部存储系统,则在大规模、高并发、持久化和分布式场景中表现得更加优越。通过Redis,开发者可以专注于应用逻辑的实现,而不必担心数据存储和管理的复杂细节,尤其是在处理大数据量和分布式环境时,Redis提供的强大功能和性能优化是语言内存管理无法比拟的。
3.Redis原子操作实现原理
Redis 的原子操作原理主要体现在其操作的原子性、事务支持以及对多个命令的执行顺序控制上。Redis通过以下机制确保操作的原子性:
(1) 单线程模型
- Redis 采用单线程模型来处理所有命令请求。具体来说,Redis 在处理客户端请求时,所有命令是按顺序执行的,并且每次只有一个命令在执行。由于没有多个线程同时操作数据,Redis 本身就避免了并发访问时可能出现的竞争条件和数据不一致的问题。
- 因为每个命令会被独立处理且只有一个命令在执行,Redis 能够确保命令的原子性 —— 即每个命令在执行时,不会被打断,直到完成为止。
(2)操作原子性
- Redis 提供的基本操作(如
SET
、GET
、INCR
等)都是原子性的。每个操作在执行时,不会受到其他命令的干扰。例如,如果你执行INCR
(自增)操作,它将以单一的操作来完成自增过程,在执行完成之前不会被中断。 - 这些操作是在单线程中顺序执行的,因此可以保证每个操作的原子性。
(3)事务(MULTI/EXEC)
- Redis 支持事务,但不同于传统的数据库事务。Redis 事务通过
MULTI
和EXEC
命令来实现。 - MULTI: 通过
MULTI
命令开始一个事务后,Redis 会将后续的命令放入事务队列中,而不是立即执行。这些命令在事务提交(EXEC
)时才会被执行。 - EXEC: 提交事务,通过
EXEC
命令来执行之前放入事务队列中的所有命令。事务中的命令在执行时是原子性的——要么全部成功,要么全部失败。 - WATCH: Redis 还支持
WATCH
命令,它用于监听某些键的变化。如果在事务执行之前某个键发生了变化,事务会被中止,从而避免由于并发操作引发的数据不一致问题。
(4)乐观锁(WATCH)
- Redis 提供的
WATCH
命令允许你对一个或多个键进行监视。在开始一个事务之前,通过WATCH
命令监视某个键,如果这些键在事务执行之前发生了变化,事务会被取消,从而确保操作的原子性。 - 这种机制称为乐观锁,它是一种基于“假设不会发生冲突”的锁定方式,适用于高并发场景。
(5)原子性操作的实现
- Redis 在内存中处理数据结构的操作,如
INCR
(自增)、DECR
(自减)、INCRBY
(增加指定值)等,都是通过原子性操作实现的。 - 这些操作在 Redis 的实现中通过简单的内存读写来完成,操作是一个原子步,即在执行过程中不会被其他命令中断。例如,
INCR
命令会先读取当前值、增加指定值、再将结果写回。这一系列的操作在 Redis 内部被当作一个单独的原子操作来执行。
(6)并发控制:锁机制与阻塞操作
- 虽然 Redis 是单线程的,但它通过阻塞命令来模拟锁的机制。例如,使用
BLPOP
和BRPOP
等命令来实现对队列的阻塞操作,这种操作可以确保队列的消费是原子性的。 - 由于 Redis 本身是单线程处理命令的,所以它能保证对共享资源的操作是不会被并发修改的。
(7)数据结构原子性
- Redis 支持多种高级数据结构,如 列表、集合、哈希表 和 有序集合。对这些数据结构的操作(如
LPUSH
、SADD
、HSET
等)都是原子性的。这意味着,无论你执行多少次这些操作,Redis 总是确保它们的顺序不会被其他命令打断,所有操作会按顺序完成。
总结
Redis 通过单线程模型、事务机制、乐观锁、原子命令等多种方式实现了原子性操作。单线程的设计使得每个命令都按顺序执行,因此避免了并发访问导致的数据冲突问题。而通过 MULTI
、EXEC
、WATCH
等命令,Redis 还能够在分布式系统中保证多个命令的原子性,从而满足更加复杂的事务需求。
4.redis使用单线程来保证原子性怎么支持高并发
Redis 采用单线程架构,但依然可以支持高并发,这是因为 Redis 的设计非常高效,它巧妙地利用了以下几个机制和特点:
(1)单线程的原子性保证
- Redis 的核心是基于事件驱动模型,通过单线程处理所有的请求,保证每个请求在执行时不会被其他请求打断。
- 这种方式天然地避免了线程切换、加锁和竞争等多线程带来的复杂问题,简化了原子操作的实现。
- Redis 操作基本都是在内存中完成的,单次操作非常快,单线程下可以迅速执行大量请求。
(2) I/O 多路复用机制
- 虽然 Redis 采用单线程处理命令,但它利用了I/O 多路复用技术(如
epoll
、select
或kqueue
等),让单个线程可以同时监听多个客户端连接。 - Redis 不需要为每个连接创建新的线程,而是通过事件循环机制轮询所有的连接,根据请求的状态快速处理请求。
- 这大大减少了线程上下文切换和系统调用开销,从而提高了并发处理能力。
(3) 高效的数据结构
- Redis 提供了多种高效的数据结构(如 hash、list、set、sorted set 等),这些数据结构都经过精心设计,具备 O(1) 或 O(log N) 的时间复杂度,确保了高性能读写操作。
- 这些数据结构的设计使得在单线程下,Redis 仍能快速处理大量请求。
(4) 请求的快速执行
- 由于 Redis 操作的数据都在内存中,且单个请求的执行速度非常快(通常在几微秒内)。即使在单线程下,Redis 也能在单位时间内处理大量的请求。
- 单个线程处理速度高,意味着即使同时有大量的请求,Redis 可以快速完成一个请求,然后立即处理下一个请求,从而实现高吞吐量。
(5)流水线(Pipeline)技术
- Redis 支持流水线机制,客户端可以将多个命令一次性发送给 Redis,Redis 批量处理这些命令后再统一返回结果。
- 这种机制减少了客户端与服务器之间的网络通信开销,进一步提升了性能。
(6)避免了多线程带来的锁竞争
- 在传统的多线程架构中,多个线程访问共享资源时会引入锁机制,造成锁竞争、上下文切换等开销。
- Redis 使用单线程架构避免了这些问题,减少了锁的消耗,让代码运行更加高效。
(7)水平扩展
- 当单个 Redis 实例无法满足并发需求时,可以通过 分片、集群 等机制进行水平扩展,使用多个 Redis 实例来分担压力。
- Redis Cluster 将数据分布到多个节点上,每个节点独立处理不同的请求,从而进一步提高整体并发能力。
总结
Redis 的单线程架构通过以下几个关键特性支持了高并发:
- I/O 多路复用 提高并发连接数;
- 内存操作 和高效的数据结构提供了超快的请求执行速度;
- 避免锁竞争,简化了操作流程;
- 流水线机制 和水平扩展(Redis 集群)进一步提升了吞吐能力。
在实际应用中,单线程的 Redis 结合高效的内存操作和设计,足以应对大多数场景的高并发需求。而当单实例无法满足时,可以通过集群和分片进一步扩展性能。
5.Redis性能测试
6.C#使用Redis
7.Redis缓存可能出现的问题
关联知识点
(1)关系型数据库、非关系型数据库
(2)BSD协议
(3)发布/订阅模式
(4)Hash散列
(5) Lua 脚本
(6)事件驱动模型
8.可视化工具 redis insight
参考文献
(1)官网地址:https://redis.io/
(2)源码地址:https://github.com/redis/redis
(3)Redis 在线测试:http://try.redis.io/
(4)Redis 命令参考:http://doc.redisfans.com/
(5)Redis服务器安装:https://github.com/MicrosoftArchive/redis
(6)C#使用Redis服务 https://blog.csdn.net/kingshown_WZ/article/details/89603057
(7)Redis的缓存穿透、缓存击穿和缓存雪崩https://blog.csdn.net/qq_53464269/article/details/132089052
项目测试地址:F:\LearnTest\csharp\TestRedis\TestRedis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言