首页 / 短链 / 阿里架构师分享:Redis短链接生成

专业的短链接生成工具

链接域名

短网址有效期

阿里架构师分享:Redis短链接生成

更新时间:2025-5-2 22:26:41 作者:爱短链

短链接生成,浏览器获取原长地址的响应响应


实施

短地址服务的核心是短地址和长地址的转换映射算法。


最简单的算法是将原始长地址记录为MD5摘要作为key,长地址作为value。将key值放入redis等服务器缓存中。


逆向解析时通过URL解决key,比如上面的短地址key = 15uOVS。然后使用key从缓存中获取原始长地址值短链接生成,实现URL地址恢复。


MD5 摘要有几个明显的问题:

1、短地址的长度是有限的。例如行业见闻:阿里架构师分享:Redis短链接生成实战,网友:这个操作还可以吗?,MD5 后的数据长度为 32 位。为了使短地址足够短短链接生成,需要进行分段和循环处理


2、MD5的hash冲突问题有一定的重复概率。要解决这个问题,需要不断提高算法的复杂度,而且有些得不偿失


当然不止MD5的实现算法,你可以自己google一下。


代码实现

1:短连接工具类

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
/**
 * 短网址的实现,不管多长,都生成四位链接
 *
 * @author CHX
 */
 
public class ShortURL {
 
    private static String[] chars = new String[]{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
            "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8",
            "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
            "U", "V", "W", "X", "Y", "Z"};
 
 
    /**
     * 首先从URL中获取固定格式后的内容     *
     * @param longUrl 原url
     * @param yuMing  域名
     */
    public static String myTestShort(String longUrl, String yuMing) {
        String newurl = "";
        String regex = "(http://|https://)" + yuMing + "(.*)";
        Pattern r = Pattern.compile(regex);
        // 现在创建 matcher 对象
        Matcher m = r.matcher(longUrl);
        if (m.find()) {
            String url = m.group(2);
            if (url != null) {
                // 此处就是生成的四位短连接
                newurl = changes(url);
                //System.out.println(m.group(1) + yuMing + "/" + changes(url));
            }
        }
        return newurl;
    }
    /**
     * 编码思路:考虑到base64编码后,url中只有[0-9][a-z][A-Z]这几种字符,所有字符共有26+26+10=62种 对应的映射表为62进制即可
     *
     * @param value
     * @return
     */
    public static String changes(String value) {
        // 获取base64编码
        String stringBase64 = stringBase64(value);
        // 去除最后的==(这是base64的特征,最后以==结尾)
        stringBase64 = stringBase64.substring(0, stringBase64.length() - 2);
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        // 利用md5生成32位固长字符串
        String mid = new String(bytesToHexString(md5.digest(stringBase64.getBytes())));
        StringBuilder outChars = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            //每八个一组
            String sTempSubString = mid.substring(i * 8, i * 8 + 8);
            // 想办法将此16进制的八个字符数缩减到62以内,所以取余,然后置换为对应的字母数字
            outChars.append(chars[(int) (Long.parseLong(sTempSubString, 16) % chars.length)]);
        }
        return outChars.toString();
    }
    /**
     * 将字符串转换为base64编码     *
     * @param text 原文
     * @return
     */
    public static String stringBase64(String text) {
        return Base64.getEncoder().encodeToString(text.getBytes());
    }
    /**
     * 将byte转换为16进制的字符串     *
     * @param src
     * @return
     */
    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }
 
}

2:redis配置

java依赖

org.springframework.bootspring-boot-starter-data-redis

配置文件

##端口号
# Redis数据库索引(默认为0)
spring.redis.database=0 
# Redis服务器地址
spring.redis.host=192.168.124.20
# Redis服务器连接端口
spring.redis.port=6379 
# Redis服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-idle=8 
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=
# 连接池中的最大空闲连接
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0 
# 连接超时时间(毫秒)
spring.redis.timeout=300
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
 
 
/*** redis配置类
 * @program: springbootdemo
 * @Date: 2019/2/22 15:20
 * @Author: zjjlive
 * @Description:
 */
@Configuration
@EnableCaching //开启注解
public class RedisConfig extends CachingConfigurerSupport {
 
