前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >字节跳动面试题-HashMap底层原理与HashTable的区别

字节跳动面试题-HashMap底层原理与HashTable的区别

作者头像
GeekLiHua
发布于 2025-01-21 06:55:27
发布于 2025-01-21 06:55:27
14400
代码可运行
举报
文章被收录于专栏:JavaJava
运行总次数:0
代码可运行

字节跳动面试题-HashMap底层原理与HashTable的区别

HashMap底层原理解析
1. HashMap的基本概念

HashMap是一个基于哈希表的实现,它允许null键和null值,并且是无序的。它工作的原理是通过将键映射到值来存储和检索数据。在HashMap内部,通过使用哈希函数将键映射到存储桶中。

2. HashMap的数据结构

HashMap的底层数据结构主要包括数组和链表(或红黑树)。每个数组元素称为桶(bucket),每个桶存储了一个链表或者树结构,用于解决哈希冲突。

3. 哈希冲突的解决

当不同的键经过哈希函数映射到相同的桶时,就会发生哈希冲突。HashMap使用链表或红黑树来解决哈希冲突。在Java 8中,当链表长度超过阈值(默认为8)时,链表会转换成红黑树,以提高检索效率。

4. HashMap的关键方法

HashMap主要提供了以下几个核心方法:

  • put(key, value): 将指定的键值对存储到HashMap中。
  • get(key): 根据键检索对应的值。
  • remove(key): 根据键移除对应的键值对。
5. Java中HashMap的实现

下面是一个简单的HashMap实现示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 创建一个HashMap实例
        HashMap<String, Integer> hashMap = new HashMap<>();

        // 添加键值对
        hashMap.put("apple", 10);
        hashMap.put("banana", 20);
        hashMap.put("orange", 30);

        // 根据键获取值
        int value = hashMap.get("apple");
        System.out.println("Value for key 'apple': " + value);

        // 删除键值对
        hashMap.remove("banana");

        // 打印HashMap的内容
        System.out.println("HashMap after removal: " + hashMap);
    }
}
6. HashMap的内部工作流程
  • 当调用put(key, value)方法时,首先会计算键的哈希码。
  • 根据哈希码计算桶的索引位置。
  • 如果桶为空,则直接将键值对插入其中。
  • 如果桶不为空,发生哈希冲突,则根据键的equals方法比较键的值:
    • 如果存在相同的键,则更新对应的值。
    • 如果不存在相同的键,则将键值对插入到链表的末尾或红黑树中。
  • 当调用get(key)方法时,会根据键的哈希码找到对应的桶,然后在链表或者红黑树中进行查找。
HashMap与HashTable的区别
1. 线程安全性
  • HashMap是非线程安全的:HashMap不是同步的,即在多线程环境下不保证线程安全。
  • HashTable是线程安全的:HashTable是同步的,它的方法都是synchronized的,能够在多线程环境下保证线程安全。
2. 性能
  • HashMap通常比HashTable更快:由于HashTable的方法是同步的,因此在多线程环境下性能会受到影响。
  • HashMap更适合单线程环境:在单线程环境下,HashMap的性能通常比HashTable更好,因为它不需要处理同步的开销。
3. null键值对的处理
  • HashMap允许键和值为null:HashMap允许键和值为null,而HashTable不允许。
  • HashTable不支持null键值:当尝试将null键或值放入HashTable时,会抛出NullPointerException。
4. 迭代器
  • HashMap的迭代器是fail-fast的:如果在迭代期间修改了HashMap的结构(除了使用迭代器自身的remove方法),则会抛出ConcurrentModificationException。
  • HashTable的迭代器不是fail-fast的:HashTable的Enumeration不抛出ConcurrentModificationException,因为它的方法都是同步的。

下面是一个示例代码,演示了HashMap和HashTable的迭代器特性以及fail-fast机制的区别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;

