Hash内存溢出问题


public class Student {

public Student(int id, String name) {
this.id = id;
this.name = name;
}

private int id;

private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}


}


===========================================

import java.util.HashSet;
import java.util.Set;

public class HashTest1 {

public static void main(String[] args) {

Set<Student> set = new HashSet<Student>();
Student s1 = new Student(1,"jzk");
Student s2 = new Student(2,"wyq");
Student s3 = new Student(3,"jd");
set.add(s1);
set.add(s2);
set.add(s3);

System.out.println(set.size());
s1.setName("jzk1");
set.remove(s1);

System.out.println(set.size());

}

}
### 解决 Redis 内存溢出方案 #### 设置 maxmemory 参数并选择合适的淘汰策略 为了防止 Redis 使用过多内存,在配置文件中可以设定 `maxmemory` 参数来限定 Redis 可使用的最大内存量[^1]。一旦达到此上限,Redis 将依据所选的淘汰策略移除部分数据项以腾出空间。 常用的淘汰策略有: - volatile-lru:仅针对设置了过期时间的数据采用最近最少使用(LRU)算法删除; - allkeys-lru:对所有键应用 LRU 算法进行清理; - volatile-random:随机移除即将到期的数据条目; - allkeys-random:无差别地随机选取任何键予以清除; - volatile-ttl:优先处理那些剩余存活周期最短的数据对象; - noeviction(默认):禁止自动驱逐机制,当超出限额时拒绝新写入操作并抛出错误提示。 ```bash # 配置 redis.conf 文件中的 maxmemory 和 maxmemory-policy 属性 maxmemory 2gb maxmemory-policy allkeys-lru ``` #### 定位大尺寸 Key 或异常增长的原因 通过命令行工具 `redis-cli --bigkeys` 执行扫描,能够快速定位占用大量内存的具体 keys[^3]。这有助于识别是否存在单个超大型 key 导致的问题或是某些模式下频繁创建的小型 key 积累成灾的情况。 对于发现的大容量 hash 结构或其他复杂类型的数据结构,考虑优化其设计或拆分存储方式;而对于批量产生的临时性小记录,则应评估是否有必要调整业务逻辑减少不必要的缓存行为。 #### 实施合理的 TTL (Time To Live) 给定适当的时间期限让不再活跃的信息自然消亡是管理有限资源的有效手段之一。为每个加入到 Redis 中的新 entry 明确指定生存时限(TTL),这样即使发生意外状况也能确保旧版本会在一定时间内被系统自行回收而不至于无限累积造成负担。 ```python import time from datetime import timedelta import redis client = redis.Redis(host='localhost', port=6379, db=0) def set_with_ttl(key, value, seconds): client.setex(key, timedelta(seconds=seconds), value) set_with_ttl('example_key', 'some_value', int(time.time()) + 86400) # 设定了24小时有效期 ``` #### 建立监控体系及时预警 建立完善的性能监测框架至关重要,它不仅帮助实时掌握当前系统的健康状态还能提前预知潜在风险以便采取预防措施。利用 Prometheus、Grafana 等开源项目构建可视化仪表板,跟踪诸如 used_memory、mem_fragmentation_ratio 等核心指标变化趋势,配合告警规则实现自动化响应流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值