[万字长文] 系统设计之路:如何设计一个URL短链服务

Posted 人人都是面试官

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[万字长文] 系统设计之路:如何设计一个URL短链服务相关的知识,希望对你有一定的参考价值。

301(永久跳转) 或 302(临时跳转)

6HashMurmurHash 计算后会生成一个整数。ID Key DBKGS -> KeyDB)。那么,这 服务器的本地内存中,数据结构可以是阻塞队列。标记为已使用。

也可以从 中一次多拿一些未使用的 个,放在 快用完的时候,再向 请求再拿 快用完的时候,再向 请求再 就丢失了,虽然这些 还没有真正被使用,但是 , , datetime ,((utf8 utf8_general_ci ,utf8 utf8_general_ci ,datetime ,datetime ,(Key每次向 请求没被使用的 ((((5T3 时刻,数据库中 2kssXw 对应的记录才真正被删掉,但这时缓存中却存在 2kssXw 对应的数据。这就造成了缓存和数据库的数据不一致。

所以,常用的方案是先删数据库记录,再删缓存。如果需要再保险一点,再启用延时双删,或者直接同步数据库的 binlog 来删缓存。

  • 服务限流

  • 为了防止一些异常的流量占用系统资源,让正常的请求能够得到服务器的 “雨露均沾”,让系统运行地更健壮,所以一个系统除了正常的功能,还需要加入一些限流策略。可以基于 nginx 来做限流,可以对某些 IP 实现限流,比如 1s 内同一个 IP 只能请求 5 次;也可以限制一段时间内的连接总数,比如 1s 内,只接受 1000 个IP 的连接;也可以实现基于黑白名单的限流。

    如果需要更细粒度的对具体服务和接口的限流策略,可以参靠 Guava 的 RateLimiter,再定制自己的策略,在网关层实现限流。感兴趣的同学可以去了解更多的细节。

    以上,Enjoy ~

    欢迎大家关注 "人人都是面试官", 一起积累和成长 ~

    短链系统设计-用户自定义短链

    5 用户自定义短链接

    实现一个顾客短网址,使得顾客能创立他们自己的短网址。即你需要在前文基础上再实现一个 createCustom

    需实现三个方法:

    注意:

    1. long2Short 生成的短网址的key的长度应该等于6 (不算域名和反斜杠)。 可以使用的字符只有 [a-zA-Z0-9]。如: abcD9E
    2. 任意两个长的url不会对应成同一个短url,反之亦然
    3. 如果 createCustom 不能完成用户期望的设定, 那么应该返回 "error", 反之如果成功将长网址与短网址对应,应该返回这个短网址

    5.1 基于 Base62

    在URLTable里,直接新增一列custom_url记录对应的custom url是否可行?

    不可行!对于大部分数据,该列其实都为空,就会浪费存储空间。

    新增一个表,存储自定义 URL:CustomURLTable。

    创建自定义短链接:在 CustomURLTable 中查询和插入

    根据长链接创建普通短链接:

    同前文一样,用两个哈希表处理长网址和短网址之间的相互映射关系。需额外处理的是用户设定的网址与已有冲突时,需返回 “error”。注意:若用户设定的和已有恰好相同,则同样应该返回短网址。

    public class TinyUrl2 
        private HashMap<String,String> s2l = new HashMap<String,String>();
        private HashMap<String,String> l2s = new HashMap<String,String>();
        private int cnt = 0;
        private final StringBuffer tinyUrl = new StringBuffer("http://tiny.url/");
        private final String charset = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM";
        
        private String newShortUrl() 
            StringBuffer res = new StringBuffer();
            for (int i = 0, j = cnt; i < 6; i++, j /= 62)
                res.append(charset.charAt(j % 62));
            cnt++;
            return tinyUrl + res.toString();
        
        
        /*
         * @param long_url: a long url
         * @param key: a short key
         * @return: a short url starts with http://tiny.url/
         */
        public String createCustom(String long_url, String key) 
            String short_url = tinyUrl + key;
            if (l2s.containsKey(long_url)) 
                if (l2s.get(long_url).equals(short_url))
                    return short_url;
                else
                    return "error";
            
            if (s2l.containsKey(short_url))
                return "error";
            l2s.put(long_url, short_url); 
            s2l.put(short_url, long_url);
            return short_url;
        
    
        /*
         * @param long_url: a long url
         * @return: a short url starts with http://tiny.url/
         */
        public String longToShort(String long_url) 
            if (l2s.containsKey(long_url))
                return l2s.get(long_url);
            String short_url = newShortUrl(); 
            l2s.put(long_url, short_url); 
            s2l.put(short_url, long_url);
            return short_url; 
        
    
        /*
         * @param short_url: a short url starts with http://tiny.url/
         * @return: a long url
         */
        public String shortToLong(String short_url) 
            if (s2l.containsKey(short_url))
                return s2l.get(short_url);
            return "error";
        
    
    

    5.2 基于随机生成算法

    无需做任何改动,直接把custom url当short url创建即可!

    参考

    以上是关于[万字长文] 系统设计之路:如何设计一个URL短链服务的主要内容,如果未能解决你的问题,请参考以下文章

    系统方案 - 设计一个 URL 短链服务

    短链系统设计-服务设计

    短链系统设计性能优化-分片策略优化

    万字长文毕业设计 C#开发基于BS的实验室预约管理系统 毕业论文论文+数据库+源程序

    万字长文深度剖析 RocketMQ 设计原理

    万字长文:云架构设计原则|附PDF下载

    (c)2006-2024 SYSTEM All Rights Reserved IT常识