public class IteratorExample {
    public static void main(String[] args) {
        // 创建一个HashMap实例
        HashMap<String, Integer> hashMap = new HashMap<>();
        hashMap.put("one", 1);
        hashMap.put("two", 2);
        hashMap.put("three", 3);

        // 创建一个Hashtable实例
        Hashtable<String, Integer> hashtable = new Hashtable<>();
        hashtable.put("one", 1);
        hashtable.put("two", 2);
        hashtable.put("three", 3);

        // 使用HashMap的迭代器遍历
        try {
            Iterator<Map.Entry<String, Integer>> hashMapIterator = hashMap.entrySet().iterator();
            while (hashMapIterator.hasNext()) {
                Map.Entry<String, Integer> entry = hashMapIterator.next();
                System.out.println("HashMap: " + entry.getKey() + " - " + entry.getValue());
                // 修改HashMap的结构,将会抛出ConcurrentModificationException
                hashMap.put("four", 4);
            }
        } catch (Exception e) {
            System.out.println("HashMap 迭代器 fail-fast 特性触发: " + e);
        }

        // 使用Hashtable的迭代器遍历
        Iterator<Map.Entry<String, Integer>> hashtableIterator = hashtable.entrySet().iterator();
        while (hashtableIterator.hasNext()) {
            Map.Entry<String, Integer> entry = hashtableIterator.next();
            System.out.println("Hashtable: " + entry.getKey() + " - " + entry.getValue());
            // 修改Hashtable的结构,不会抛出ConcurrentModificationException
            hashtable.put("four", 4);
        }
    }
}
  • 当我使用HashMap的迭代器遍历时,当尝试在迭代期间修改HashMap的结构时,会抛出ConcurrentModificationException异常,这是由于HashMap的迭代器是fail-fast的特性导致的。
  • 而当我使用Hashtable的迭代器遍历时,即使在迭代期间修改了Hashtable的结构,也不会抛出ConcurrentModificationException异常,这是因为Hashtable的迭代器不是fail-fast的特性。
5. 容量增长
  • HashMap的容量可以动态增长:HashMap允许根据需要动态调整容量,以保持加载因子(默认为0.75)以下。
  • HashTable的容量不会动态增长:HashTable的容量是固定的,当容量不足
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Hashtable;

public class Main {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        // 创建一个HashMap实例
        HashMap<String, Integer> hashMap = new HashMap<>();

        // 向HashMap中添加大量数据
        for (int i = 0; i < 10000; i++) {
            hashMap.put("key" + i, i);
        }

        // 创建一个Hashtable实例
        Hashtable<String, Integer> hashtable = new Hashtable<>();

        // 向Hashtable中添加大量数据
        for (int i = 0; i < 10000; i++) {
            hashtable.put("key" + i, i);
        }

        // 获取HashMap内部的容量信息
        Field tableField = HashMap.class.getDeclaredField("table");
        tableField.setAccessible(true);
        Object[] table = (Object[]) tableField.get(hashMap);

        // 输出HashMap和Hashtable的容量信息
        int hashMapCapacity = table == null ? 0 : table.length;
        System.out.println("HashMap的容量: " + hashMap.size() + ", 实际容量: " + hashMapCapacity);
        System.out.println("Hashtable的容量: " + hashtable.size() + ", 实际容量: " + hashtable.size());
    }
}

在上面的代码中,我创建了一个HashMap和一个Hashtable实例,并向它们分别添加了大量数据(10000条)。然后,我通过size()方法获取它们的大小,通过反射的方式获取它们的实际容量。

接下来,我解释一下代码中涉及到的重要概念:

  • HashMap的容量增长:在向HashMap中不断添加键值对的过程中,当达到一定的负载因子(默认为0.75)时,HashMap会自动进行容量增长。这是为了保持HashMap的性能,在保持负载因子以下的情况下,减少哈希冲突的概率,提高检索效率。HashMap会以大约两倍的速度增长容量,以便尽量减少重新哈希的次数。
  • Hashtable的固定容量:与HashMap不同,Hashtable的容量是固定的,不会动态增长。当添加新元素导致容量不足时,Hashtable会重新分配一个更大的存储空间,并将原有的键值对重新散列到新的存储空间中。这种方式效率较低,容易导致性能问题。
HashMap的应用场景
1. 缓存实现

HashMap可以用作缓存的实现,通过将键值对存储在HashMap中,可以快速地检索和访问缓存数据。例如,可以将最近访问的数据存储在HashMap中,以提高数据访问的速度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HashMap<String, Object> cache = new HashMap<>();
// 将数据存储到缓存中
cache.put("key", data);
// 从缓存中获取数据
Object cachedData = cache.get("key");
2. 数据索引

在需要快速查找和检索数据的场景中,HashMap是一个理想的数据结构。例如,在文本搜索引擎中,可以使用HashMap来存储文档索引,以快速查找包含特定关键字的文档。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HashMap<String, List<Document>> index = new HashMap<>();
// 将关键字和对应的文档列表存储到索引中
index.put("keyword", documents);
// 根据关键字快速获取文档列表
List<Document> matchedDocuments = index.get("keyword");
3. 数据聚合与分组