    /**
     * retemplate相关配置
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplateredisTemplate(RedisConnectionFactory factory) {
 
        RedisTemplatetemplate = new RedisTemplate<>();
        // 配置连接工厂
        template.setConnectionFactory(factory);
 
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
 
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(om);
 
        // 值采用json序列化
        template.setValueSerializer(jacksonSeial);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
 
        // 设置hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jacksonSeial);
        template.afterPropertiesSet();
 
        return template;
    }
 
    /**
     * 对hash类型的数据操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public HashOperationshashOperations(RedisTemplateredisTemplate) {
        return redisTemplate.opsForHash();
    }
 
    /**
     * 对redis字符串类型数据操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public ValueOperationsvalueOperations(RedisTemplateredisTemplate) {
        return redisTemplate.opsForValue();
    }
 
    /**
     * 对链表类型的数据操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public ListOperationslistOperations(RedisTemplateredisTemplate) {
        return redisTemplate.opsForList();
    }
 
    /**
     * 对无序集合类型的数据操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public SetOperationssetOperations(RedisTemplateredisTemplate) {
        return redisTemplate.opsForSet();
    }
 
    /**
     * 对有序集合类型的数据操作
     *
     * @param redisTemplate
     * @return
     */
    @Bean
    public ZSetOperationszSetOperations(RedisTemplateredisTemplate) {
        return redisTemplate.opsForZSet();
    }
 
}

3:短连接使用

