当前位置: 首页 > news >正文 公司做网站那家好企业软件 news 2025/10/25 5:05:26 公司做网站那家好,企业软件,网站建设及安全规范,东莞中赢网站建设公司怎么样1. 常见功能介绍 聚合统计 使用list集合的差集、并集来统计 排序统计 SortedSet#xff08;ZSet#xff09;统计#xff0c;再利用分页列出权重高的元素 二值状态统计 BitMap存储#xff0c;获取并统计 SETBIT uid:sign:3000:202008 2 1 GETBIT uid:sign:3000:202008 2…1. 常见功能介绍 聚合统计 使用list集合的差集、并集来统计 排序统计 SortedSetZSet统计再利用分页列出权重高的元素 二值状态统计 BitMap存储获取并统计 SETBIT uid:sign:3000:202008 2 1 GETBIT uid:sign:3000:202008 2 统计8月份签到情况 BITCOUNT uid:sign:3000:202008 基数统计 数据量小的时候可以用Set或hash 数据量大的时候可以HyperLogLog PFADD page1:uv user1 user2 user3 user4 user5PFCOUNT page1:uv 注意HyperLogLog 的统计规则是基于概率完成的所以它给出的统计结果是有一定误差的标准误算率是 0.81%。这也就意味着你使用 HyperLogLog 统计的 UV 是 100 万但实际的 UV 可能是 101 万。虽然误差率不算大但是如果你需要精确统计结果的话最好还是继续用 Set 或 Hash 类型。 2. 一个键值数据库应该包含什么 Redis 主要通过网络框架进行访问而不再是动态库了这也使得 Redis 可以作为一个基础性的网络服务进行访问扩大了 Redis 的应用范围。 Redis 的持久化模块能支持两种方式日志AOF和快照RDB这两种持久化方式具有不同的优劣势影响到 Redis 的访问性能和可靠性。 Redis 支持高可靠集群和高可扩展集群因此Redis 中包含了相应的集群功能支撑模块。 3. redis常见的数据结构 redis渐进式rehash 压缩列表 zlbytes、zltail 和 zllen分别表示列表长度、列表尾的偏移量和列表中的 entry 个数 第一个元素和最后一个元素复杂度为O(1)其他为O(N) 跳表 在链表的基础上加了多级索引 查找复杂度为O(logN) 思考 整数数组和压缩列表在查找时间复杂度方面并没有很大的优势那为什么 Redis 还会把它们作为底层数据结构呢 1、内存利用率数组和压缩列表都是非常紧凑的数据结构它比链表占用的内存要更少。Redis是内存数据库大量数据存到内存中此时需要做尽可能的优化提高内存的利用率。 2、数组对CPU高速缓存支持更友好所以Redis在设计时集合数据元素较少情况下默认采用内存紧凑排列的方式存储同时利用CPU高速缓存不会降低访问速度。当数据元素超过设定阈值后避免查询时间复杂度太高转为哈希和跳表数据结构存储保证查询效率。 如果在数组上是随机访问对CPU高速缓存还友好不 如果在数组上是随机访问会造成 CPU 高速缓存整个缓存行失效命中率降低。取决于数组的大小 4. 高性能IO模型为什么单线程Redis能那么快 为什么使用单线程 大部分线程也在等待获取访问共享资源的互斥锁并行变串行系统吞吐率并没有随着线程的增加而增加。 采用多线程开发一般会引入同步原语来保护共享资源的并发访问这也会降低系统代码的易调试性和可维护性。为了避免这些问题Redis 直接采用了单线程模式。 单线程Redis为什么那么快 内存操作数据结构hash表、跳表提高访问效率多路复用机制 多路复用模型 为了在请求到达时能通知到 Redis 线程select/epoll 提供了基于事件的回调机制即针对不同事件的发生调用相应的处理函数。select/epoll 一旦监测到 FD 上有请求到达时就会触发相应的事件。 事件驱动两个请求分别对应 Accept 事件和 Read 事件Redis 分别对这两个事件注册 accept 和 get 回调函数。当 Linux 内核监听到有连接请求或读数据请求时就会触发 Accept 事件和 Read 事件此时内核就会回调 Redis 相应的 accept 和 get 函数进行处理。 问题 “Redis 基本 IO 模型”图中你觉得还有哪些潜在的性能瓶颈吗如何进行解决 Redis单线程处理IO请求性能瓶颈主要包括2个方面 1、任意一个请求在server中一旦发生耗时都会影响整个server的性能也就是说后面的请求都要等前面这个耗时请求处理完成自己才能被处理到。耗时的操作包括以下几种 a、操作bigkey写入一个bigkey在分配内存时需要消耗更多的时间同样删除bigkey释放内存同样会产生耗时 b、使用复杂度过高的命令例如SORT/SUNION/ZUNIONSTORE或者O(N)命令但是N很大例如lrange key 0 -1一次查询全量数据 c、大量key集中过期Redis的过期机制也是在主线程中执行的大量key集中过期会导致处理一个请求时耗时都在删除过期key耗时变长 d、淘汰策略淘汰策略也是在主线程执行的当内存超过Redis内存上限后每次写入都需要淘汰一些key也会造成耗时变长 e、AOF刷盘开启always机制每次写入都需要把这个操作刷到磁盘写磁盘的速度远比写内存慢会拖慢Redis的性能 f、主从全量同步生成RDB虽然采用fork子进程生成数据快照但fork这一瞬间也是会阻塞整个线程的实例越大阻塞时间越久 2、并发量非常大时单线程读写客户端IO数据存在性能瓶颈虽然采用IO多路复用机制但是读写客户端数据依旧是同步IO只能单线程依次读取客户端的数据无法利用到CPU多核。 针对问题1一方面需要业务人员去规避一方面Redis在4.0推出了lazy-free机制把bigkey释放内存的耗时操作放在了异步线程中执行降低对主线程的影响。 针对问题2Redis在6.0推出了多线程可以在高并发场景下利用CPU多核多线程读写客户端数据进一步提升server性能当然只是针对客户端的读写是并行的每个命令的真正操作依旧是单线程的。 5. AOF日志宕机了Redis如何避免数据丢失 AOF写磁盘的风险 1. 命令没有持久化redis宕机可能会导致数据丢失 2. AOF会导致下一个命令阻塞 写磁盘策略 重写机制 AOF重写会阻塞吗 AOF非阻塞的重写过程 一个拷贝 每次执行重写时主线程 fork 出后台的 bgrewriteaof 子进程。此时fork 会把主线程的内存拷贝一份给 bgrewriteaof 子进程这里面就包含了数据库的最新数据。然后bgrewriteaof 子进程就可以在不影响主线程的情况下逐一把拷贝的数据写成操作记入重写日志。 两处日志 因为主线程未阻塞仍然可以处理新来的操作。此时如果有写操作第一处日志就是指正在使用的 AOF 日志Redis 会把这个操作写到它的缓冲区。这样一来即使宕机了这个 AOF 日志的操作仍然是齐全的可以用于恢复。 而第二处日志就是指新的 AOF 重写日志。这个操作也会被写到重写日志的缓冲区。这样重写日志也不会丢失最新的操作。等到拷贝数据的所有操作记录重写完成后重写日志记录的这些最新操作也会写入新的 AOF 文件以保证数据库最新状态的记录。此时我们就可以用新的 AOF 文件替代旧文件了。 总结来说每次 AOF 重写时Redis 会先执行一个内存拷贝用于重写然后使用两个日志保证在重写过程中新写入的数据不会丢失。而且因为 Redis 采用额外的线程进行数据重写所以这个过程并不会阻塞主线程 有两个配置项在控制AOF重写的触发时机 为了减小aof文件的体量可以手动发送“bgrewriteaof”指令通过子进程生成更小体积的aof然后替换掉旧的、大体量的aof文件。 也可以自动触发 1. auto-aof-rewrite-min-size: 表示运行AOF重写时文件的最小大小默认为64MB 2. auto-aof-rewrite-percentage: 这个值的计算方法是当前AOF文件大小和上一次重写后AOF文件大小的差值再除以上一次重写后AOF文件大小。也就是当前AOF文件比上一次重写后AOF文件的增量大小和上一次重写后AOF文件大小的比值。 AOF文件大小同时超出上面这两个配置项时会触发AOF重写。 问题 1. AOF 日志重写的时候是由 bgrewriteaof 子进程来完成的不用主线程参与我们今天说的非阻塞也是指子进程的执行不阻塞主线程。但是你觉得这个重写过程有没有其他潜在的阻塞风险呢如果有的话会在哪里阻塞 Redis采用fork子进程重写AOF文件时潜在的阻塞风险包括fork子进程 和 AOF重写过程中父进程产生写入的场景下面依次介绍。 a、fork子进程fork这个瞬间一定是会阻塞主线程的注意fork时并不会一次性拷贝所有内存数据给子进程文章写的是拷贝所有内存数据给子进程个人认为是有歧义的fork采用操作系统提供的写实复制(Copy On Write)机制就是为了避免一次性拷贝大量内存数据给子进程造成的长时间阻塞问题但fork子进程需要拷贝进程必要的数据结构其中有一项就是拷贝内存页表虚拟内存和物理内存的映射索引表这个拷贝过程会消耗大量CPU资源拷贝完成之前整个进程是会阻塞的阻塞时间取决于整个实例的内存大小实例越大内存页表越大fork阻塞时间越久。拷贝内存页表完成后子进程与父进程指向相同的内存地址空间也就是说此时虽然产生了子进程但是并没有申请与父进程相同的内存大小。那什么时候父子进程才会真正内存分离呢“写实复制”顾名思义就是在写发生时才真正拷贝内存真正的数据这个过程中父进程也可能会产生阻塞的风险就是下面介绍的场景。 b、fork出的子进程指向与父进程相同的内存地址空间此时子进程就可以执行AOF重写把内存中的所有数据写入到AOF文件中。但是此时父进程依旧是会有流量写入的如果父进程操作的是一个已经存在的key那么这个时候父进程就会真正拷贝这个key对应的内存数据申请新的内存空间这样逐渐地父子进程内存数据开始分离父子进程逐渐拥有各自独立的内存空间。因为内存分配是以页为单位进行分配的默认4k如果父进程此时操作的是一个bigkey重新申请大块内存耗时会变长可能会产阻塞风险。另外如果操作系统开启了内存大页机制(Huge Page页面大小2M)那么父进程申请内存时阻塞的概率将会大大提高所以在Redis机器上需要关闭Huge Page机制。Redis每次fork生成RDB或AOF重写完成后都可以在Redis log中看到父进程重新申请了多大的内存空间。 在AOF重写期间Redis运行的命令会被积累在缓冲区待AOF重写结束后会进行回放在高并发情况下缓冲区积累可能会很大这样就会导致阻塞Redis后来通过Linux管道技术让aof期间就能同时进行回放这样aof重写结束后只需要回放少量剩余的数据即可 2. AOF 重写也有一个重写日志为什么它不共享使用 AOF 本身的日志呢 AOF重写不复用AOF本身的日志一个原因是父子进程写同一个文件必然会产生竞争问题控制竞争就意味着会影响父进程的性能。二是如果AOF重写过程中失败了那么原本的AOF文件相当于被污染了无法做恢复使用。所以Redis AOF重写一个新文件重写失败的话直接删除这个文件就好了不会对原先的AOF文件产生影响。等重写完成之后直接替换旧文件即可。 6. 内存快照宕机后Redis如何实现快速恢复 写时复制机制保证快照期间数据可修改 优点恢复速度快 缺点性能开销大 RDB和AOF最佳实践 数据不能丢失时内存快照和 AOF 的混合使用是一个很好的选择 如果允许分钟级别的数据丢失可以只使用 RDB 如果只用 AOF优先使用 everysec 的配置选项因为它在可靠性和性能之间取了一个平衡。 问题 使用一个 2 核 CPU、4GB 内存、500GB 磁盘的云主机运行 RedisRedis 数据库的数据量大小差不多是 2GB我们使用了 RDB 做持久化保证。当时 Redis 的运行负载以修改操作为主写读比例差不多在 8:2 左右也就是说如果有 100 个请求80 个请求执行的是修改操作。你觉得在这个场景下用 RDB 做持久化有什么风险吗 产生的风险主要在于 CPU资源 和 内存资源 a、内存资源风险Redis fork子进程做RDB持久化由于写的比例为80%那么在持久化过程中“写时复制”会重新分配整个实例80%的内存副本大约需要重新分配1.6GB内存空间这样整个系统的内存使用接近饱和如果此时父进程又有大量新key写入很快机器内存就会被吃光如果机器开启了Swap机制那么Redis会有一部分数据被换到磁盘上当Redis访问这部分在磁盘上的数据时性能会急剧下降已经达不到高性能的标准可以理解为武功被废。如果机器没有开启Swap会直接触发OOM父子进程会面临被系统kill掉的风险。 b、CPU资源风险虽然子进程在做RDB持久化但生成RDB快照过程会消耗大量的CPU资源虽然Redis处理处理请求是单线程的但Redis Server还有其他线程在后台工作例如AOF每秒刷盘、异步关闭文件描述符这些操作。由于机器只有2核CPU这也就意味着父进程占用了超过一半的CPU资源此时子进程做RDB持久化可能会产生CPU竞争导致的结果就是父进程处理请求延迟增大子进程生成RDB快照的时间也会变长整个Redis Server性能下降。 c、另外可以再延伸一下问题没有提到Redis进程是否绑定了CPU如果绑定了CPU那么子进程会继承父进程的CPU亲和性属性子进程必然会与父进程争夺同一个CPU资源整个Redis Server的性能必然会受到影响所以如果Redis需要开启定时RDB和AOF重写进程一定不要绑定CPU。 7. redis cluster集群 数据切片和实例的对应分布关系 一个切片集群共有 16384 个哈希槽这些哈希槽类似于数据分区每个键值对都会根据它的 key被映射到一个哈希槽中。 首先根据键值对的 key按照CRC16 算法计算一个 16 bit 的值然后再用这个 16bit 值对 16384 取模得到 0~16383 范围内的模数每个模数代表一个相应编号的哈希槽。 数据迁移客户端如何重新定位数据 部分迁移情况重定向 Moved命令和ASK命令 MOVED 命令不同ASK 命令并不会更新客户端缓存的哈希槽分配信息。所以在上图中如果客户端再次请求 Slot 2 中的数据它还是会给实例 2 发送请求。这也就是说ASK 命令的作用只是让客户端能给新实例发送一次请求而不像 MOVED 命令那样会更改本地缓存让后续所有命令都发往新实例。 问题 Redis Cluster不采用把key直接映射到实例的方式而采用哈希槽的方式原因 1、整个集群存储key的数量是无法预估的key的数量非常多时直接记录每个key对应的实例映射关系这个映射表会非常庞大这个映射表无论是存储在服务端还是客户端都占用了非常大的内存空间。 2、Redis Cluster采用无中心化的模式无proxy客户端与服务端直连客户端在某个节点访问一个key如果这个key不在这个节点上这个节点需要有纠正客户端路由到正确节点的能力MOVED响应这就需要节点之间互相交换路由表每个节点拥有整个集群完整的路由关系。如果存储的都是key与实例的对应关系节点之间交换信息也会变得非常庞大消耗过多的网络资源而且就算交换完成相当于每个节点都需要额外存储其他节点的路由表内存占用过大造成资源浪费。 3、当集群在扩容、缩容、数据均衡时节点之间会发生数据迁移迁移时需要修改每个key的映射关系维护成本高。 4、在中间增加一层哈希槽可以把数据和节点解耦key通过Hash计算只需要关心映射到了哪个哈希槽然后再通过哈希槽和节点的映射表找到节点相当于消耗了很少的CPU资源不但让数据分布更均匀还可以让这个映射表变得很小利于客户端和服务端保存节点之间交换信息时也变得轻量。 5、当集群在扩容、缩容、数据均衡时节点之间的操作例如数据迁移都以哈希槽为基本单位进行操作简化了节点扩容、缩容的难度便于集群的维护和管理。 另外 Redis使用集群方案就是为了解决单个节点数据量大、写入量大产生的性能瓶颈的问题。多个节点组成一个集群可以提高集群的性能和可靠性但随之而来的就是集群的管理问题最核心问题有2个请求路由、数据迁移扩容/缩容/数据平衡。 1、请求路由一般都是采用哈希槽的映射关系表找到指定节点然后在这个节点上操作的方案。 Redis Cluster在每个节点记录完整的映射关系(便于纠正客户端的错误路由请求)同时也发给客户端让客户端缓存一份便于客户端直接找到指定节点客户端与服务端配合完成数据的路由这需要业务在使用Redis Cluster时必须升级为集群版的SDK才支持客户端和服务端的协议交互。 其他Redis集群化方案例如Twemproxy、Codis都是中心化模式增加Proxy层客户端通过Proxy对整个集群进行操作Proxy后面可以挂N多个Redis实例Proxy层维护了路由的转发逻辑。操作Proxy就像是操作一个普通Redis一样客户端也不需要更换SDK而Redis Cluster是把这些路由逻辑做在了SDK中。当然增加一层Proxy也会带来一定的性能损耗。 2、数据迁移当集群节点不足以支撑业务需求时就需要扩容节点扩容就意味着节点之间的数据需要做迁移而迁移过程中是否会影响到业务这也是判定一个集群方案是否成熟的标准。 Twemproxy不支持在线扩容它只解决了请求路由的问题扩容时需要停机做数据重新分配。而Redis Cluster和Codis都做到了在线扩容不影响业务或对业务的影响非常小重点就是在数据迁移过程中客户端对于正在迁移的key进行操作时集群如何处理还要保证响应正确的结果 Redis Cluster和Codis都需要服务端和客户端/Proxy层互相配合迁移过程中服务端针对正在迁移的key需要让客户端或Proxy去新节点访问重定向这个过程就是为了保证业务在访问这些key时依旧不受影响而且可以得到正确的结果。由于重定向的存在所以这个期间的访问延迟会变大。等迁移完成之后Redis Cluster每个节点会更新路由映射表同时也会让客户端感知到更新客户端缓存。Codis会在Proxy层更新路由表客户端在整个过程中无感知。 除了访问正确的节点之外数据迁移过程中还需要解决异常情况迁移超时、迁移失败、性能问题如何让数据迁移更快、bigkey如何处理这个过程中的细节也很多。 Redis Cluster的数据迁移是同步的迁移一个key会同时阻塞源节点和目标节点迁移过程中会有性能问题。而Codis提供了异步迁移数据的方案迁移速度更快对性能影响最小当然实现方案也比较复杂。 总结 问题 1rehash 的触发时机和渐进式执行机制 Redis 什么时候做 rehash Redis 会使用装载因子load factor来判断是否需要做 rehash。装载因子的计算方式是哈希表中所有 entry 的个数除以哈希表的哈希桶个数。Redis 会根据装载因子的两种情况来触发 rehash 操作 装载因子≥1同时哈希表被允许进行 rehash 装载因子≥5。 在第一种情况下如果装载因子等于 1同时我们假设所有键值对是平均分布在哈希表的各个桶中的那么此时哈希表可以不用链式哈希因为一个哈希桶正好保存了一个键值对。 但是如果此时再有新的数据写入哈希表就要使用链式哈希了这会对查询性能产生影响。在进行 RDB 生成和 AOF 重写时哈希表的 rehash 是被禁止的这是为了避免对 RDB 和 AOF 重写造成影响。如果此时Redis 没有在生成 RDB 和重写 AOF那么就可以进行 rehash。否则的话再有数据写入时哈希表就要开始使用查询较慢的链式哈希了。 在第二种情况下也就是装载因子大于等于 5 时就表明当前保存的数据量已经远远大于哈希桶的个数哈希桶里会有大量的链式哈希存在性能会受到严重影响此时就立马开始做 rehash。 如果装载因子小于 1或者装载因子大于 1 但是小于 5同时哈希表暂时不被允许进行 rehash例如实例正在生成 RDB 或者重写 AOF此时哈希表是不会进行 rehash 操作的。 2. 采用渐进式 hash 时如果实例暂时没有收到新请求是不是就不做 rehash 了 Redis 会执行定时任务定时任务中就包含了 rehash 操作。所谓的定时任务就是按照一定频率例如每 100ms/ 次执行的任务。在 rehash 被触发后即使没有收到新请求Redis 也会定时执行一次 rehash 操作而且每次执行时长不会超过 1ms以免对其他任务造成影响。 问题 2写时复制的底层实现机制 bgsave 子进程复制主线程的页表以后假如主线程需要修改虚页 7 里的数据那么主线程就需要新分配一个物理页假设是物理页 53然后把修改后的虚页 7 里的数据写到物理页 53 上而虚页 7 里原来的数据仍然保存在物理页 33 上。这个时候虚页 7 到物理页 33 的映射关系仍然保留在 bgsave 子进程中。所以bgsave 子进程可以无误地把虚页 7 的原始数据写入 RDB 文件。 文章转载自: http://www.morning.zlxrg.cn.gov.cn.zlxrg.cn http://www.morning.vjdofuj.cn.gov.cn.vjdofuj.cn http://www.morning.ktmbp.cn.gov.cn.ktmbp.cn http://www.morning.bhdyr.cn.gov.cn.bhdyr.cn http://www.morning.kfmlf.cn.gov.cn.kfmlf.cn http://www.morning.qwrb.cn.gov.cn.qwrb.cn http://www.morning.rbzht.cn.gov.cn.rbzht.cn http://www.morning.yhwmg.cn.gov.cn.yhwmg.cn http://www.morning.bcdqf.cn.gov.cn.bcdqf.cn http://www.morning.hphrz.cn.gov.cn.hphrz.cn http://www.morning.qhmgq.cn.gov.cn.qhmgq.cn http://www.morning.llxqj.cn.gov.cn.llxqj.cn http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.rshkh.cn.gov.cn.rshkh.cn http://www.morning.xnhnl.cn.gov.cn.xnhnl.cn http://www.morning.zxdhp.cn.gov.cn.zxdhp.cn http://www.morning.cwzzr.cn.gov.cn.cwzzr.cn http://www.morning.phlwj.cn.gov.cn.phlwj.cn http://www.morning.yybcx.cn.gov.cn.yybcx.cn http://www.morning.pqkyx.cn.gov.cn.pqkyx.cn http://www.morning.lxcwh.cn.gov.cn.lxcwh.cn http://www.morning.gnmhy.cn.gov.cn.gnmhy.cn http://www.morning.plxhq.cn.gov.cn.plxhq.cn http://www.morning.ylklr.cn.gov.cn.ylklr.cn http://www.morning.nlkhr.cn.gov.cn.nlkhr.cn http://www.morning.dblgm.cn.gov.cn.dblgm.cn http://www.morning.jwwfk.cn.gov.cn.jwwfk.cn http://www.morning.mnjyf.cn.gov.cn.mnjyf.cn http://www.morning.fhcwm.cn.gov.cn.fhcwm.cn http://www.morning.ryfpx.cn.gov.cn.ryfpx.cn http://www.morning.njqpg.cn.gov.cn.njqpg.cn http://www.morning.xhgcr.cn.gov.cn.xhgcr.cn http://www.morning.rlpmy.cn.gov.cn.rlpmy.cn http://www.morning.zylzk.cn.gov.cn.zylzk.cn http://www.morning.ljwyc.cn.gov.cn.ljwyc.cn http://www.morning.yjdql.cn.gov.cn.yjdql.cn http://www.morning.jpydf.cn.gov.cn.jpydf.cn http://www.morning.drfcj.cn.gov.cn.drfcj.cn http://www.morning.tslwz.cn.gov.cn.tslwz.cn http://www.morning.dpqwq.cn.gov.cn.dpqwq.cn http://www.morning.qnzpg.cn.gov.cn.qnzpg.cn http://www.morning.pfjbn.cn.gov.cn.pfjbn.cn http://www.morning.xsjfk.cn.gov.cn.xsjfk.cn http://www.morning.khclr.cn.gov.cn.khclr.cn http://www.morning.mfzyn.cn.gov.cn.mfzyn.cn http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn http://www.morning.mqlsf.cn.gov.cn.mqlsf.cn http://www.morning.c7624.cn.gov.cn.c7624.cn http://www.morning.mphfn.cn.gov.cn.mphfn.cn http://www.morning.weitao0415.cn.gov.cn.weitao0415.cn http://www.morning.syynx.cn.gov.cn.syynx.cn http://www.morning.hksxq.cn.gov.cn.hksxq.cn http://www.morning.ftrpvh.cn.gov.cn.ftrpvh.cn http://www.morning.qrksj.cn.gov.cn.qrksj.cn http://www.morning.xbdd.cn.gov.cn.xbdd.cn http://www.morning.brhxd.cn.gov.cn.brhxd.cn http://www.morning.skfkx.cn.gov.cn.skfkx.cn http://www.morning.ryznd.cn.gov.cn.ryznd.cn http://www.morning.lfpzs.cn.gov.cn.lfpzs.cn http://www.morning.rfpxq.cn.gov.cn.rfpxq.cn http://www.morning.xjnw.cn.gov.cn.xjnw.cn http://www.morning.hydkd.cn.gov.cn.hydkd.cn http://www.morning.qbwbs.cn.gov.cn.qbwbs.cn http://www.morning.nhdw.cn.gov.cn.nhdw.cn http://www.morning.sqnrz.cn.gov.cn.sqnrz.cn http://www.morning.jtsdk.cn.gov.cn.jtsdk.cn http://www.morning.jzlfq.cn.gov.cn.jzlfq.cn http://www.morning.drqrl.cn.gov.cn.drqrl.cn http://www.morning.ynwdk.cn.gov.cn.ynwdk.cn http://www.morning.qinhuangdjy.cn.gov.cn.qinhuangdjy.cn http://www.morning.ddjp.cn.gov.cn.ddjp.cn http://www.morning.litao4.cn.gov.cn.litao4.cn http://www.morning.lizpw.com.gov.cn.lizpw.com http://www.morning.zkgpg.cn.gov.cn.zkgpg.cn http://www.morning.wnjwb.cn.gov.cn.wnjwb.cn http://www.morning.lgsfb.cn.gov.cn.lgsfb.cn http://www.morning.btrfm.cn.gov.cn.btrfm.cn http://www.morning.mygbt.cn.gov.cn.mygbt.cn http://www.morning.jklns.cn.gov.cn.jklns.cn 查看全文 http://www.tj-hxxt.cn/news/247288.html 相关文章: 公司的 SEO与网站建设温州网站建设咨询 三亚中国检科院生物安全中心门户网站建设临沂法律网站开发公司 有没有教做帽子的网站自己怎么做wap网站 做网站不想用微软雅黑了重庆辣肠怎么制作 太原站建设有多长时间保定聊城网站建设 1微信网站怎么建设企业网站关键字优化 百度网站建设前期都有哪些费用阳江百姓网 电子商务网站建设的方法及流程图泰安市住房与城乡建设局网站 网站风格抄袭政务版企业微信app下载安装 宁波网站优化平台设计前沿的网站 浙江网站优化公司网站用php做的吗 网站建设环保wordpress邮箱qq接入 国内老牌的网站制作线上编程培训机构哪家好 技术馆网站建设网站制作多少费用 知名的中文域名网站有哪些教育培训公司 谷歌google浏览器柳州seo公司 160 国际英文网站wordpress分页diam 优质聊城做网站费用商城网站系 威海市做网站的销售推广的方法都有哪些 网站开发 混合式 数据库网上全网推广 树莓派做博客网站深圳网站建设与网站制作 做网站有维护费是什么费用开发网站和application 网站 廉政建设 板块购物网站的开发 小学网站建设方案淄博网站制作高端营销 哪些网站是jsp做的wordpress点赞打赏 asp做的网站js网站开发工具 四线城市做网站建设怎么样哪儿有网络推广培训 济南网站制作报价中博建设集团有限公司网站 交流平台网站怎么做制作网站的登录界面怎么做 郴州做网站的公司如何创立自己的品牌