在数据处理和分析领域,HashMap常常用于数据的聚合和分组。例如,在处理日志数据时,可以使用HashMap来按照不同的标签对数据进行分组统计。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HashMap<String, Integer> groupCounts = new HashMap<>();
// 遍历日志数据,按照不同的标签进行分组统计
for (LogEntry entry : logEntries) {
    String label = entry.getLabel();
    // 更新标签对应的计数
    groupCounts.put(label, groupCounts.getOrDefault(label, 0) + 1);
}
4. 缓存对象的快速检索

在对象关联性数据的管理中,HashMap可以用于快速检索对象。例如,在一个电子商务应用中,可以将商品ID映射到对应的商品对象,以便快速检索商品信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HashMap<String, Product> productMap = new HashMap<>();
// 将商品ID和对应的商品对象存储到HashMap中
productMap.put(product.getId(), product);
// 根据商品ID快速获取对应的商品对象
Product product = productMap.get(productId);
5. 缓存管理

HashMap还可以用于管理系统中的配置信息、用户会话等数据。通过将这些数据存储在HashMap中,可以方便地进行管理和访问。

演示了如何使用HashMap来管理系统中的配置信息和用户会话数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.HashMap;

public class CacheManager {
    // 创建一个HashMap实例用于存储配置信息
    private HashMap<String, String> configMap = new HashMap<>();

    // 创建一个HashMap实例用于存储用户会话数据
    private HashMap<String, UserSession> sessionMap = new HashMap<>();

    // 添加配置信息
    public void addConfig(String key, String value) {
        configMap.put(key, value);
    }

    // 获取配置信息
    public String getConfig(String key) {
        return configMap.get(key);
    }

    // 添加用户会话
    public void addUserSession(String sessionId, UserSession session) {
        sessionMap.put(sessionId, session);
    }

    // 获取用户会话
    public UserSession getUserSession(String sessionId) {
        return sessionMap.get(sessionId);
    }

    // 内部类,表示用户会话信息
    private static class UserSession {
        private String userId;
        private long lastAccessTime;

        public UserSession(String userId) {
            this.userId = userId;
            this.lastAccessTime = System.currentTimeMillis();
        }

        public String getUserId() {
            return userId;
        }

        public long getLastAccessTime() {
            return lastAccessTime;
        }
    }

    public static void main(String[] args) {
        CacheManager cacheManager = new CacheManager();

        // 添加配置信息
        cacheManager.addConfig("server.url", "http://example.com");
        cacheManager.addConfig("server.port", "8080");

        // 获取配置信息并打印
        System.out.println("Server URL: " + cacheManager.getConfig("server.url"));
        System.out.println("Server Port: " + cacheManager.getConfig("server.port"));

        // 添加用户会话
        UserSession session1 = new UserSession("user123");
        cacheManager.addUserSession("session1", session1);

        // 获取用户会话并打印
        UserSession retrievedSession = cacheManager.getUserSession("session1");
        if (retrievedSession != null) {
            System.out.println("User ID: " + retrievedSession.getUserId());
            System.out.println("Last Access Time: " + retrievedSession.getLastAccessTime());
        }
    }
}

在这个示例代码中,我创建了一个 CacheManager 类,用于管理系统中的配置信息和用户会话数据。我使用了两个 HashMap 实例,一个用于存储配置信息 (configMap),另一个用于存储用户会话数据 (sessionMap)。我提供了方法来添加和获取配置信息,以及添加和获取用户会话数据。此外,我使用了一个内部类 UserSession 来表示用户会话信息。

HashMap优化和实践
1. 初始容量和加载因子

在创建HashMap时,可以指定初始容量和加载因子。初始容量是HashMap最初的容量大小,加载因子是HashMap在容量自动增加之前可以达到的负载因子。

通常情况下,应该根据预期的存储量和负载因子选择初始容量和加载因子,以避免HashMap频繁的扩容操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HashMap<String, Integer> map = new HashMap<>(16, 0.75f);
2. 使用泛型

在定义HashMap时,应该尽量使用泛型来指定键和值的类型,以避免在编译时或运行时出现类型不匹配的错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HashMap<String, Integer> map = new HashMap<>();
3. 考虑键的哈希性能

在实现自定义对象作为HashMap的键时,应该重写hashCode()和equals()方法,以确保对象的哈希码和相等性能满足HashMap的要求。否则可能导致哈希冲突或不正确的数据检索。

