Redis原理知识点集锦

1、Redis有哪些数据结构?

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。

高级数据结构

HyperLogLog:基数统计

GEO:地理位置

PUB/SUB:订阅发布

2、Redis是单进程单线程的吗?

是的。Redis是基于内存的单进程单线程KV数据库,基于C语言编写,不比单进程多线程的Memcached差。快的原因:

(1)完全基于内存。(2)数据结构简单、对数据的操作也简单。

(3)使用多路复用I/O模型(多个网络连接复用同一个线程)。利用select、poll、epoll同时观察多个网络流。Redis实现了一个轻量级的对select、poll、epoll进行调用的通用接口,linux下默认实现为epoll。

3、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

keys + 正则表达式。会阻塞服务器

scan  模糊查询。不会阻塞服务器

4、如果有大量的key需要设置同一时间过期,一般需要注意什么?

key过期时间太集中会导致系统在那个时间卡顿,因此一般在时间上加一个随机值,使其分散。

5、Redis如何做持久化?

(1)bgsave做镜像全量持久化,耗时长,停机时会导致大量数据丢失,因此要配合aof。fork & cow。redis通过fork创建子进程来进行bgsave操作,父子进程共享数据段,父进程继续提供读写服务,写脏的页面逐渐和子进程分离开来。

(2)aof做增量持久化,与磁盘的同步取决于sync属性的配置,可以写一条同步一次。

6、Redis的同步机制?

主从刚连接时做全量同步,在全量同步后开始做增量同步。

全量同步:在连接后,从服务器发出同步请求,主服务器执行BGSave生成快照,将快照发送给从服务器,同时将这段时间执行的指令缓存起来,从服务器接收快照后,丢弃所有旧数据,载入快照,主服务器将缓冲区的命令发送给从服务器执行。

增量同步:主服务器执行的命令都会发送给从服务器执行。

### Redis 相关知识点总结 #### 性能特性 Redis 是一种高性能的内存型数据库,其读取速度可达每秒 110,000 次,写入速度可达每秒 81,000 次[^1]。相比之下,传统的关系型数据库 MySQL 的读写性能较低,分别约为 5,000 和 3,000 每秒。 #### 数据结构支持 Redis 提供丰富的数据结构支持,包括字符串 (String)、列表 (List)、集合 (Set)、有序集合 (ZSet) 和哈希表 (Hash)[^1]。这些数据结构使得开发者能够灵活处理各种场景下的缓存需求。 #### 原子性和事务保障 所有的 Redis 操作都具有原子性特征,即每次操作要么完全成功,要么彻底失败[^1]。这种设计确保了在并发环境下的数据一致性。 #### 持久化机制 为了防止因服务中断而导致的数据丢失,Redis 支持两种主要的持久化方式:RDB 快照和 AOF 日志。其中,AOF(Append Only File)通过持续追加的形式记录每一次写操作至文件中,在系统重启时可通过重放日志恢复最新状态[^4]。 #### 集群架构与查询路由 在分布式环境中,Redis 使用集群模式分担压力并提高可用性。不同于简单的单机版或者主从复制方案,Cluster 实现了一种特殊的查询路由逻辑——并非单纯依赖服务器间转发请求完成定位目标节点的任务,而是借助客户端主动参与跳转过程抵达最终目的地[^2]。 #### 分布式锁实现原理 利用 SET 命令配合特定选项可以轻松构建高效的分布式锁解决方案。例如,“SET key value NX PX milliseconds”语句用于尝试获取一把带有超时期限的独占锁,这里的关键参数解释如下: - `NX` 表示仅当指定键不存在时才创建; - `PX milliseconds` 定义了解锁前的有效存活时间(单位毫秒),从而有效规避潜在死锁风险[^3]。 ```python import redis from uuid import uuid4 def acquire_lock(client: redis.Redis, lock_name: str, timeout_ms=30000): identifier = str(uuid4()) result = client.set(lock_name, identifier, nx=True, px=timeout_ms) return bool(result), identifier def release_lock(client: redis.Redis, lock_name: str, identifier: str): lua_script = """ if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end""" output = client.eval(lua_script, 1, lock_name, identifier) return True if output != 0 else False ``` 以上代码片段展示了如何基于 Python 结合官方驱动程序安全地管理分布式锁资源。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值