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 提供的基本操作(如 SETGETINCR 等)都是原子性的。每个操作在执行时,不会受到其他命令的干扰。例如,如果你执行 INCR(自增)操作,它将以单一的操作来完成自增过程,在执行完成之前不会被中断。
  • 这些操作是在单线程中顺序执行的,因此可以保证每个操作的原子性。

(3)事务(MULTI/EXEC)

  • Redis 支持事务,但不同于传统的数据库事务。Redis 事务通过 MULTIEXEC 命令来实现。
  • MULTI: 通过 MULTI 命令开始一个事务后,Redis 会将后续的命令放入事务队列中,而不是立即执行。这些命令在事务提交(EXEC)时才会被执行。
  • EXEC: 提交事务,通过 EXEC 命令来执行之前放入事务队列中的所有命令。事务中的命令在执行时是原子性的——要么全部成功,要么全部失败。
  • WATCH: Redis 还支持 WATCH 命令,它用于监听某些键的变化。如果在事务执行之前某个键发生了变化,事务会被中止,从而避免由于并发操作引发的数据不一致问题。

(4)乐观锁(WATCH)

  • Redis 提供的 WATCH 命令允许你对一个或多个键进行监视。在开始一个事务之前,通过 WATCH 命令监视某个键,如果这些键在事务执行之前发生了变化,事务会被取消,从而确保操作的原子性。
  • 这种机制称为乐观锁,它是一种基于“假设不会发生冲突”的锁定方式,适用于高并发场景。

(5)原子性操作的实现

  • Redis 在内存中处理数据结构的操作,如 INCR(自增)、DECR(自减)、INCRBY(增加指定值)等,都是通过原子性操作实现的。
  • 这些操作在 Redis 的实现中通过简单的内存读写来完成,操作是一个原子步,即在执行过程中不会被其他命令中断。例如,INCR 命令会先读取当前值、增加指定值、再将结果写回。这一系列的操作在 Redis 内部被当作一个单独的原子操作来执行。

(6)并发控制:锁机制与阻塞操作

  • 虽然 Redis 是单线程的,但它通过阻塞命令来模拟锁的机制。例如,使用 BLPOPBRPOP 等命令来实现对队列的阻塞操作,这种操作可以确保队列的消费是原子性的。
  • 由于 Redis 本身是单线程处理命令的,所以它能保证对共享资源的操作是不会被并发修改的。

 (7)数据结构原子性

  • Redis 支持多种高级数据结构,如 列表集合哈希表有序集合。对这些数据结构的操作(如 LPUSHSADDHSET 等)都是原子性的。这意味着,无论你执行多少次这些操作,Redis 总是确保它们的顺序不会被其他命令打断,所有操作会按顺序完成。

总结

Redis 通过单线程模型、事务机制、乐观锁、原子命令等多种方式实现了原子性操作。单线程的设计使得每个命令都按顺序执行,因此避免了并发访问导致的数据冲突问题。而通过 MULTIEXECWATCH 等命令,Redis 还能够在分布式系统中保证多个命令的原子性,从而满足更加复杂的事务需求。

4.redis使用单线程来保证原子性怎么支持高并发

Redis 采用单线程架构,但依然可以支持高并发,这是因为 Redis 的设计非常高效,它巧妙地利用了以下几个机制和特点:

(1)单线程的原子性保证

  • Redis 的核心是基于事件驱动模型,通过单线程处理所有的请求,保证每个请求在执行时不会被其他请求打断。
  • 这种方式天然地避免了线程切换、加锁和竞争等多线程带来的复杂问题,简化了原子操作的实现。
  • Redis 操作基本都是在内存中完成的,单次操作非常快,单线程下可以迅速执行大量请求。

(2) I/O 多路复用机制

  • 虽然 Redis 采用单线程处理命令,但它利用了I/O 多路复用技术(如 epollselectkqueue 等),让单个线程可以同时监听多个客户端连接。
  • Redis 不需要为每个连接创建新的线程,而是通过事件循环机制轮询所有的连接,根据请求的状态快速处理请求。
  • 这大大减少了线程上下文切换和系统调用开销,从而提高了并发处理能力。

(3) 高效的数据结构

  • Redis 提供了多种高效的数据结构(如 hashlistsetsorted set 等),这些数据结构都经过精心设计,具备 O(1) 或 O(log N) 的时间复杂度,确保了高性能读写操作。
  • 这些数据结构的设计使得在单线程下,Redis 仍能快速处理大量请求。

(4) 请求的快速执行

  • 由于 Redis 操作的数据都在内存中,且单个请求的执行速度非常快(通常在几微秒内)。即使在单线程下,Redis 也能在单位时间内处理大量的请求。
  • 单个线程处理速度高,意味着即使同时有大量的请求,Redis 可以快速完成一个请求,然后立即处理下一个请求,从而实现高吞吐量。

(5)流水线(Pipeline)技术

  • Redis 支持流水线机制,客户端可以将多个命令一次性发送给 Redis,Redis 批量处理这些命令后再统一返回结果。
  • 这种机制减少了客户端与服务器之间的网络通信开销,进一步提升了性能。

(6)避免了多线程带来的锁竞争

  • 在传统的多线程架构中,多个线程访问共享资源时会引入锁机制,造成锁竞争、上下文切换等开销。
  • Redis 使用单线程架构避免了这些问题,减少了锁的消耗,让代码运行更加高效。

(7)水平扩展

  • 当单个 Redis 实例无法满足并发需求时,可以通过 分片集群 等机制进行水平扩展,使用多个 Redis 实例来分担压力。
  • Redis Cluster 将数据分布到多个节点上,每个节点独立处理不同的请求,从而进一步提高整体并发能力。

总结

Redis 的单线程架构通过以下几个关键特性支持了高并发:

  1. I/O 多路复用 提高并发连接数;
  2. 内存操作 和高效的数据结构提供了超快的请求执行速度;
  3. 避免锁竞争,简化了操作流程;
  4. 流水线机制 和水平扩展(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

posted @   头号程序媛  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示