4. 使用迭代器遍历

在遍历HashMap时,应该优先使用迭代器进行遍历,以确保在遍历过程中不会修改HashMap的结构,避免ConcurrentModificationException异常。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HashMap<String, Integer> map = new HashMap<>();
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Integer> entry = iterator.next();
    // 处理键值对
}
5. 合理选择数据结构

在需要并发访问的场景下,应该考虑使用ConcurrentHashMap代替HashMap,以确保线程安全性。ConcurrentHashMap是Java提供的线程安全的HashMap实现。

下面是一个简单的示例代码,演示了在并发访问场景下如何使用 ConcurrentHashMap 替代 HashMap,以确保线程安全性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentExample {
    public static void main(String[] args) {
        // 使用 HashMap 存储数据的场景
        Map<String, Integer> hashMap = new HashMap<>();

        // 使用 ConcurrentHashMap 存储数据的场景
        Map<String, Integer> concurrentHashMap = new ConcurrentHashMap<>();

        // 创建并发访问的线程
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    // 向 HashMap 中添加数据
                    hashMap.put("key" + i, i);
                    // 向 ConcurrentHashMap 中添加数据
                    concurrentHashMap.put("key" + i, i);
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 1000; i++) {
                    // 向 HashMap 中添加数据
                    hashMap.put("key" + i, i);
                    // 向 ConcurrentHashMap 中添加数据
                    concurrentHashMap.put("key" + i, i);
                }
            }
        });

        // 启动线程
        thread1.start();
        thread2.start();

        try {
            // 等待线程执行完毕
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出 HashMap 和 ConcurrentHashMap 中的数据大小
        System.out.println("HashMap size: " + hashMap.size());
        System.out.println("ConcurrentHashMap size: " + concurrentHashMap.size());
    }
}

在这个示例代码中,我创建了一个 HashMap 和一个 ConcurrentHashMap 实例,分别用于存储数据。然后,我创建了两个线程,每个线程分别向 HashMapConcurrentHashMap 中添加数据。最后,我通过输出两个集合中的数据大小来比较它们。

由于 HashMap 不是线程安全的,因此在多线程环境下使用可能会导致数据不一致或其他异常。而 ConcurrentHashMap 是线程安全的,它通过细粒度的锁和分段锁来保证线程安全性,因此在多线程环境下使用更为安全和高效。

在这里插入图片描述
在这里插入图片描述

虽然使用了两个线程向 HashMapConcurrentHashMap 中添加数据,但由于 HashMap 不是线程安全的,因此可能会发生竞态条件(race condition)和不一致的情况。

当多个线程同时向 HashMap 中添加元素时,由于 HashMap 不提供同步机制,可能会出现以下情况之一:

  1. 线程1和线程2同时尝试往同一个桶中添加元素,由于没有加锁,它们可能同时读取到相同的桶,然后同时尝试修改桶中的链表或树结构,导致数据丢失或者结构混乱。
  2. 两个线程同时尝试修改 HashMap 的内部结构,比如扩容时,可能会导致其中一个线程的修改被覆盖或丢失。

这种情况在 ConcurrentHashMap 中是得到了有效的控制和处理的,因为它内部采用了分段锁机制,不同的段(Segment)拥有自己的锁,使得不同段的操作可以并发进行,从而提高了并发性能。

由于 HashMap 在并发访问时可能出现线程安全问题,所以可能会导致 HashMap 中的数据量看起来更大,因为可能有更多的元素没有被正确添加进去或被其他线程覆盖了,而 ConcurrentHashMap 在并发环境下更加安全,保证了数据的一致性和准确性。

当我启动了两个线程,每个线程向 HashMapConcurrentHashMap 中添加了1000个元素。然而,HashMap的size比ConcurrentHashMap要大。

这种差异可能是由于 HashMap 不是线程安全的,而 ConcurrentHashMap 是线程安全的。

HashMap 中,由于两个线程同时向 HashMap 中添加元素,可能会发生竞态条件(race condition)和不一致的情况。可能会出现以下情况之一:

  1. 由于线程之间竞争资源,可能会导致某些键值对被覆盖或丢失,但在某些情况下,它们可能仍然在HashMap中被计数。
  2. HashMap 内部,如果发生扩容,那么在扩容期间可能会出现不一致的情况,导致某些键值对在扩容完成之前被计数,但又被重新处理。
  3. 可能由于 HashMap 的非线程安全性,在计算大小时可能存在一些并发问题。

