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

企业网站用什么做二次开发最快南宁专业网站制作公司

企业网站用什么做二次开发最快,南宁专业网站制作公司,win7图标不显示wordpress,wordpress商城主题修改数据结构 Redis常见的数据结构 String#xff1a;缓存对象Hash#xff1a;缓存对象、购物车List#xff1a;消息队列Set#xff1a;点赞、共同关注ZSet#xff1a;排序 Zset底层#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 12…数据结构 Redis常见的数据结构 String缓存对象Hash缓存对象、购物车List消息队列Set点赞、共同关注ZSet排序 Zset底层 Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 128并且每个元素 64字节时会用压缩列表作为Zset类型的底层数据结构如果有序集合的元素不满足上面的条件会用跳表作为Zset类型的底层数据结构 跳表是怎么实现的 跳表在创建节点时随机生成每个节点的层数。 跳表在创建节点时先生成[0, 1]的随机数如果随机数 0.25层数就会增加一层然后继续生成下一个随机数直到随机数 0.25结束最终确定该节点的层数 为什么Zset使用跳表而不是B树 B树的设计目标是优化磁盘通过减少树的高度来降低磁盘寻道次数跳表是基于链表通过多级索引加速查询内存访问模式更符合CPU缓存局部性。Redis是内存数据库数据完全存储在内存中不需要优化磁盘IOB树的磁盘特性对Redis意义不大跳表的设计更优跳表相比B树实现起来更简单B树插入和删除可能需要触发节点的分裂和合并跳表插入时只需要随机生成层高删除时直接移除节点并调整指针即可。B树每个节点需要存储多个键值和叶子节点存在内存碎片跳表每个节点只需要存储键值、层高、多个前向指针内存占用更紧凑。 压缩列表是怎么实现的? 压缩列表是由连续内存块组成的顺序型数据结构类似数组。 查找第一个元素和最后一个元素时间复杂度O(1)查找其他元素只能逐个查找复杂度O(n) 压缩列表的缺点会发生连锁更新导致压缩列表占用的内存空间要多次重新分配这回直接影响到压缩列表的访问性能。 压缩列表只适合保存数据量不多的场景。 quicklist和listpack这两种数据结构就是为了尽可能地保持压缩列表节省内存的优势 哈希表怎么扩容的 在正常服务请求阶段插入的数据都会写到哈希表1中此时哈希表2没有被分配空间随着数据量的增多触发了rehash操作 给哈希表2分配空间一般比哈希表1大2倍将哈希表1的数据移动到哈希表2中迁移完成后把哈希表1的空间释放并把哈希表2设置为哈希表1在哈希表1新创建一个空白的哈希表为下次rehash做准备。 存在问题如果哈希表1非常大那么每次迁移到哈希表2的时候可能会对redis造成阻塞无法响应其他请求。 解决在rehash进行期间每次进行新增、删除、查找操作redis除了操作哈希表1还会操作redis2这样就把一次大量数据的迁移工作分摊到了多个请求中。 注哈希表扩容时如果来了一个读请求会现在哈希表1里查找如果没找到才会到哈希表2里查找。 String是用什么存储的为什么不用c语言的字符串 redis中的string字符串使用SDS数据结构存储的SDS结构如下 len记录了字符串的长度alloc分配给字节数组的空间长度flags用来表示不同类型的SDSsdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64buf[]字符数组用来保存实际数据 SDS数据结构可以O(1)获取字符串长度c语言的字符串需要O(n) SDS不需要\0来表示字符串结尾有个len来记录字符串的长度但是她为了兼容部分c的库函数还是加了\0 C语言的字符串在追加的时候是不安全的程序内部不会判断缓冲区大小是否够用当缓冲区发生溢出后会导致程序异常SDS结构里加入alloc和len这样可以通过alloc - len来判断剩余缓冲区的大小当缓冲区大小不够用时redis会自动扩大SDS的空间大小。 线程模型 Redis为什么快 单线程的redis吞吐量可以达到10w/s Redis大部分的操作都在内存中完成的redis的瓶颈可能是机器的内存或网络带宽而非CPURedis采用单线程模型可以避免多线程之间的竞争省去了多线程切换带来的开销Redis采用IO多路复用机制处理大量客户端的Socket请求在只运行单线程的情况下该机制允许内核同时存在多个监听Socket和已连接Socket。 Redis的单线程指的是”接收客户端请求 - 解析请求 - 进行读写数据操作 - 发送数据给客户端“这个过程是一个线程完成的但是Redis程序不是单线程的Redis在启动时会启动后台线程 关闭文件、AOF刷盘、释放内存这些任务会创建单独的线程来处理如果放在主线程来处理Redis主线程就会发生阻塞。 Redis6也采用多个IO线程来处理网络请求因为随着硬件的升级Redis的性能瓶颈出现在网络IO的处理上 Redis怎么实现IO多路复用 因为Redis是单线程的所有的操作都是按顺序进行由于读写操作等待用户的输入和输出都是阻塞的IO多路复用就是为了单线程的服务同时处理多个客户端的请求。 多路指多个网络连接客户端 复用指复用同一个进程 IO多路复用是使用一个线程来检查多个Socket的就绪状态在单个线程中通过记录跟踪每个Socket的状态来管理处理多个IO流 日志 Redis的持久化方式 Redis的读写操作都是发生在内存的但是redis重启后内存中的数据就会丢失为了保证内存中的数据不丢失就需要持久化机制把数据存储到磁盘这样Redis重启后就能从磁盘中恢复数据Redis主要有两种持久化方式分别是 AOF日志每执行一条写操作就会把该命令以追加的方式写入文件中redis重启时会逐一执行这个文件里的命令将数据恢复。redis由三种写回磁盘的策略 Always每次写操作命令执行完后同步将AOF日志数据写回磁盘Everysec每次写操作命令执行完后先将命令写到缓冲区中再每隔一秒将数据写回磁盘NoRedis不控制写回磁盘的时机交给操作系统控制每次写操作后先将命令写到缓冲区由操作系统决定何时将命令写回磁盘。 RDB快照RDB快照只记录一瞬间的内存数据记录的是实际的数据。Redis有两个命令来生成RDB快照 save命令在主线程中生成RDB文件会阻塞主线程bgsave命令创建一个子线程来生成RDB文件避免阻塞主线程 AOF日志记录的是操作命令用AOF做故障恢复时需要全量把日志全部执行一遍一旦AOF日志非常多会造成Redis恢复操作慢。所以引入了RDB快照记录一瞬间的内存数据记录的是实际数据AOF文件记录的是命令操作的日志而不是实际数据 内存淘汰和过期删除 内存淘汰和过期删除的区别 内存淘汰是在内存满时会触发内存淘汰策略来淘汰一些不必要的资源 过期删除是将已过期的键值对进行删除 内存淘汰策略有哪些 内存淘汰当Redis内存达到设置的阈值时Redis就会主动挑选部分key删除以释放更多的内存。 Redis在每次处理客户端命令时都会对内存使用情况判断如果必要则执行内存淘汰。内存淘汰的策略有 前缀 allkeys对所有的key进行淘汰从dict的哈希表中挑选volatile只对设置了TTL的key进行淘汰从expires的哈希表中挑选 后缀 ttl淘汰ttl小的random随机挑选lru基于LRU算法lfu基于LFU算法 过期删除策略 redis的失效缓存不会立即删除而是使用惰性删除 定期删除这两种策略配合 惰性删除在访问或修改key时判断key是否过期如果过期就删除key如果没有过期就不做处理返回正常的键值对定期删除每隔一段时间随机从数据库中取出一部分key进行检查删除过期的key如果过期的key≥选举的key的四分之一则再次选取直到四分之一这个过程可能会很长时间所以需要设置循环的上限。 集群 Redis主从同步 全量同步以下情况会发生全量同步 主从集群首次建立连接从服务器断开连接时间过长 步骤 从服务器发送SYNC命令开始请求同步主服务器收到SYNC命令后生成RDB快照并将生成的RDB文件发送到从服务器中从服务器收到RDB文件后先清空当前的数据集并载入RDB文件中的数据在RDB文件传输的过程中如果又有新的指令主服务器会将新的指令先放在缓冲区中一旦RDB文件传输完成主服务器又会将缓冲区里的命令发给从服务器保证数据的一致性。 增量同步允许从服务器从断点处继续同步 步骤 从服务器在网络恢复后发送psync命令主服务器收到psync命令后告诉从服务器接下来要用增量同步的方式同步数据主服务器将从服务器断开这段时间内执行的命令发送给从服务器。 断开这段时间内执行的命令会存在主服务器的环形缓冲区中主要存放的是最近传播的写命令如果缓冲区里的一部分数据还没同步给从服务器就已经被覆盖了主服务器就会再次采取全量同步 哨兵机制的原理 redis的主从集群中主从模式是读写分离的如果主节点挂了需要选择一个主节点变成从节点如果没有哨兵机制那么只能人工选择一个主节点变成从节点还要通知其他从节点现在主节点的变更。 哨兵机制主要是实现了主从节点的故障转移他会检测主节点是否存活如果主节点挂了就会选取一个从节点当成主节点并且把新的主节点信息通知给其他的从节点。 哨兵机制选择主节点的算法 故障节点主观下线哨兵节点会定时对redis集群里的所有节点发送心跳包检测节点是否正常如果一个节点没有恢复哨兵节点的心跳包则认为该节点主观下线 故障节点客观下线当一个节点被标记成故障不代表这个节点下线了但是如果哨兵集群中有超过quorum数量的哨兵节点认为该redis节点主观下线则该redis客观下线 如果下线的redis节点是从节点或哨兵节点则没有后续操作了如果是主节点则开始故障转移从剩下的从节点中选出一个节点升级为主节点 哨兵集群中选择Leader要从redis集群中选择一个节点变成主节点必须先从哨兵节点中选取leader一个哨兵节点至少要拿到quorunm个赞成票才能成为Leader 哨兵Leader选择新主节点哨兵Leader从redis从节点中选择一个redis节点作为主节点 首先判断slave节点与master节点断开时间长短如果超过指定值down-after-milliseconds * 10则会排除该slave节点。然后判断slave节点的slave-priority值值越小优先级越高。如果是0则用不参与选举默认是0如果slave-priority一样则判断slave节点的offset值越大说明数据越新优先级越高。最后是判断slave节点的运行id大小越小优先级越高。 Redis集群的模式 Redis缓存数据量大到一台服务器无法缓存时就需要使用Redis切片集群将数据分布在不同的服务器上降低对单主节点的依赖。 一个切片有16384个哈希插槽这些哈希插槽类似数据分区根据他的key被映射到一个哈希槽中。 场景 为什么使用Redis Redis具备高性能如果用户第一次访问Mysql中的某些数据这个过程比较慢因为是从磁盘上读取的如果将该用户的数据缓存在Redis中下次在访问这些数据的时候就可以直接从Redis中读取了操作Redis缓存就是直接操作内存速度快。【需要考虑Mysql和Redis中的数据一致性】Redis具备高并发单台Redis的QPS是Mysql的10倍所以访问Redis能承受的请求远远大于Mysql因此可以考虑将数据库中一部分数据缓存到Redis中这样就不需要每次请求都到数据库中查了。 为什么Redis比Mysql快 Redis是基于内存存储、Mysql是基于磁盘存储Redis是基于键值对结构支持简单的数据结构Mysql需要定义表结构、索引等复杂的数据结构Redis采用单线程可以避免多线程之间的竞争省去了多线程切换带来的开销。 本地缓存和分布式缓存的区别 本地缓存将数据存储在本地应用程序或服务器上用于加速数据访问本地缓存通常是使用内存作为存储介质利用内存的高速读写来提高访问速度。 本地缓存由于本地缓存是存储在本地内存中访问速度快而且能够降低对远程服务器的访问次数但是本地缓存的可扩展性收到硬件资源的限制无法支持大规模的数据存储。 分布式缓存将数据存储在多个分布式节点上通过协同工作来提供高性能的数据访问服务利用多台服务器来分担数据存储和访问的压力。 分布式缓存节点可以动态扩展能够支持大规模数据存储和访问的需求但是相对本地缓存分布式存储的访问速度相对慢因为数据需要从多个节点进行访问且需要通过网络进行数据传输。 Redis分布式锁的实现原理 分布式锁是分布式环境下并发控制的一种机制用来控制某个资源在同一时刻只能被一个应用使用。 Redis本身可以被多个客户端共享可以用来保存分布式锁而且Redis的读写性能高可以应对高并发锁的场景。 redis的set命令有个nx参数可以实现”key不存在时插入“所以可以使用它实现分布式锁 如果key不存在则表示插入成功加锁成功如果key存在则表示插入失败加锁失败 加锁的操作要注意 加锁包括了读取锁变量、检查锁变量值、设置锁变量三个操作需要以原子操作的方式完成所以使用set命令要带上nx选项来实现加锁。锁变量需要设置过期时间以免客户端拿到锁后发生异常导致锁一直无法释放锁变量的值需要能够区分来自不同客户端的加锁操作。 大Key问题 字符串类型的Key对应的Value值占用空间很大就是大Key问题 大Key问题会导致内存占用过高从而触发内存淘汰策略大Key会占用大量内存导致性能下降会造成网络拥堵会导致主从同步延迟 解决 对大Key进行拆分将一个含有数万成员的hashkey拆分成多个hashkey将不适用Redis的数据移到别的地方存储并在Redis中异步删除这个数据 什么是热key 一般是以key的请求频率来判断的例如 QPS集中在特定的key带宽使用率集中在特定的KeyCPU使用时间占比集中在特定的Key 解决 将对应的热ky进行复制并迁移到其他的数据分片来解决单个数据分片的热key压力如果热key的产生来自读请求可以使用读写分离架构来降低每个数据分片的读请求也可以不断增加从节点。 怎么保证redis和mysql数据缓存的一致性 对于读数据如果redis不命中会先去数据库中查询后加载到redis中对于写数据会更新数据库后去删除缓存 缓存系统就是CAP中的AP通过牺牲强一致性来提高性能如果需要数据库和缓存保持强一致性就不适合用缓存。 缓存的过期时间设置是太短、太长都不好 太短的话请求可能会比较多的落在数据库上就失去了缓存的意义太长的话缓存中的脏数据会让系统长时间处于一个延迟的状态会浪费内存。 通过一些方案是可以达到最终一致性的针对删除缓存异常的情况 删除缓存重试策略消息队列如果删除缓存失败可以从消息队列中重新读取数据然后再删除缓存如果删除缓存成功就要把数据从消息队列中移除避免重复操作。订阅MySQL binlog再操作缓存正常操作是先更新数据库再删除缓存一旦数据库更新成功就会产生一条变更日志记录再binlog里我们通过订阅binlog日志拿到要操作的数据然后执行缓存删除。 缓存雪崩、缓存击穿、缓存穿透是什么 缓存雪崩大量缓存数据同时失效或redis宕机如果有大量的用户请求都无法在redis中处理于是请求直接访问数据库造成数据库的压力严重的会导致数据库宕机 如果要给缓存设置过期时间应该避免大量的数据设置同一个过期时间可以在设置过期时间的时候给这些数据加上随机数这样数据就不会在同一时间过期当业务线程在处理用户请求时如果访问的数据不在redis里就加个互斥锁保证同一时间只能由一个请求来构建缓存未能获取互斥锁的请求要么锁释放后重新读取缓存要么返回空值或默认值互斥锁一定要设置过期时间不然一个请求拿到锁可能因为一些意外而阻塞这时其他请求也一直拿不到锁。让缓存“永久有效”将更新缓存的工作交给后台线程定时更新 缓存击穿缓存中某个热点数据过期大量的请求访问该热点数据就无法从缓存中读取直接访问数据库数据库很容易被高并发的请求冲垮。 当业务线程在处理用户请求时如果访问的数据不在redis里就加个互斥锁保证同一时间只能由一个请求来构建缓存未能获取互斥锁的请求要么锁释放后重新读取缓存要么返回空值或默认值互斥锁一定要设置过期时间不然一个请求拿到锁可能因为一些意外而阻塞这时其他请求也一直拿不到锁。不给热点数据设置过期时间由后台异步更新缓存或者在热点数据过期前提前通知后台线程更新缓存 缓存击穿可以理解成时缓存雪崩的一个子集缓存雪崩指的是大量的key过期而缓存击穿特指的是热点key过期。 缓存穿透用户访问的数据即不在缓存中也不在数据库中导致请求在访问缓存时发现缓存缺失再去访问数据库数据库也没有对应的数据当有大量的这种请求到来数据库的压力就会很大。 在Api入口处判断要请求的参数是否合法如果不合法直接返回错误防止进一步去访问数据库和缓存可以争对查询的数据在缓存中也设置一个空值或默认值这样后续的请求就可以从缓存中获取空值或默认值返回给应用而不会继续查询数据库布隆过滤器在写入数据库数据时先用布隆过滤器做个标记在用户请求到来时业务线程确认缓存失效后可以通过查询布隆过滤器快速判断数据是否存在不存在就不通过查询数据库来判断数据库来判断数据是否存在。即使发生了缓存穿透大量的请求只会查询Redis和布隆过滤器而不会查询数据库。 介绍一下布隆过滤器的原理 在写入数据库数据时先用布隆过滤器做个标记。 请求过来会先经过布隆过滤器布隆过滤器先判断数据库中是否存在这条数据如果不存在就会拒绝这个请求。 注意布隆过滤器判断一个元素不存在时它绝对不存在但是如果它判断一个元素存在这个元素可能会不存在。 如何实现秒杀场景处理高并发以及超卖现象 在数据库层面 在查询商品库存时加排他锁比如“select * from goods where id #{id} for update”此时相当于对id为#{id}的数据行加锁其他线程可以使用select读取数据但是如果是select for update、update、delete都会阻塞直到线程A提交事务其他线程才能获得锁。在更新数据库的时候可以通过加一个库存限制的条件“select * from goods where id #{id} and stock 0” 利用分布式锁同一个key同一个时间只有一个客户端拿到锁其他客户端会陷入无限等待来尝试获取锁只有获得锁的客户端才能执行接下来的业务逻辑 缺点同一个商品在多个用户同时下单时会基于分布式锁串行化处理导致没法同时处理用同一个商品的大量下单请求。 利用Redis的incr、decr的原子性 异步性 系统初始化时将商品库存加到Redis中收到秒杀请求时再redis中进行预减库存利用incr、decr的原子性当redis中库存不足时直接返回秒杀失败把秒杀请求放入异步队列返回正在排队中服务端异步请求出队有些商品规定用户只能购买一次防止重复秒杀出队成功的商品可以生成秒杀订单扣减库存用户在客户端申请秒杀请求后会有个定时任务进行查询查看秒杀是否成功如果秒杀成功就进入秒杀订单详情否则就会提示秒杀失败。
http://www.zqtcl.cn/news/624995/

