Redis为什么快
发表于|更新于|知识点详解
|总字数:266|阅读时长:1分钟|浏览量:
Redis为什么快?
首先我们要知道,Redis是基于内存存储。这也是他快的主要原因。
但是你如果说Redis快,不能只说Redis基于内存。
还要说他是单线程模型(无锁竞争)
还要说他的IO多路复用(网络模型)
更要说他的高效的数据结构*
单线程模型
多线程竞争共享数据需要加锁。没有线程切换,没有死锁。代码简单高效。
高效的数据结构
Redis为每种数据结构做了底层的优化
- String
- List
- Hash
- Set
- ZSet
IO多路复用
传统的IO模型是阻塞IO,即一个线程处理一个连接。当一个连接处理完毕,会阻塞等待下一个连接。线程切换消耗CPU,而且read也会阻塞等待数据到达后在处理
IO多路复用则是创建一个调度中心,将多个连接注册到调度中心,当有连接有数据到达时,调度中心会通知对应的线程处理。
文章作者: Jaymr
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 花海!
相关推荐
2025-10-08
RedisTemplate的使用
RedisTemplate的使用RedisTemplate是Spring Data Redis提供的核心抽象类,是Spring Boot访问Redis服务器的底层实现。 有了RedisTemplate就不用Jedis的连接池或者直连,手动序列化对象,查询时还需要手动反序列化,还要处理各种异常和链接关闭 RedisTemplate就可以直接访问Redis服务,并且自动处理各种异常和链接关闭 redisTemplate.opsForValue().set("user:1", user);User result = (User) redisTemplate.opsForValue().get("user:1"); 核心配置RedisTemplate使用之前需要配置RedisConnectionFactory @Configurationpublic class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate( ...
2025-10-08
Redis用ZSet实现实时积分排行榜
Redis用ZSet实现实时积分排行榜背景需求:实时积分排行榜要求实时性,有序性 为什么要用Redis的ZSetRedis的ZSet就像一个巨型的的电子记分牌,上面会有所有用户的积分和排名情况ZSet是由Redis提供的一种数据结构。他存储一组唯一的成员,每个成员关联一个分数。成员按分数自动排序。 极致的实时性 天然排序 简单易用 高性能、高并发 而使用数据库(如MySQL),一是实时性低,二是复杂度高,需要写sql,最后就是高并发能力差。 核心操作 ZADD key score member : 添加或更新成员及其分数 ZINCRBY key increment member : 给指定成员分数增加(可正可负)分数。(最常用) ZREVRANGE key start stop : 获取分数从高到底(REV是reverse)排名在[start,stop]区间内的成员 ZREVRANK key member : 获取指定成员在从高到低排名中的名次(0表示第一名) ZSCORE key member : 获取指定成员的分数 ZCARD key : 获取ZSet的成员数量 具体实...
2025-10-10
关于Redis的击穿穿透与雪崩
关于Redis的击穿穿透与雪崩知识点助记就比如你开了一个商店,Redis就像放在门外面的小货架,那上面摆放着最畅销的商品。 但是有这么三种情况会造成商店崩溃: 缓存击穿:有一个很热门的商品正好过期了,这个时候涌入了一大批购买这个商品的顾客,所有人都涌向了你的小商店去买这一个物品,造成系统瘫痪。 缓存穿透:有一个调皮的小孩子,他一直管你要你商店里没有的东西,这导致店员每次都要去找这个不存在的商品。大量这样的请求会让店员累坏。 缓存雪崩:货架上很多畅销的产品在同一时间过期,这个时候来了很多顾客来买这些商品,导致大量请求瞬间砸向商店,造成系统瘫痪。 解决办法缓存击穿核心思路就是防止多个请求同时去数据库查询同一个失效的热点key 对于极热点key设置永不过期。通过后台任务或者消息队列在数据更新时主动刷新缓存。 互斥锁:当第一个请求发现缓存失效时,他并不直接去查数据库,而是先获取一个分布式锁。获取锁成功的请求才有资格去查询数据表并重建缓存。其他请求则等待,缓存重建完后直接从Redis中获取数据。 // 以下是伪代码public String getData(String key)&...
2025-10-11
Redis的主从同步
Redis主从同步什么是Redis的主从模式主从模式中,一个高可用的Redis服务由一个主节点和若干个从节点组成。Redis中采用读写分离来保证主节点和从节点之间的数据一致性, 主节点支持数据写入和数据读取,从节点只支持数据读取 主节点会与从节点之间执行主从数据同步,以保证主节点数据和从节点数据的一致性 主从数据同步主从数据同步主要分为以下几种情况: 从节点与主节点刚建立连接时进行全量同步 主节点与从节点正常运行时的数据同步 主节点与从节点连接断开后又重连时会进行增量同步或者全量同步 全量同步触发条件 从节点第一次连接主节点 从节点保存的复制id和主节点不匹配 从节点的复制偏移量不在主节点的复制积压缓冲区中 执行步骤 从节点向主节点发送PSYNC命令从节点通过配置文件中的replicaof {masterip} {port} 获得主节点ip和port,然后向主节点发送psync {repID} {offset} 指令,其中repID表示主节点唯一标识,offset为复制偏移量,因为当前从节点与主节点尚未连接,且尚未开始复制,所以repID为 ?,offset为 -1;发...
2025-10-10
Redis的数据一致性
Redis的数据一致性背景我们的数据一般都会持久化到数据库,但是数据库操作很慢Redis处理速度快,但是数据不一定是最新的简单来说就是:数据库里的数据如果改了,Redis里面存的可能还是旧数据这就导致了一个问题:当多线程访问系统时,如何能保证数据库和Redis的数据同步、一致呢 分析关于双写一致性问题有两种解决思路。 更新缓存 删除缓存 更新缓存 如果我们先更新库,再更新缓存 假设有两个请求,都对同一条数据进行操作A要把这条数据改为100 B要把这条数据改为200 首先请求A先把数据库中的数据改为100,刚更新完库还没来得及更新缓存,B就来把数据改为200,然后B立刻把200写入缓存,此时A再去更新缓存为100此时缓存是100 数据库是200 如果我们先更新缓存,再更新库 前置条件同上 首先请求A先把缓存中的数据改为100,还没来得及更新数据库,B来把缓存改为200,并把数据库改为200。此时A才来更新数据库为100此时缓存是200 数据库是100 删除缓存此时我们考虑读写并发的场景下会有什么问题请求A是读操作,B是写操作,要改为200初始:缓存和数据库中数据都是100...
2025-10-10
关于Redis的数据持久化
关于Redis的数据持久化背景因为Redis是基于缓存存储数据,一旦服务重启或者崩溃,数据就全部会丢失。 主要措施 RDB(快照):就像给一个场景拍一张照片。每隔一段时间或者到达某种状态时,就会把全部数据生成一个快照文件,存储在磁盘中。恢复时直接拿出最新照片复原即可。 AOF(日志):就像给一个场景拍视频。每次操作都会记录下来,比如你操作了某个数据,就会记录下来,然后生成一个日志文件,存储在磁盘中。恢复时不需要回忆最终的状态,只需要把视频做过的事情重新做一遍就可以了。 简单来说。RDB是某个状态的备份,而AOF是操作历史的备份。 关于RDB是什么在特定时间点,将Redis内存中所有的数据生成一个二进制压缩文件(默认dump.edb)。 优点 恢复速度快:服务器宕机后,能用RDB文件快速恢复数据 性能高:生成的RDB文件是子进程完成的,几乎不阻塞主进程的执行 适合备份:紧凑的二进制文件,便于传输和备份 如何配置在redis.conf中,主要配置save指令,定义快照的触发条件 # 格式:save <秒> <写操作次数>save 900 1 # 90...
公告
主包的WX:Jaymr1031 欢迎交流