而在 ConcurrentHashMap 中,由于其内部使用了线程安全的机制,因此在并发情况下添加元素时,不会出现竞态条件,且能够保证数据的一致性。

6. 避免频繁的扩容

频繁的扩容会影响HashMap的性能,因此在预估存储数据量时,应该合理选择初始容量和加载因子,以减少扩容操作的发生。 比如以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.HashMap;

public class Main<K, V> extends HashMap<K, V> {
    // 重写size方法
    @Override
    public int size() {
        return super.size();
    }

    // 计算容量的方法
    public int capacity() {
        return (int) (size() / loadFactor()) + 1;
    }

    // 负载因子
    private float loadFactor() {
        return 0.75f; // 默认负载因子
    }

    public static void main(String[] args) {
        Main<String, Integer> customHashMap = new Main<>();
        customHashMap.put("One", 1);
        customHashMap.put("Two", 2);
        customHashMap.put("Three", 3);

        System.out.println("HashMap的大小: " + customHashMap.size());
        System.out.println("HashMap的容量: " + customHashMap.capacity());
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
三篇文章了解 TiDB 技术内幕:说存储
PingCAP
2017/05/18
2K0
三篇文章了解 TiDB 技术内幕:说存储
简单了解 TiDB 架构
大家如果看过我之前发过的文章就知道,我写过很多篇关于 MySQL 的文章,从我的 Github 汇总仓库 中可以看出来:
SH的全栈笔记
2022/08/17
7580
简单了解 TiDB 架构
TIDB TIKV数据存储到ROCKSDB探秘 与 ROCKSDB 本尊
为什么最近一直在看分布式数据库,因为第六感给我的指示是, 分布式数据库是国产数据库下一个要发力的点, 为什么. 如果作为一个产品经理, 首先一个产品要有用户的画像, 那么什么数据库是可以找到金主"爸爸"的, 分布式数据库,并且这些金主们, 应该都很有钱. 单体数据库能吸引大量资金的时代是要过去了. 一个维护费用低,稳定性强, 扩展能力强并且将之前数据库的"毛病" 都一一扫尽的数据库产品, 银行和金融机构应该是很欢喜的. 这也是一些银行自研分布式数据库,或者使用商用分布式数据库的原因吧.
AustinDatabases
2021/08/06
1.8K0
TIDB  TIKV数据存储到ROCKSDB探秘  与 ROCKSDB 本尊
美团点评 TiDB 深度实践之旅
在美团,基于 MySQL 构建的传统关系型数据库服务已经难于支撑公司业务的爆发式增长,促使我们去探索更合理的数据存储方案和实践新的运维方式。随着近一两年来分布式数据库大放异彩,美团 DBA 团队联合架构存储团队,于 2018 年初启动了分布式数据库项目。
PingCAP
2018/11/15
3.4K0
十问 TiDB :关于架构设计的一些思考
做 TiDB 的缘起是从思考一个问题开始的:为什么在数据库领域有这么多永远也躲不开的坑?从 2015 年我们写下第一行代码,3 年以来我们迎面遇到无数个问题,一边思考一边做,尽量用最小的代价来快速奔跑。
PingCAP
2018/06/20
1.1K0
十问 TiDB :关于架构设计的一些思考
TiDB 在华泰证券的探索与实践
文章转载自公众号华泰证券数字科技。 原文链接:https://mp.weixin.qq.com/s/Hp-ZJLdvd3z2w9IJ_32NRw?scene=25#wechat_redirect 作者
PingCAP
2019/08/20
1.1K0
单机版tidb数据库搭建
TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为 OLTP(Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。TiDB 具备如下核心特点:
summerking
2022/10/27
7760
吴镝:TiDB 在今日头条的实践
TiDB 主要应用在今日头条核心 OLTP 系统 - 对象存储系统中,存储其中一部分元数据,支持头条图片和视频相关业务,比如抖音等。
PingCAP
2018/03/16
2.9K4
吴镝:TiDB 在今日头条的实践
别再分库分表了,试试TiDB!
TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。
码猿技术专栏
2023/05/01
1.4K0
别再分库分表了,试试TiDB!
写给社区的回顾和展望:TiDB 2019, Level Up !
同时在技术上,2018 年我觉得也交出了一份令人满意的答卷,TiDB 的几个主要项目今年一共合并了 4380 个提交,这几天在整理 2018 年的 Change Log 时候,对比了一下年初的版本,这 4380 个 Commits 背后代表了什么,这里简单写一个文章总结一下。
PingCAP
2019/01/03
6330
TIDB,面向未来的数据库到底是什么?
tidb这个技术名词很多同学或多或少都曾经耳闻过,但是很多同学觉得他是分布式数据库,自己的业务是使用mysql,基本使用不上这个技术,可能不会去了解他。最近业务上有个需求使用到了tidb,于是学习了一下基本原理,会发现这些原理其实不仅仅局限于分布式数据库这一块,很多技术都是通用的,所以在这里写一下分享一下学习tidb的一些心得。
用户5397975
2021/07/21
6780
分库分表:TIDB,你是来抢生意的?不讲码德?
如今硬件的性价比越来越高,网络传输速度越来越快,数据库分层的趋势逐渐显现,人们已经不再强求用一个解决方案来解决所有的存储问题,而是通过分层,让缓存与数据库负责各自擅长的业务场景。
狼王编程
2021/06/01
1.1K0
分库分表:TIDB,你是来抢生意的?不讲码德?
TiDB初探
翻了一下TiDB的文档,对TiDB有了个大概的了解。简单说,TiDB的实现架构是:底层是分布式KV引擎TiKV,上层是SQL引擎TiDB Servers。一般传统数据库也是这么分层实现的,只不过TiKV实现了一个分布式、强一致、支持事务的K/V,不像数据库是单机版K/V。在TiKV之上实现SQL引擎就简化了很多,因此TiDB Servers是无状态的。
mazhen
2023/11/24
2220
TiDB初探
TIDB 学习计划 --- 什么是分布式数据库和TIDB 整体架构
从今天开始就准备学习TIDB数据库,初期基础差,学习可能会比较困难入门后可能就会好很多
AustinDatabases
2020/06/23
1.3K0
蔚来汽车 x TiDB丨单表超 20 亿条数据,从 MySQL 到 TiDB 的迁移思考与实践
本文来自 TiDB 社区合肥站走进蔚来汽车——吴记老师的演讲《TiDB 在新能源车企的实践:MySQL 到 TiDB 的迁移思考》。
PingCAP
2024/08/05
2290
蔚来汽车 x TiDB丨单表超 20 亿条数据,从 MySQL 到 TiDB 的迁移思考与实践
余军:分布式数据库在金融行业的创新实践
分布式数据库系统通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都可能有DBMS的一份完整拷贝副本,或者部分拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库。余军讲师为你讲解分布式数据库在金融行业的创新实践。 余军 PingCAP 高级技术总监,金融行业首席架构师;开源软件的忠实爱好者,负责金融行业基于 TiDB 产品的解决方案、产品架构咨询和建设规划。主要工作经历:富麦信息科技有限公司 CTO ,中
企鹅号小编
2018/01/15
2K0
余军:分布式数据库在金融行业的创新实践
1.深入TiDB:初见TiDB
本篇文章应该是我研究的 TiDB 的第一篇文章,主要是介绍整个 TiDB 架构以及它能支持哪些功能为主。至于其中的细节,我也是很好奇,所以不妨关注一下,由我慢慢讲述。
luozhiyun
2021/07/08
1.1K0
深入浅出 TiDB 框架
TiDB主要分为3个核心组件:TiDB Server ,PD Server 和TiKV Server,还有用于解决用户复杂OLAP需求的TiSpark组件。部署一个单机版的TiDB,这三个组件都需要启动。如果用生产环境,需要使用Ansible部署TiDB集群。
玄姐谈AGI
2021/07/06
8670
深入浅出 TiDB 框架
Tidb4.0五大核心功能 及 适应场景
TiDB是开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理(Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式数据库产品,具备水平扩容、缩容、金融级高可用、实时HTAP、云原生的分布式数据库、兼容MySQL5.7协议和MySQL生态等重要特性。目标是为用户提供一站式OLTP(OnlineTransactionalProcessing)、OLAP(OnlineAnalyticalProcessing)、HTAP解决方案。
杨漆
2021/03/10
9220
Tidb4.0五大核心功能 及 适应场景
TIDB 初级课程体验 1 (为什么需要分布式数据库)
最近TIDB 开放了相关的初级课程,目前最火热的分布式数据库,那是的深入一下,最近一段时间都会围绕TIDB 的课程学习来写一写相关的总结和体会。
AustinDatabases
2021/08/06
5700
TIDB  初级课程体验    1  (为什么需要分布式数据库)
推荐阅读
相关推荐
三篇文章了解 TiDB 技术内幕:说存储
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验