电子商务网站体系结构有哪些?大数据精准营销

当前位置: 首页 > news >正文

电子商务网站体系结构有哪些?,大数据精准营销,上海恒鑫网站建设,室内设计师多少钱一个月对于缓存#xff0c;我们主要关心两个#xff1a;缓存的命中率#xff0c;数据的一致性。由此又会有一些缓存引起的问题#xff0c;缓存击穿、穿透、雪崩。对于这些问题也是我们在使用缓存时不得不考虑的 。这些问题的解决方案也有很多。这里简单列举几个#xff1a; 我们主要关心两个缓存的命中率数据的一致性。由此又会有一些缓存引起的问题缓存击穿、穿透、雪崩。对于这些问题也是我们在使用缓存时不得不考虑的 。这些问题的解决方案也有很多。这里简单列举几个 1针对无效数据穿透多级拦截 无效数据空数据进行多种手段拦截如布隆过滤器、业务参数有效性判断、缓存空值等等。多种手段拦截就是让流量最后无法穿透到最薄弱的底层服务。 2针对高并发热点key击穿两阶段失效 对于高并发的热点key做逻辑和物理两阶段失效策略逻辑失效前端响应仍然立即返回仅异步排队去底层服务或DB获取数据并刷新缓存。 3缓存降级限流排队多级缓存 缓存由于各种原因不可用如果无任何措施势必会出现雪崩的现象为了尽可能保证业务服务可用或者部分可用则必须对缓存允许降级即便缓存中间件连接异常宕机等仍然可以去底层的服务和DB获取数据常用手段一般是二级、甚至三级缓存最后就是加锁排队访问底层服务。 4失效时间随机 往往热key都是在同一个时间点短暂的时间段创建的如果固定有效时长则失效将在同一个时间点当失效发生时雪崩的可能性很大。在业务要求的失效时间点上加上随机时长范围可以分散热key失效时间点。 缓存击穿、穿透和雪崩是与缓存相关的常见问题。它们是在使用缓存时可能遇到的一些挑战和风险。下面是对这些问题的解释以及相应的实际例子 1.缓存击穿 缓存击穿指的是在缓存中不存在但是频繁被请求的数据导致请求绕过缓存直接访问数据库或其他数据源增加了后端负载。这通常发生在缓存中的数据过期或被删除时。 例子假设一个电子商务网站的商品详情页被频繁访问并且每次访问都会从数据库中获取商品信息。如果某个商品的缓存过期而此时有大量用户请求该商品的详情页这些请求将绕过缓存直接访问数据库导致数据库负载过高。 1.缓存穿透 缓存穿透指的是请求的数据在缓存和数据源中都不存在这将导致每次请求都需要访问数据源增加了后端负载。这通常是由于恶意或无效的请求导致的。 例子假设一个新闻网站允许用户根据新闻ID获取新闻内容。如果有恶意用户通过构造不存在的新闻ID来频繁请求新闻内容而这些请求都无法命中缓存或找到相应的数据每次请求都需要访问数据库造成了无谓的资源浪费。 1.缓存雪崩 缓存雪崩指的是缓存中大量的数据同时过期或失效导致大量请求直接访问数据源造成后端系统的压力过大甚至崩溃。 例子假设一个电商网站的商品列表页的缓存时间都设置为相同的时间当缓存过期时大量用户同时请求商品列表页这些请求将直接访问数据库导致数据库负载激增甚至可能导致数据库崩溃。 为了解决这些问题可以采取以下措施 •对于缓存击穿可以通过在缓存中设置短暂的过期时间或使用互斥锁的方式来避免。当某个数据过期时只允许一个请求去重新加载数据到缓存中其他请求等待。 •对于缓存穿透可以在缓存中设置一个特殊的值表示数据不存在并将该值缓存一段时间。这样当恶意请求到来时可以直接从缓存中返回这个特殊值而不需要访问数据源。 •对于缓存雪崩可以采用多级缓存、缓存数据的不同过期时间或使用热点数据预加载等策略。这样可以减少缓存同时失效的概率分散请求对后端系统的冲击。 需要根据具体情况和使用的缓存系统来选择合适的解决方案。 布隆过滤器Bloom Filter 是一种空间效率很高的概率型数据结构用于判断一个元素是否属于一个集合。它通过使用多个哈希函数和位数组来判断元素是否存在可以快速地进行查找和过滤。 以下是一个简单的布隆过滤器的示例代码 python CopyReplace import mmh3from bitarray import bitarray classBloomFilter:definit(self, size, hash_functions):self.size sizeself.hash_functions hash_functionsself.bit_array bitarray(size)self.bit_array.setall(0)defadd(self, item):for fn in self.hash_functions:index mmh3.hash(item, fn)% self.sizeself.bit_array[index]1defcontains(self, item):for fn in self.hash_functions:index mmh3.hash(item, fn)% self.sizeif self.bit_array[index]0:returnFalsereturnTrue

创建一个布隆过滤器实例

size 10 # 位数组的大小 hash_functions [1,2,3] # 哈希函数的数量 bloom_filter BloomFilter(size, hash_functions)

添加元素到布隆过滤器

bloom_filter.add(apple) bloom_filter.add(banana) bloom_filter.add(orange)

检查元素是否存在于布隆过滤器print(bloom_filter.contains(apple)) # 输出: Trueprint(bloom_filter.contains(grape)) # 输出: False

在这个示例中BloomFilter类表示布隆过滤器。在初始化过程中我们指定了位数组的大小和哈希函数的数量。bitarray库用于创建位数组并使用mmh3哈希函数库来生成哈希值。 add方法用于将元素添加到布隆过滤器中。它使用每个哈希函数对元素进行哈希并将对应的位数组位置置为1。 contains方法用于检查元素是否存在于布隆过滤器中。它使用每个哈希函数对元素进行哈希并检查对应的位数组位置是否为1。如果有任何一个位置为0则说明元素不在布隆过滤器中。 在示例中我们创建了一个布隆过滤器实例添加了几个元素并检查了其中的一些元素是否存在于布隆过滤器中。 需要注意的是布隆过滤器存在一定的误判率False Positive即可能会判断某个元素存在于集合中但实际上并不存在。因此在使用布隆过滤器时需要根据具体应用场景和数据量来选择合适的位数组大小和哈希函数数量以控制误判率。