
redis
文章平均质量分 82
chuixue24
这个作者很懒,什么都没留下…
展开
-
Redis源码剖析——线程模型
这也是我们常说 Redis 是单线程的原因。但是,的,Redis 在启动的时候,是这些任务需要创建单独的线程来处理,因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。后台线程相当于一个消费者,生产者把耗时任务丢到任务队列中,消费者不停轮询这个队列,拿出任务就去执行对应的方法即可。转载 2023-09-08 17:30:31 · 139 阅读 · 0 评论 -
深度解析Redis线程模型设计原理
当Redis服务器准备好给客户端的响应数据后,会将socket的AE_WRITABLE事件和命令回复处理器关联,当客户端准备好读取响应数据时,会在socket产生一个AE_WRITABLE事件,由对应命令回复处理器处理,即将准备好的响应数据写入socket,供客户端读取。连接Redis,对连接服务器的各个客户端进行应答,就需要将socket映射到连接应答处理器写数据到Redis,接收客户端传来的命令请求,就需要映射到命令请求处理器从Redis读数据,向客户端返回命令的执行结果,就需要映射到命令回复处理器。转载 2023-09-08 16:12:31 · 108 阅读 · 0 评论 -
Redis主节点的Key已过期,但从节点依然读到过期数据是为什么?怎么解决?
如果超过我们设置的阈值,则通知客户端断开从库的连接,全部访问主库,一定程度上减少数据不一致情况。跟 Redis 的版本有关系,Redis 3.2 之前版本,读从库并不会判断数据是否过期,所以有可能返回过期数据。我们知道,大部分的业务场景都是读多写少,为了利用好这个特性,提升Redis集群系统的吞吐能力,通常会采用。升级Redis的版本,至少要3.2 以上版本,读从库,如果数据已经过期,则会过滤并返回空值。,Redis会随机挑选一定数量的Key,检查是否过期,并将过期的数据删除。转载 2023-06-08 09:13:48 · 422 阅读 · 0 评论 -
Redis 系列(5)— 常见缓存问题
我们在使用 Redis 缓存的时候,必然会面对的一个问题就是缓存和数据库的一致性问题。这个一致性问题产生的原因主要在于更新数据库和更新Redis是两个步骤,那就有可能一个更新成功,一个更新失败,这时数据不一致性就产生了。转载 2023-04-23 10:16:30 · 330 阅读 · 0 评论 -
Redis 系列(4)— 切片集群
系列专栏:Redis系列专栏切片集群数据扩展模式如果Redis要缓存的总数据量不是很大,比如5GB数据,一般使用 主从模型 + 哨兵集群保证高可用 就可以满足。但如果Redis要缓存的总数据量比较大,或者未来可能会增大,比如20GB、50GB数据,那一个主库就无法满足了,这时一般有两种模式来扩展:纵向扩展和横向扩展。纵向扩展纵向扩展就是升级单个Redis实例的配置,增加服务器内存容量、磁盘容量、使用更高配置的CPU。比如之前使用的 4C 8GB 50GB ,升级到 8C 32GB转载 2023-04-21 18:53:51 · 360 阅读 · 0 评论 -
Redis系列(3) — 哨兵高可用
上篇文章介绍了Redis主从架构模式,在这个模式下,主库存在着单点问题,如果主库发生故障,那客户端就无法发送写请求,而且从库也无法进行数据复制同步了。所以一般部署Redis主库架构时,还会部署哨兵(Sentinel)集群来保证Redis的高可用性,在主库发生故障时,可以自动进行故障转移,将从库切换为新的主库。这篇文章就来看看如何部署哨兵集群,以及其工作的原理。转载 2023-04-21 18:36:43 · 202 阅读 · 0 评论 -
Redis系列(2) — 主从读写分离
这里就会有一个问题,由于复制积压缓冲区是一个固定大小的环形缓冲区,那么可能在 slave 重连后,未同步的数据可能被覆盖了,即 slave_offset+1 之后的数据在缓冲区中已经不存在了,这时就会执行全量同步。slave 接收了 N 字节的数据,slave 的偏移量就会加上 N。命令时,master 将发现 slave 当前的复制偏移量少于自己的复制偏移量,然后 master 就会根据 slave 提交的复制偏移量,在复制积压缓冲区里面找到 slave 缺少的数据,并将这些数据重新发送给 slave。转载 2023-04-21 17:32:41 · 536 阅读 · 0 评论 -
Redis性能瓶颈揭秘:如何优化大key问题?
Redis大key问题指的是某个key对应的value值所占的内存空间比较大,导致Redis的性能下降、内存不足、数据不均衡以及主从同步延迟等问题。到底多大的数据量才算是大key?没有固定的判别标准,通常认为字符串类型的key对应的value值占用空间大于1M,或者集合类型的k元素数量超过1万个,就算是大key。Redis大key问题的定义及评判准则并非一成不变,而应根据Redis的实际运用以及业务需求来综合评估。例如,在高并发且低延迟的场景中,仅10kb可能就已构成大key;转载 2023-04-21 10:32:52 · 1245 阅读 · 0 评论 -
Redis为什么能抗住10万并发
本文介绍了Redis为什么如此快的原因。首先,Redis使用内存存储数据,避免了磁盘I/O的开销,提高了数据访问的速度。其次,Redis拥有丰富的对象类型,包含八种类型,满足不同的需求。此外,Redis采用了高效的数据结构,减少了内存占用和计算复杂度。Redis还使用单线程模型,避免了多线程之间的上下文切换和竞争条件,提升了CPU利用率。最后,Redis使用非阻塞I/O多路复用机制,充分利用CPU和网络资源,提高了并发处理能力。转载 2023-04-21 10:00:25 · 308 阅读 · 0 评论 -
为什么Redis不直接使用C语言的字符串
众所周知Redis有以下几种常见的数据类型 String(字符串)、List(列表)、Set(集合)、Hash(哈希)、Sorted set(有序集合)、Stream(流)、Geo(地理空间索引)、Bitmap(位图)、HyperLogLog(基数统计)等。我们最常用的就是String(字符串)类型,String类型既可以存储字符串,也可以存储数字,甚至可以直接进行数值运算。转载 2023-04-21 09:07:03 · 174 阅读 · 0 评论 -
Redis高可用总结:Redis主从复制、哨兵集群、脑裂...
在实际的项目中,服务高可用非常重要,如,当Redis作为缓存服务使用时, 缓解数据库的压力,提高数据的访问速度,提高网站的性能 ,但如果使用Redis是单机模式运行 ,只要一个服务器宕机就不可以提供服务,这样会可能造成服务效率低下,甚至出现其相对应的服务应用不可用。因此为了实现高可用,Redis提供了哪些高可用方案?Redis主从复制 Redis持久化 哨兵集群 ...Redis基于一个Master主节点多Slave从节点的模式和Redis持久化机制,将一份数据保持在多个实例中实现增..转载 2022-03-24 14:54:28 · 192 阅读 · 0 评论 -
redis6:redis缓存设计与性能优化
多级缓存架构缓存设计 缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 造成缓存穿透的基本原因有两个: 第一, 自身业务代码或者数据出现问题。 第二, 一些恶意攻击、 爬虫等造成大量空命中。 缓存穿透问题解决方案:1、缓存空对象 String get(String key) { .原创 2021-10-29 09:01:20 · 231 阅读 · 0 评论 -
redis原理5:redis 6新特性
1. 多线程 多线程: 1. redis 6.0 提供了多线程的支持,redis 6 以前的版本,严格来说也是多线程,只不过执行用户 命令的请求时单线程模型,还有一些线程用来执行后台任务, 比如 unlink 删除 大key,rdb持久 化等。redis 6.0 提供了多线程的读写IO, 但是最终执行用户命令的线程依然是单线程的,这样,就没有多线程数据的竞争关系,依然很高效。 redis 6.0 以前线程执行模式,如下操作在一个线程中执行完成:redis 6.0 线程执行模式:原创 2021-10-29 08:32:56 · 3743 阅读 · 0 评论 -
redis原理4:redis核心数据结构
RedisDB主体数据结构String原创 2021-10-26 13:25:30 · 153 阅读 · 0 评论 -
redis原理3:高可用集群
1、Redis集群方案比较 哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。内存一般设为8G左右,不超过.原创 2021-10-26 13:21:16 · 285 阅读 · 0 评论 -
redis原理2:Redis持久化、主从与哨兵架构详解
Redis持久化 RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次 数据集。 比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次 数据集: # save 60 1000 //关闭RDB只需要将所有的save保存策略注释掉即可 还可以.原创 2021-10-23 23:48:33 · 220 阅读 · 0 评论 -
redis原理1:数据类型及其应用场景
5种数据类型:String应用场景:Hash应用场景:Hash结构优缺点:List应用场景:Set应用场景:Zset应用场景:Redis的单线程和高性能Redis是单线程吗? Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外 提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行...原创 2021-10-23 22:55:16 · 253 阅读 · 0 评论 -
redission分布式锁续期流程
原创 2021-09-11 16:57:59 · 675 阅读 · 0 评论 -
Reids 主从复制-哨兵机制中,脑裂问题及解决方案
1、什么是脑裂redis的主从模式下脑裂是指因为网络问题,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,此时因为sentinel集群无法感知到 master 的存在,就会将某一个 slave 节点提升为 master 节点。此时就存在两个不同的 master节点,就像一个大脑分裂成了两个。集群脑裂问题中,如果客户端还在基于原来的 master 节点继续写入数据,那么新的master 节点将无法同步这些数据,当网络问题解决之后,sentinel转载 2021-04-02 13:42:30 · 1769 阅读 · 0 评论 -
redis 优化
Redis 单线程为什么还能这么快?因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性 能损耗问题。Redis 单线程如何处理那么多的并发客户端连接?Redis的IO多路复用:redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到 文件事件分派器,事件分派器将事件分发给事件处理器。Redis 单线程为什么还能这么快?因为它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性 能损耗问题。Re转载 2021-01-20 17:40:22 · 109 阅读 · 0 评论 -
Redis 主从复制、哨兵和集群原理与区别
简介谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能。复制(Replication):则是负责让一个Redis服务器可以配备多个备份的服务器。Redis正是利用这两个功能来保证Redis的高可用哨兵哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题。Redis哨兵主要功能(1)转载 2021-01-05 14:17:37 · 903 阅读 · 0 评论 -
Redis的过期策略和内存淘汰机制
过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效。 如果假设你设置一个一批key只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的? 答案是:定期删除+惰性删除 所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。 注意,这里可不是每隔100ms就遍历所有的设置过期时间的ke.转载 2021-01-04 09:12:52 · 98 阅读 · 0 评论 -
Redis5.0淘汰策略
作为一个内存数据库,redis在内存空间不足的时候,为了保证命中率,就会选择一定的数据淘汰策略,这篇文章主要讲解常见的几种内存淘汰策略。和我们操作系统中的页面置换算法类似。一、参数设置我们的redis数据库的最大缓存、主键失效、淘汰机制等参数都是通过配置文件来配置的。这个文件是我们的redis.config文件,我们的redis装在了/usr/local/redis目录下,所以配置文件也在这里。首先说明一下我使用的redis是5。也是目前最新的版本。1、最大内存参数关键的配置就在最.转载 2021-01-04 09:10:25 · 170 阅读 · 0 评论 -
ajax请求状态码一直是pending
最近遇到一个问题:一个业务中用到了分布式锁,是用redis实现的。在业务请求中,正常流程或异常流程都有解锁代码。有一个取消按钮,点击取消按钮可以取消本次业务,之前是没有解锁代码的。在取消请求中加上解锁代码以后,每次发起请求到后端返回成功解锁信息,要用到到1分钟左右(测试环境),本地测试是1到5秒左右。一开始解决这个问题的思路是,查看解锁代码是否有问题,这有涉及到redis,所以又查看redis的配置是否出错。为了验证redis是否有问题,写了一个测试代码,也是解锁,测试了几次,解锁耗时是14毫秒。那原创 2020-12-21 18:01:31 · 3590 阅读 · 1 评论 -
redis分布式锁源码
public class DistributeLockByRedis implements DistributeLock { private static Logger log = LoggerFactory.getLogger(DistributeLockByRedis.class); private static final Long RELEASE_SUCCESS = 1L; private static final String RELEASE_SCRIPT = "if redis...原创 2020-12-16 18:00:09 · 213 阅读 · 0 评论 -
redis+lua脚本+令牌桶算法 实现限流
最完整清晰的redis+lua脚本 + 令牌桶算法 实现限流控制在网上看了好多博客,感觉不是很清楚,于是决定自己手撸一个。一、自定义一个注解,用来给限流的方法标注@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface RateLimit { //限流唯一标示 String key() default ""; //限流单位.转载 2020-11-20 13:27:32 · 1004 阅读 · 2 评论 -
redis HSCAN命令及jedis的hscan方法
参考文档:http://doc.redisfans.com/key/scan.html@Override public ScanResults hscanToResltByVague(String key, String pattern, String cursor, int pageSize) { List<Map.Entry<String, String>> result = null; List<Map.Entry<String, String&原创 2020-07-24 18:10:50 · 4591 阅读 · 0 评论 -
Jedis常用API整理-详细
Jedis常用API整理 redis是一种高级的key-value的存储系统 其中的key是字符串类型,尽可能满足如下几点: 其中value 支持五种数据类型: jedis语法总结 1. jedis中对键通用的操作 2. jedis中 字符串的操作 3. jedis中对整数和浮点数操作 4. jedis中对列表(list)操作 5. jedis 集合set 操作 6. jedis中 有序集合Zsort 7. je转载 2020-05-22 13:58:38 · 1222 阅读 · 0 评论 -
基于redis2.1.6实现spring cache生成的key多出一个冒号
用redis来做spring cache时,发现最终生成的key中多了一个冒号,而且有一个空节点的存在:经查看其源码发现,默认的生成key策略就是用的两个冒号:package org.springframework.data.redis.cache;@FunctionalInterfacepublic interface CacheKeyPrefix { String ...原创 2020-01-10 18:19:54 · 3903 阅读 · 4 评论 -
基于redis实现的springsession的命名空间问题
用redis来实现springsession时,需要注意命名空间的问题,默认的命名空间为:/** * The default namespace for each key and channel in Redis used by Spring Session. */ public static final String DEFAULT_NAMESPACE = "spring:ses...原创 2020-01-07 18:08:41 · 2585 阅读 · 0 评论 -
jedis非线程安全
网上都说jedis实例是非线程安全的,常常通过JedisPool连接池去管理实例,在多线程情况下让每个线程有自己独立的jedis实例,但都没有具体说明为啥jedis实例时非线程安全的,今天就让我们一探究竟吧!1. jedis类图jedis_note.png2. 为什么jedis不是线程安全的? 由上述类图可知,Jedis类中有RedisInputStream和Redi...转载 2019-12-26 14:10:36 · 546 阅读 · 0 评论 -
redis客户端连接,最大连接数查询与设置
##redis客户端连接数 redis通过监听一个TCP端口或socket的方式接收来自客户端的连接, 当与客户端建立连接后,redis内部会进行如下操作:(1)客户端socket会被设置为非阻塞模式,因为redis在网络时间处理上采用的是非阻塞多路复用模型;(2)然后为这个socket设置TCP_NODELAY属性,禁用Nagle算法;(3)然后创建一个可读的文件事件用于监听这个客...原创 2019-08-28 14:31:01 · 4261 阅读 · 0 评论 -
redis容易忽略的地方——命名规范
在使用redis时,最容易忽略的一个点是key的命名问题,只做到望key知意、唯一还不够,词义之间以英文冒号:分隔才是符合规范的。举例:把关系数据库中的一张表中数据迁移至redis,数据库为ov,表名为ov_user,主键为user_id那么在redis中定义的命名规范最好是,库名:表名:字段名,如ov:ov_user:1002。这么做的好处是,在一些redis图形化客户端工具中,查看...原创 2019-07-22 16:38:31 · 1223 阅读 · 0 评论 -
Redis 总结精讲 看一篇成高手系统-4
本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题 正文 1、为什么使用redis 分析:博主觉得...转载 2018-12-18 10:35:23 · 149 阅读 · 0 评论 -
Redis在京东到家的订单中的使用
背景Redis作为一款性能优异的内存数据库,在互联网公司有着多种应用场景,下面介绍下Redis在京东到家的订单列表中的使用场景。主要从以下几个方面来介绍:订单列表在Redis中的存储结构Redis和DB数据一致性保证Redis中的分布式锁缓存防穿透和雪崩订单列表在Redis中的存储结构订单列表数据在缓存中,是以用户的唯一标识作为键,以一个按下单时间倒序的有序集合为值进行存储的。大家都知道Redis...转载 2018-05-22 13:48:28 · 567 阅读 · 0 评论