Redis中双写不一致的问题
Redis的国旗策略以及内存淘汰机制
1. String(字符串)特点:
是最基础的数据类型,一个键对应一个字符串值,字符串可以是文本、数字或二进制数据。
最大存储容量为 512MB。
常用命令:
SET key value:设置一个键值对。
GET key:获取键对应的值。
INCR key:对键值进行自增操作。
APPEND key value:将值追加到现有的值后面。
使用场景:
缓存数据:缓存简单的字符串数据,如用户信息、配置等。
计数器:用 INCR 和 DECR 来实现递增或递减的计数功能,如网站点击量统计。
分布式锁:可以利用 SETNX 和 EXPIRE 实现分布式锁。
2. Hash(哈希)特点:
适合存储对象的数据结构,一个键对应一个 Hash 表,Hash 表中是字段-值的映射关系。
比较节省内存,尤其适用于存储少量字段的数据。
常用命令:
HSET key field value:为 Hash 表的某个字段设置值。
HGET key field:获取 Hash 表中特定字段的值。
HGETALL key:获取 Hash 表中所有字段和值。
使 ...
Redis的哨兵机制
Redis的国旗策略以及内存淘汰机制
缓存三大问题
布隆过滤器(Bloom Filter)是一种高效的空间使用概率型数据结构,用于测试一个元素是否在一个集合中。它具有显著的优势,但也存在一些缺点。以下是布隆过滤器的主要缺点:
1. 存在假阳性(False Positives)
解释:布隆过滤器可能会错误地报告一个元素在集合中,即使该元素实际上并不在集合中。这种错误称为假阳性。
影响:由于布隆过滤器可能产生假阳性结果,不能完全替代集合,也无法用于要求准确性的场景,如身份验证系统或安全性较高的系统。
2. 无法删除元素
解释:布隆过滤器不支持删除元素。因为一个元素的添加可能会影响多个比特位,如果直接清除这些位,可能会影响其他元素的存在判断。
影响:如果需要删除元素,布隆过滤器不适用。为了解决这个问题,可以使用计数布隆过滤器(Counting Bloom Filter),它为每个比特位维护一个计数器,但这会增加空间开销。
3. 假阳性率与负载有关
解释:布隆过滤器的假阳性率与元素数量和比特数组大小有关。当加入的元素数量增多,假阳性率会逐渐增加。
影响:随着集合大小增长,布隆过滤器的准确性会下降,除非显著增加其存储空间,这与其高效空间使用 ...
设计模式:工厂模式1. 什么是工厂模式?
工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪个类。换句话说,工厂模式将对象的创建过程封装起来,使得客户端不需要知道具体的创建细节,而是通过工厂接口来获取对象实例。
工厂模式的主要有三种变体:
简单工厂模式(Simple Factory Pattern):不属于GoF的23种设计模式之一,但常被提及。它是通过一个工厂类来创建对象,通常会有一个静态方法根据参数来返回不同的对象实例。
简单来说就是一个窗口打菜,想吃什么得告诉窗口的阿姨让他帮你找
工厂方法模式(Factory Method Pattern):定义一个创建对象的接口,让子类决定实例化哪个类。工厂方法使得一个类的实例化延迟到其子类。
可以理解为同时有多个窗口卖吃的,但是每个窗口只卖一种
抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而无需明确指定具体类。
2. 如何使用工厂模式?
2.1 工厂方法
假设我们有一个产品接口Product,以及两个具体的产品实现类Concr ...
152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续
子数组
(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
示例 1:
123>输入: nums = [2,3,-2,4]>输出: 6>解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
123>输入: nums = [-2,0,-1]>输出: 0>解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
令imax为当前最大值,则当前最大值为 imax = max(imax * nums[i], nums[i])
由于存在负数,那么会导致最大的变最小的,最小的变最大的。因此还需要维护当前最小值imin,imin = min(imin * nums[i], nums[i])
当负数出现时则imax与imin进行交换再进行下一步计算
代码:
123456789101112class Solution(object): def maxProduct(self, nums): ...
279. 完全平方数
给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
123>输入:n = 12>输出:3 >解释:12 = 4 + 4 + 4
示例 2:
123>输入:n = 13>输出:2>解释:13 = 4 + 9
提示:
1 <= n <= 104
把题目翻译一下:完全平方数就是物品(可以无限件使用),凑个正整数n就是背包,问凑满这个背包最少有多少物品?
动规五部曲分析如下:
1.确定dp数组(dp table)以及下标的含义dp[j]:和为j的完全平方数的最少数量为dp[j]
2.确定递推公式dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。
此时我们要选择最小的dp[j],所以递推公式:dp[j] = min(dp[j - i * i] + 1, dp[j]) ...
416. 分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
示例 1:
123>输入:nums = [1,5,11,5]>输出:true>解释:数组可以分割成 [1, 5, 5] 和 [11] 。
示例 2:
123>输入:nums = [1,2,3,5]>输出:false>解释:数组不能分割成两个元素和相等的子集。
同,暂时还没看懂,先贴代码:
123456789101112131415161718192021222324252627class Solution(object): def canPartition(self, nums): total = sum(nums) if total % 2 == 1: # 总和无法等分 return False target = total // 2 if max(nums) > target: # ...