相关文章:

  • 企业手机网站建设行情做外贸哪个网站比较好2017
  • 专业网站制作电话软件推广
  • 免费建站系统博客海外网站搭建
  • 网站建设与制作视频教学站酷网图片
  • 网站开发还有哪些万维网申请网站域名
  • 做网站费用上海判断网站做的好坏
  • 有了域名和空间怎么建网站哪些公司需要网页电商设计师
  • 网站开站备案深圳创业补贴10万
  • 圆通我做网站拉上海建站系统
  • 对于做网站有什么要求新闻发布会视频
  • 网站建设专业就业前景成都房产信息网 官网
  • 西宁网站建设公司排行网站查询域名ip解析
  • 柳州企业网站开发公司如何做网站首页图
  • 刷赞网站空间免费深圳网站制作公司排名
  • 网站内部优化策略获取网站的路径
  • 网站群 优点今天西安最新通告
  • 惠济免费网站建设设计制作的广告公司
  • 做一个网站建设装潢设计属于什么专业
  • 水处理网站源码注册销售公司流程和费用
  • 诸城网站建设0536s整站优化seo排名点击
  • 企业建设网站需注意哪些内容苏州网站怎么做
  • 浏览器打开网站网站推广软件工具
  • 网站主题编辑工具WordPress公司网站策划方案
  • 做旅游网站选什么空间搜索引擎优化策略有哪些
  • 网站备案多少钱安全网站建设与服务的关系
  • 手机端网页设计尺寸规范优化seo排名
  • 做网站业务提成多少厦门十大装修公司排名榜
  • 为什么用开源建站wordpress rss 插件
  • 语文建设投稿网站南昌做网站的公司多不多
  • 石家庄网站建设的公司功能性质网站