将最近遇到的redis问题总结一下:
1.问题描述
程序从redis里面获取数据,时有时无,概率一半一半
2.问题分析
最近开发遇到了从redis里获取数据时有时无的现象,开始以为是redis出了问题,由于赶上运维重新搭建测试环境,同时又是在测试环境中遇到的,就没太在意,想着用新环境就好了,过来几天将代码移植到新的测试环境中,发现现象依然存在,就和运维描述了一下问题(当时还是以为是redis系统方面出了问题),后来将代码部署到线上测试环境,发现问题依然存在,这个时候我就警觉起来了,开始怀疑是程序方面出了问题,然后开始了代码排查,开始由于固定思维模式,并未发现什么问题,获取数据这块的代码也并未改动过。十分的不解,然后开始仔细回忆bug最开始出现的时间以及在什么模式下会出现,最好锁定是新增的一块功能后,这个bug就出现了(和这块没什么关系),不甘心,继续调试,发现出现问题的时候,从redis榜单中并未获取到数据(正常的是获取到数据的),因为从配置上看是从同一个redis源拿的数据。继续往深了调试,发现取数据之前要验证一下redis key的type 出问题的时候type为none(没有这个redis key),找到问题了松了一口气,然后怀疑是redis 没判断出来,以为是redis的bug(怎么也没想到是redis 串库了)。后来查资料,网上并未找到这个redis bug的相关文章,这就令我百思不得其解了。
后来为了验证是这个版本的代码有问题,就从线上拷贝了一份代码放到线上测试环境,一看并未出现问题。
代码问题,代码问题,代码问题,重要的事情说三遍。
慢慢排查代码之路开始了,灵光一现,在获取redis对象的时侯查验一下对象的ip和端口,不就能确定是不是同一个源了吗,说干就干,经过调试还真发现不是同一个源,redis 串库了。
又开始回想,这个版本增加了什么,代码一行一行的排查,发现是一个方法里面获取某个redis 对象用完后
returnResource 的时return 错了,获取了两个redis Resource ,用完后returnResource return错了。
(大家都知道jedis用完要释放,不然链接用完了就出问题了)
看下面事例代码:
Jedis Jedis1 = jedisPool1.getResource();
Jedis Jedis2 = jedisPool2.getResource();
try {
xxxxx
}catch(Exception e){
}finally{
jedisPool1.returnResource(jedis2); //正确的是return jedis1的 结果写成了jedis2
}
3.解决问题
正确的pool 对应正确的jedis
总结:这个问题本来就不是问题,但由于粗心大意(粘贴复制)写错了东西,导致了这么严重的问题,因为之前也没遇到过串库的问题,所以一开始根本就没网那方面想,不过庆幸的是通过一番努力找到了问题的根本原因,也算积累了经验。
最后再次强调一现,redis数据文件一定要记得备份,备份,备份并定期检查数据备份是否正确。
因为最近亲身经历一次线上redis数据丢失的情况,情况是这样的当运维调整网络后,把redis机器
重启了一下(当然是在晚上11点后了),起来之后发现数据丢了(文件被重新写入了),然后立马去从机拷贝数据,结果从机上根本没有数据,顿时傻了,原来运维在配置主从的时候配置错了,导致从机并没有备份数据并且主redis上数据持久化配置的也有问题,导致重启机器后数据被冲了,无奈没办法,连夜赶到公司从数据库里恢复数据到redis,幸好这个redis刚上线没多久,数据量也不大(几百兆),比较容易恢复。
教训:
操作nosql数据库一定要小心再小心,备份再备份。
相关推荐
Redis 是一款强大的内存数据存储系统,它作为一个高性能的键值数据库,常被用作缓存服务。本笔记涵盖了从基础到高级的Redis知识,包括其安装、数据类型、持久化机制、主从复制、集群配置、哨兵模式,以及如何与...
在保证 Redis 中数据为热点数据的场景下,Redis 提供了数据淘汰策略,当内存达到上限时,会根据预设策略自动删除部分数据,以腾出空间给新的热点数据。 Redis 适用的场景广泛,比如: 1. 会话缓存:Redis 可高效...
看你写的项目经验,如果你们公司数据量特别大,公司用缓存牛逼,就说Rediscluster,小公司可以说哨兵集群 1.哨兵模式 基本回答:哨兵主要就是启动哨兵(redis特殊)节点,对主节点进行监控,如果半数以上发现ping主...
1. **数据结构**: Redis支持多种数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets),这些结构在处理不同场景的数据时展现出强大的灵活性。 2. **持久化**: Redis通过RDB...
#### 三、Redis数据类型与常用命令 **1. 数据类型** - **String**: 最基础的数据类型,可以存储任意数据(字符串、数字等)。 - **List**: 用于存储有序的数据集合。 - **Set**: 存储不重复的字符串集合。 - **...
二、Redis数据类型 1. 字符串(Strings):最基本的类型,用于存储单个值,支持设置、获取、增加、减少等操作。 2. 哈希(Hashes):用于存储键值对的集合,适用于表示对象或结构化数据。 3. 列表(Lists):双向...
Redis,全称REmote DIctionary Server,是由Salvatore Sanfilippo开发的一款开源、高性能、基于内存的键值存储系统,同时也支持持久化到磁盘,提供丰富的数据结构,如字符串、哈希、列表、集合和有序集合。Redis采用...
Redis是一种开源的、基于键值对的NoSQL数据库,它以高速度和丰富的数据结构而闻名,常用于数据缓存、消息队列、数据库持久化等多个场景。在本篇文章中,我们将深入探讨Redis的核心概念、功能特性以及常用的Redis连接...
2. **Redis数据类型**: - **字符串(String)**:最基本的类型,可以存储任何可序列化的值,如数字或字符串。 - **哈希(Hash)**:用于存储键值对的集合,适用于表示对象。 - **列表(List)**:双向链表结构,...
Instagram的Redis实践不仅展示了技术团队面对挑战时的创新思维和持续优化精神,同时也为其他面临类似问题的公司提供了宝贵的参考案例。通过合理的数据结构选择和精细的内存管理,即使是面对海量数据的挑战,也能够...
#### 二、Redis数据类型详解 Redis支持多种数据类型,每种类型都有其特定的应用场景。 ##### 2.1 字符串(Strings) 字符串是最基础的数据类型,支持文本和二进制数据。常用于缓存、计数器等场景。 ##### 2.2 列表...
其次,Redis是一个高性能的键值存储系统,特别适合用于存储和操作大量的临时数据。在这个计数器模块中,Redis被用作缓存,用于快速增加和查询计数。由于Redis支持原子操作(如INCR命令),所以可以确保在高并发环境...
Redis的Hash数据结构允许我们将用户购物车中的每一项商品及其相关信息(如商品ID、名称、单价、数量、图片和小计)以键值对的形式存储。其中,键(Key)由固定的字符串"CartInfo/CartMap/CartData"与用户ID组成,...
东方财富网数据采集-本项目基于scrapy+redis数据库开发的分布式数据采集,对东方财富网进行数据采集+py源代码+文档说明 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都...
#### 三、Redis数据类型 Redis 提供了五种基本的数据类型:字符串(Strings)、哈希表(Hashes)、列表(Lists)、集合(Sets)和有序集(ZSets)。每种数据类型都有其独特的应用场景,同时也支持一系列丰富的命令。 ##### ...
Redis 是一个开源的、基于内存的数据结构存储系统,可以用作数据库、消息队列、缓存服务器等。下面是对 Redis 在 Windows 平台下的安装和使用方法的详细介绍。 一、Redis 安装 首先,下载 Redis 的安装包,地址是 ...
2. 计票逻辑:在Redis中实时更新每个选项的票数。 3. 排行榜展示:从Redis中获取票数并排序,显示当前的投票排行。 4. 数据同步:定期将Redis中的投票数据同步到MySQL,以备后续分析和报表生成。 5. 安全措施:防止...
4. Redis 高可用性服务的设计思想:多个小概率事件同时发生的概率可以忽略不计,只要设计的系统可以容忍短时间内的单点故障即可实现高可用性。 5. Redis 高可用性服务的解决方案:包括 Keepalived、Codis、...
而"Go-rerate-Go基于Redis的计数器和速率限制器"是一个专门为Go开发者设计的工具,它利用Redis作为数据存储,实现了计数器功能和速率限制功能,对于网络应用的流量控制和资源保护至关重要。 计数器是软件系统中常见...
由于其单线程模型,Redis在处理并发请求时可能会遇到并发竞争问题,这主要体现在多个客户端同时对同一键进行操作时,可能导致数据一致性问题。下面将详细探讨这个问题,并提供几种解决方案。 首先,我们要理解Redis...