redis
文章平均质量分 55
Redis 相关总结
盼兮猫
长亭外 古道边 芳草碧连天
展开
-
redis cluster 如何解决批量处理问题
redis cluster 集群模式下执行批量处理命令会报错,具体原因如下:不同的 key 计算出的 slot 槽不一样,不同槽可能对应到不同节点,也就是说批量操作实际很可能被均分到不同的 redis 实例上,对于这种情况,redis cluster 没法处理,直接报错一般情况下有以下三种解决方法:1、别用批量处理命令,老老实实一条一条执行。怎么说呢,这种方式最简单,也最没有人用,因为根本不算解决方案,适合对性能要求不太高的场景2、在客户端计算槽,根据槽判断对应 key 属于那台 redis 实例,直原创 2021-08-16 22:05:41 · 1268 阅读 · 0 评论 -
Redis 穿透、雪崩、击穿如何应对
缓存穿透描述:黑客故意使用非法参数查询,缓存中一定查不到,请求一定会打到数据库,数据库也不一定能查到,比如 id = -1。由于大量的恶意请求,数据库宕机解决方案:对参数进行判断,恶意请求直接封 ip每次缓存、数据库都没有查到的数据,写一个空值到缓存中,例如 set -1 NULL,设置过期时长,这样下次有相同的 Key 来访问时,在缓存失效前,都不会打到数据库使用布隆过滤器存储所有可能访问到的 Key,不存在的 Key 直接被过滤缓存雪崩描述:假设系统本身通过 redis 抵挡流量高峰原创 2021-05-13 17:06:28 · 86 阅读 · 0 评论 -
缓存一致性问题续
在前面的博客中,我有介绍过缓存一致性问题。本篇我打算详细分析各种情况,给出最优的解决方案:其中保证缓存一致性问题常有以下四种方式:1. 先更新缓存,再更新数据库2. 先更新数据库,再更新缓存3. 先删除缓存,再更新数据库4. 先更新数据库,再删除缓存场景一和场景二很少使用,因为都存在脏数据的可能性。导致原因基本类似:先进行的操作成功,但后进行的操作失败。一般线上更多使用场景三或者场景四对于场景三,单线程场景下可以保证缓存一致性,但多线程场景下仍有可能出现脏数据情况:线程a 是写请求原创 2021-09-08 21:44:34 · 93 阅读 · 0 评论 -
如何保证数据库和缓存数据一致
部分场景下,对于数据库中需要频繁访问的热点数据,会保存一份拷贝在 redis 缓存,提高查询效率,具体流程如下:对于查询操作,首先从缓存中查询,查到直接返回,否则从数据库查询,将查询结果保存在缓存中,然后返回对于更新操作,先修改数据库,再删除缓存上述流程的执行就需要保证数据库和缓存数据一致。这里每次更新操作后删除缓存的原因在于:部分场景下缓存中的数据是数据库数据加工后的结果,可能需要联合其它数据一起计算,因此暂时删除掉使用缓存的主要原因在于提高查询效率,数据库中的数据不一定都会查到,因此先删原创 2021-05-13 15:40:41 · 175 阅读 · 0 评论 -
Redis 和 Memcached 的区别
Redis 和 Memcached 都是基于内存的数据库存储系统。MemCached 是高性能分布式内存缓存服务,Redis 是开源的 key-value 系统比较Redis 支持更多的数据结构Redis 数据可以保存在磁盘Redis 支持数据持久化Redis 可通过主从模式备份数据Redis 只使用单核,MemCached 支持多核Redis 支持以下数据结构:StringHashListSetSorted Setpub/subTransactionsMemCach原创 2021-05-08 16:42:59 · 777 阅读 · 1 评论 -
redis 分布式锁常见问题
上篇博客我简答介绍了 redis 常见加解锁的操作,本篇我计划整理出其中可能导致的问题:一般情况下 redis 分布式锁都是这样使用的:// 加锁操作cacheService.lock(key , timeout);// 业务逻辑xxx// 解锁操作cacheService.unlock();绝大多数情况下都没有问题,但可能存在如下情况:业务逻辑执行时间过长,锁自动失效了。如果锁失效,就有可能导致并发问题一般情况下都是通过设置 timeout 值大于业务逻辑执行时间来解决,但总得来说这不原创 2021-09-08 23:44:47 · 677 阅读 · 0 评论 -
Redis 实现分布式锁
分布式锁主要为保证分布式系统处理共享数据期间不会出现线程安全问题。redis 分布式锁主要需满足一下特征:互斥性:任何时候,只能有一个客户端持有锁避免死锁:即使客户端持有锁期间出现异常,也要能保证后续客户端仍能加锁容错性:只要大多数 redis 节点能正常运行,客户端就服务正常安全性:加锁和解锁必须在同一客户端中进行使用 redis 分布式锁首先需要引入 Jedis 开源类库,maven 配置如下<dependency> <groupId>redis.cli原创 2021-04-15 14:43:29 · 97 阅读 · 0 评论 -
Redis Cluster 集群模式
无论是主从复制,还是哨兵模式,都无法摆脱每个节点需要保存所有数据。为了实现水平扩展,Redis 在主从、哨兵保证高可用的基础上提出 Cluster 集群模式,通过 Cluster 集群模式实现水平扩展Cluster 模式提出槽的概念,每个分片负责一部分槽,每组redis 节点(master + slave)组成一个分片。客户端发出指令后,根据 key 计算它应该属于哪个分片、通过分片找到对应的 redis 节点,在对应节点执行相应命令完成客户端请求每个槽并不只保存一对 key-value,如果将单节点原创 2021-08-09 14:44:46 · 195 阅读 · 0 评论 -
redis、Sentinel 常见配置
redis.conf 常见配置如下:// 是否以守护线程启动,默认不是daemonize no;// 以守护线程启动时,pid 写入 redis.pid 文件,配置文件路径,默认 var/run/redis.pidpidfile var/run/redis.pid// 端口号,默认6379port 6379;// 绑定的主机地址bind 127.0.0.1;// 当客户端闲置300秒后断开连接,为0表示一直不断开timeout 300;// redis 日志级别,从高到低分别为debu原创 2021-08-05 16:12:42 · 3515 阅读 · 0 评论 -
Redis 哨兵模式
哨兵模式是指通过多个 Sentinel 实例监视 Redis 节点的状态:在某个 master 节点下线后,从 slave 节点中选举新的 master 节点,保证服务正常运行Sentinel 判断某个 Redis 节点是否下线的逻辑如下:默认 Sentinel 每秒发送 PING 命令给所有监视的节点(包含 master、slave、sentinel 节点),通过节点返回判断是否下线。如果某个节点在 down-after-miliseconds 毫秒内连续返回无效答复,Sentinel 修改该节点对应原创 2021-08-03 15:00:07 · 80 阅读 · 0 评论 -
Redis 主从同步
所谓主从同步是指:将 master 节点数据同步到 slave 节点。这样做的好处有以下两点:master 节点异常挂掉,可以从 slave 节点选举新的 master 节点,整个 redis 服务不会挂掉减轻 master 节点的压力,每次读操作在 slave 节点执行,写操作在 master 节点执行可以将排序等耗费资源更大的操作放在 slave 节点去做,减轻 master 节点的压力master 节点可以不用配置持久化 ,减轻压力,持久化配置到某一个 slave 节点就可以当使用主从原创 2021-08-03 11:03:13 · 188 阅读 · 0 评论 -
redis 管线化 Pipeline
redis Pipeline 常用来解决批量处理问题:redis 只支持部分批量处理逻辑,对于其它绝大多数批量处理需要循环遍历依次执行,使用 Pipeline 就可以将多个命令封装再一起,一起发送给 redis 服务端,一起处理提到 Pipeline 就不得不说 redis 事务,因为它和事务很像:都是将多个命令打包,最后一起执行。这里我简单提一下两者区别:Pipeline 需要客户端、服务端一起参与,命令在客户端处打包,发送到服务端执行。而事务只需服务端参与,redis 通过维护队列保证事务中的指令原创 2021-08-16 21:07:07 · 264 阅读 · 0 评论 -
redis 事务
所谓事务是指不可分割的最小工作单位,要么全部执行成功,要么全部执行失败redis 事务从开始到结束需要经过三个阶段:事务开始:multi 命令开启一个事务命令入队:watch、multi、discard、exec 会被立即执行、其他命令依次入队并返回客户端 queued事务执行:exec 命令开始执行事务exec:执行事务discard:关闭事务watch:加分布式锁multi:开启事务QUEUED:命令入队成功一般情况下不建议使用 redis 事务,因为它不能保证原子性、不支持原创 2021-08-16 20:21:55 · 112 阅读 · 0 评论 -
Redis 持久化策略
常见的 Redis 持久化策略有以下四种:RDB:指定时间间隔生成数据集的时间点快照AOF:记录服务端执行的所有写操作命令,并在服务端启动时重新执行者部分命令还原数据集混合持久化:两者都使用,优先使用 AOF,因为 AOF 文件保存的数据相对更完整关闭持久化:保证 Redis 性能RDB:类似快照,在规定时间点将 Redis 在内存中的数据库信息保存到磁盘中,生成的 RDB 文件是压缩过的二进制格式RDB 文件可以通过以下 Redis 命令生成:SAVE:阻塞主进程,服务端暂时无法处理客户原创 2021-06-08 10:43:05 · 221 阅读 · 0 评论 -
Redis 内存淘汰策略
常见的过期清理策略有以下几种:定时删除:在设置键过期时间的同时,创建定时器,定时器在键过期时间来临时执行删除操作惰性删除:不考虑键的过期时间,只在每次获取键时,检查键是否过期。如果过期就删除,否则返回结果定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面过期的键。具体删除多少键,检查多少数据由算法决定redis 使用惰性删除和定期删除,其中定期删除并不会每次扫描所有 key。假设现在保存了十万个包含过期时长的 key,如果每次清理全部遍历一遍的话,CPU 消耗太大,而且极有可能成为程序性原创 2021-06-04 16:44:49 · 110 阅读 · 0 评论 -
Redis 线程模型
Redis 内部使用文件事件处理器实现,这个文件事件处理器负责所有客户端请求的处理,由于文件处理器处理任务是单线程的,因此也说 redis 是单线程的。其中文件事件处理器通过以下几个模块组成:Socket:每个客户端对应一个 Socket 连接IO 多路复用程序:监听多个 Socket,将产生事件的 Socket 放入队列文件事件分派器:每次取出一个 Socket,根据 Socket 的事件类型分派给不同处理器事件处理器:包括连接应答处理器,命令请求处理器,命令回复处理器IO多路复用技术:原创 2021-05-08 18:48:50 · 145 阅读 · 0 评论 -
redis 常见数据类型实现原理
redis 常用的数据结构有以下五种:- String- List- Hash- Set- Sorted Set之前简单的介绍了 String 实现原理 SDS,本篇我打算从全局层面一起介绍:无论什么类型的数据结构,在 Redis 中都可以通过 RedisObject 来表示,该类型主要包含以下三个属性:- type:类型,对应上面提到五种数据类型,如:REDIS_STRING、REDIS_LIST 等等- encoding:编码格式- ptr:指针,指向具体的数据类型Red原创 2021-09-19 17:13:07 · 746 阅读 · 0 评论 -
Redis SDS 原理
Redis 常用基础数据结构:String:字符串List:链表Hash:哈希Set:集合Sorted Set:有序集合高级数据结构:HyperLogLog:基数统计Geo:地理位置信息Bitmap:位图Stream:消息队列原创 2021-05-11 15:58:59 · 353 阅读 · 0 评论