安装好的redis每过一段时间的会出现连接不上的情况

最近使用了redis做一个缓冲的数据库,但是每过一段时间之后,都会实现连接不上的情况,但是使用telnet是能连接到redis的端口的,而且在本地中是可以通过redis-cli连接上reids。 通过在cli中使用ping命令,结果报出一下错误:

(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

 

译: Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。

 

原因: 强制关闭Redis快照导致不能持久化。

 

查看网上的解决方案为:修改redis-conf配置文件中的 stop-writes-on-bgsave-error 为 no

 

但是修改之后,过了一段时间还是为报出原来一样的错误,后来查看redis-server开启时,已经出现了错误信息:

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

原因是内存不足,(开始看这条报错信息时我用free -m查看了系统的内存使用量,发现还剩800多M的内存,以为不是内存的问题,后来发现,redis保存数据导硬盘上面时,会复制同样大小的进程来专门保存数据,就是说如果redis主进程占了400M的内存,那么复制时就需要800M )

 

解决方案提示里面已经给出:修改/etc/sysctl.conf 中vm.overcommit_memory 的值为 1,再使用sysctl -p使修改生效,然后重启redis

### LeetCode 'Two Sum' 问题的 C++ 解决方案 #### 暴力解法 (Brute Force Approach) 暴力方法通过双重循环遍历数组中的每一对元素,检查它们之和是否等于目标值 `target`。这种方法的时间复杂度为 \(O(n^2)\),空间复杂度为 \(O(1)\)[^1]。 ```cpp class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { for(int i = 0; i < nums.size(); i++) { for(int j = i + 1; j < nums.size(); j++) { if(nums[j] == target - nums[i]) { return {i, j}; } } } return {-1, -1}; } }; ``` --- #### 哈希表优化解法 (Hash Table Optimization) 为了提高效率,可以使用哈希表存储已经访问过的数值及其索引位置。这样可以在一次遍历中完成查找操作,时间复杂度降低到 \(O(n)\),而空间复杂度增加至 \(O(n)\)[^3]。 ```cpp #include <unordered_map> using namespace std; class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> hashTable; for(int i = 0; i < nums.size(); ++i){ int complement = target - nums[i]; if(hashTable.find(complement) != hashTable.end()){ return {hashTable[complement], i}; } hashTable[nums[i]] = i; } return {}; } }; ``` 此代码利用了一个无序映射 (`unordered_map`) 来记录已扫描的数字以及其对应的下标。每次迭代都会计算当前数字所需的补数,并检查该补数是否已经在哈希表中存在。 --- #### 排序数组上的双指针技术 (Two Pointers Technique on Sorted Array) 如果输入数组已经是有序的,则可以通过双指针的方法进一步减少内存消耗并提升性能。初始时设置左指针指向第一个元素,右指针指向最后一个元素;随后逐步调整两个指针的位置直到找到满足条件的一对数字或者确认不存在这样的组合[^2]。 ```cpp class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { int l = 0, r = numbers.size() - 1; while(l < r){ if(numbers[l] + numbers[r] > target) r--; else if(numbers[l] + numbers[r] < target) l++; else return {l+1, r+1}; } return {}; } }; ``` 注意这里返回的结果是从 1 开始计数的索引值而不是默认从零开始的标准 C++ 数组索引。 --- #### 总结 上述三种算法分别代表了不同的思路和技术应用方向: - **暴力枚举**适合理解基础逻辑但不适用于大规模数据集; - **哈希表辅助**提供了更高效的解决方案,在实际开发场景中最常用; - **双指针策略**则针对特定情况(即预排序列表)进行了特殊优化处理。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值