666666666

Hashmap的CurrentHashmap的区别?


       1、 HashMap不支持并发操作,而ConcurrentHashMap支持并发操作。通过继承 ReentrantLock,CAS和synchronized来加锁,每次锁住一小数组 segment,只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。

       2、 JDK1.8之前HashMap由数组+链表构成,JDK1.8之后在此前的基础上加红黑树;JDK1.8之前ConcurrentHashMap由segment数组+数组+链表组成,之后ConcurrentHashMap的结构为数组+链表+红黑树。

CurrentHashmap的底层结构1.7和1.8的有什么不同?


JDK1.7:

        ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。egment 继承了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。Segment 默认为 16,也就是并发度为 16。

 JDK1.8

        ConcurrentHashMap转换成 Node数组+链表+红黑树结构;在锁的实现上,抛弃了原有的 Segment 分段锁,采用CAS + synchronized实现更加细粒度的锁。

数据库的海量数据存储      

分区:

        按照一定的规则,把存储数据的一张表对应的ibd文件分成多个小文件,每个小文件存储原来文件一部分数据。用来解决单表数据较多的问题。只是物理层面的拆分,逻辑上还是一张表。

分表:

        分为水平分表和垂直分表两种方式。

        水平分表,表结构不变,改变的是数据。例如,赛季榜单,每个赛季一张表;
        垂直分表,将宽表(每张表数据可能不会很多,但是字段很多一把超过30个以上)分为多张表,每张表的结构不一样,数自然也不一样。

前两者都是都是真针对单个数据库而言的,这会引发诸多问题:

  • 单点故障问题:数据库发生故障,整个系统就会瘫痪

  • 单库的性能瓶颈问题:单库受服务器限制,其网络带宽、CPU、连接数都有瓶颈

  • 单库的存储瓶颈问题:单库的磁盘空间有上限,如果磁盘过大,数据检索的速度又会变慢

        在大行项目中,机会采用微服务的思想来设计数据库,一个服务对应一个数据库,也叫垂直分库;而为了保证单节点的高可用性,我们会给数据库建立主从集群,主节点向从节点同步数据。两者结构一样,可以看做是水平扩展

     

排行榜功能是如何实现?   

import router from './router' import store from './store' import { Message } from 'element-ui' import NProgress from 'nprogress' import 'nprogress/nprogress.css' import { getToken } from '@/utils/auth' import { getInfo } from '@/api/login' NProgress.configure({ showSpinner: false }) const whiteList = ['/login', '/auth-redirect', '/bind', '/register','/homepage'] router.beforeEach((to, from, next) => { NProgress.start() if (getToken()) { to.meta.title && store.dispatch('settings/setTitle', to.meta.title) console.log("store.getters.roles====",store.getters.roles); console.log("getToken",getToken()) /* has token*/ if (to.path === '/login') { console.log("666666666") //判断身份非管理员跳转用户首页 if (store.getters.roles.length !== 0 && store.getters.roles.indexOf("admin") != -1 ) { console.log("7777777777777") next({ path: '/homepage' }) } else { console.log("88888888888888") next({ path: '/' }) } NProgress.done() } else { //其他路由 //角色未加载 if (store.getters.roles.length === 0) { // 判断当前用户是否已拉取完user_info信息 store.dispatch('GetInfo').then(() => { store.dispatch('GenerateRoutes').then(accessRoutes => { // 根据roles权限生成可访问的路由表 router.addRoutes(accessRoutes) // 动态添加可访问路由表 next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 }) }).catch(err => { store.dispatch('LogOut').then(() => { Message.error(err) next({ path: '/' }) }) }) } else { next() } } } else { // 没有token if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 next() } else { next(`/homepage?redirect=${to.fullPath}`) // 否则全部重定向到登录页 NProgress.done() } } }) router.afterEach(() => { NProgress.done() }) 这段代码我想让 store.getters.roles.length 一定存在 怎么办
06-08
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值