import com.eltyl.api.util.RedisUtil;
import com.eltyl.api.util.ShortURL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/redis/")
public class EndLinkContronller {
    @Autowired
    private RedisUtil redisUtil;
    @RequestMapping("save")
    public String save(){
        String plainUrl = "http://www.*.com/index.php?s=/Index/index/id/1.html";
        String endlink = ShortURL.myTestShort(plainUrl,"www.*.com");
        System.out.println(endlink);
        redisUtil.set(endlink,plainUrl);
        return "success";
    }

最后再建一个项目拦截一下,看看有没有来自redis的相对链接


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
@RestController
public class IndexContronller {
    @Autowired
    private RedisUtil redisUtil;
    @RequestMapping("/**")
    public void save(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("用户想执行的操作是:"+request.getServletPath());
        String newurl = request.getServletPath().replace("/","");
        if(redisUtil.get(newurl)!=null){
 
            System.out.println("存在");
            //return "redirect:http://www.*.com";
            response.sendRedirect("http://www.*.com");
        }else{
            System.out.println("不存在");
            //return "redirect:http://new.*.com";
            response.sendRedirect("http://news.*.com");
        }
        //return "success";
    }
}

以上就是关于《阿里架构师分享:Redis短链接生成》的全部内容了,感兴趣的话可以点击右侧直接使用哦!》》在线短链接生成

爱短链平台各工具使用方法及功能汇总

短链接

活码系统

微信外链

抖音卡片

相关搜索

创建短链接

注册与登录 首先,访问爱短链的官方网站,点击右上角的“注册”按钮,填写相关信息完成注册。注册成功后,使用账号和密码登录到平台后台。登录过程简单快捷,支持微信扫码和手机验证码等多种方式。 获取长链接 在准备创建短链接之前,你需要先获取想要缩短的长链接。例如,在微信公众号后台,打开需要生成短链接的文章,将该文章的长链接复制到剪贴板中。 生成短链接 登录爱短链平台后,你会看到后台界面提供了多种功能选项。点击“短链”功能,将刚刚复制的长链接粘贴到指定的输入框中。爱短链还允许用户绑定自己的域名,使短链接更具个性化和辨识度。设置完成后,点击“生成短链接”按钮,平台会立即为你生成对应的短链接。 使用短链接 短链接生成后,你可以将其复制并粘贴到公众号推文中需要添加链接的位置,如正文内容、阅读原文链接、公众号菜单栏等。在正文中插入短链接时,可以搭配一些吸引人的引导语,如“点击下方链接查看更多精彩内容”或“详情请戳[短链接]”等,以提高用户的点击率。

爱短链

2025-02-20 14:33:23

抖音链接跳转微信

抖音链接跳转微信不仅为品牌营销和个人推广提供了更多可能性,也为用户带来了更加便捷、高效的信息获取和互动体验。在未来,随着社交电商的蓬勃发展和用户需求的不断变化,抖音链接跳转微信将成为越来越多用户的首选引流方式,助力品牌营销和个人推广迈向新的高度。

爱短链

2025-01-15 16:13:31

活码二维码生成器在线

活码二维码生成器在线工具如爱短链等,操作简单,无需复杂的技术知识。用户只需在网页上打开相应的生成器平台,按照提示进行操作即可。通常,用户需要输入想要关联的信息,如网址、文本、图片、文件等,然后选择一些个性化设置,即可快速生成一个活码二维码。

爱短链

2025-01-15 16:13:31

生成短链接的工具

长链接的繁琐与不便愈发凸显,而一款优秀的短链接生成工具则成为了信息高效传播的关键。爱短链,正是这样一款脱颖而出的卓越工具,为你带来前所未有的链接管理体验。

爱短链

2025-01-15 16:13:31

跳转卡片在线生成

爱短链平台提供高效的跳转卡片在线生成功能,用户可轻松定制卡片模板,填入链接与信息,即刻生成吸引眼球的跳转卡片,适用于社交媒体、营销活动等场景,助力提升点击率与营销效果,实现精准引流。

爱短链

2025-01-15 16:13:31

最通俗易懂的短链接原理讲解

看了看,想要了解短链接算法的伙伴还是蛮多的,那么今天爱短链小编就帮大家带来详细的介绍。

爱短链

2022-05-30 15:20:34

微信活码的功能特点介绍

微信活码是营销推广行业必备的一个神器,它不但可以帮助我们更好的裂变,还能降低用户流失率。

爱短链

2022-05-19 12:37:01

营销推广必备的5个效率小工具

营销推广不仅要靠扎实的专业知识,在工具使用方面也是非常重要,没有好的工具就算自己有多么厉害的技能也会事倍功半。

爱短链

2022-05-18 14:08:22

用户喜欢

缩短链接:链接在线一键秒缩短

缩短链接是一种将长网址转换为短网址的服务,通常用于社交媒体、短信、电子邮件等场合,以便更简洁地分享链接。以下是一些在线一键缩短链接的方法和工具:

爱短链

2025-02-19 10:16:16

网址简化:1秒简化网址

网址简化,也称为URL缩短,是指将冗长的网址转换为简短、易记的链接。以下是几种快速简化网址的方法:

爱短链

2025-02-19 10:16:16

网站链接太长怎么缩短

当遇到网站链接太长需要缩短的情况时,可以采取以下几种方法:

爱短链

2025-02-18 16:04:47

h5页面跳转微信小程序

H5页面跳转微信小程序的需求普遍存在,因为微信小程序只能在微信内部访问,而H5页面可以在任何浏览器中访问,因此需要通过跳转来实现两者之间的衔接。以下是H5页面跳转微信小程序的主要方式:

爱短链

2025-02-18 16:04:46

链接缩短,教程分享,一招把链接缩短

链接缩短是一个方便用户分享和访问长链接的有效方法。以下是一招把链接缩短的详细教程:

爱短链

2025-02-18 14:15:53

微信卡片链接生成

微信卡片链接是指在微信中分享的一个特定格式的链接,通过该链接可以展示网页或内容的相关信息,并以卡片的形式呈现给接收者。以下是生成微信卡片链接的详细步骤:

爱短链

2025-02-18 09:57:08

微信活码免费在线制作

微信活码是一种可以智能切换的二维码,通常用于解决微信群扫码人数限制、微信号无限加好友、多渠道引流等问题。以下是一些免费在线制作微信活码的方法和步骤:

爱短链

2025-02-18 09:57:08

微信群活码,免费生成,永久生效

微信群二维码本身具有7天的有效期,微信官方并未提供直接生成永久有效微信群二维码的功能。但可以通过一些第三方工具实现类似永久有效的效果,以下是几种免费生成微信群活码并尽量保持其长期有效的方法:

爱短链

2025-02-18 09:57:08

全平台跨域跳转微信工具,助力企业全渠道获客

爱发布客服-依依

公网安备32010402001342号

苏ICP备2021048188号-3

© 爱短链 2019 | 南京推吧网络科技有限公司版权所有

客服