网址链接过长给用户不好的体验,缩短链接长度方便社交化传播,还能跟踪点击量和统计。

算法解析

生成a~z A~z 0~9的字符,后面有用

public static void main(String[] args) {System.out.print("{ ");for (int i = 1; i <= 26; i++) {System.out.print("\"" + (char) (64 + i) + "\"" + ",");}for (int i = 1; i <= 26; i++) {System.out.print("\"" + (char) (96 + i) + "\"" + ",");}for (int i = 1; i <= 10; i++) {if (i == 10) {System.out.print("\"" + (char) (47 + i) + "\"");} else {System.out.print("\"" + (char) (47 + i) + "\"" + ",");}}System.out.print(" }");
}

结果:

{"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","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" }

直接上代码,代码中有注释,下面总结:

public static final 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", "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"};/*** 长链接转换为4个短KEY** @param url* @return*/
public static String[] shortUrl(String url) {String key = "";// 对地址进行md5加密String sMD5EncryptResult = DigestUtils.md5DigestAsHex((key + url).getBytes());String hex = sMD5EncryptResult;String[] resUrl = new String[4];for (int i = 0; i < 4; i++) {// 取出8位字符串,md5 32位,被切割为4组,每组8位字符String sTempSubString = hex.substring(i * 8, i * 8 + 8);// Long.parseLong(sTempSubString, 16) 将其转换成16进制,详情见说明1尝试理解// 先转换成16进制,然后用 0x3FFFFFF 进行位与运算,目的是格式化截取前30位long lHexLong = 0x3FFFFFF & Long.parseLong(sTempSubString, 16);String outChars = "";for (int j = 0; j < 6; j++) {// 0x0000003D的10进制是61,61代表chars数组长度62的0~61的坐标// 0x0000003D & lHexLong 进行位与运算,就是格式化为6位,即61内的数字// 保障了index绝对是61以内的值long index = 0x0000003D & lHexLong;outChars += chars[(int) index];// 每次循环按位移5位,因为30位的二进制分6次循环,即每次右移5位lHexLong = lHexLong >> 5;}resUrl[i] = outChars;}return resUrl;
}@Test
public void test06() {// 输出短网址System.out.println(Arrays.toString(shortUrl("https://www.xk857.com")));
}

说明1:

/*** 2进制:111111111111111111111111111111* 2进制:1010110011010101011100100001111* 格式化后:10110011010101011100100001111* 0x0000003D:2进制:111101* 0x0000003D∶10进制:61*/
@Test
public void test07() {String str = "566ab90f";System.out.println("2进制:" + Long.toBinaryString(0x3FFFFFFF));System.out.println("2进制:" + Long.toBinaryString(0x566ab90f));System.out.println("格式化后:" + Long.toBinaryString(0x3fffffff & 0x566ab90f));System.out.println("0x0000003D:2进制:" + Long.toBinaryString(0x0000003D));System.out.println("0x0000003D∶10进制:" + Long.parseLong("0000003D", 16));
}

解析:将长网址md5生成32位签名串,分为4段,每段8个字节对这四段循环处理,取8个字节,将他看成16进制串与0x3fffffff(30位1)与操作,即超过30位的忽略处理这30位分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串。总的 md5串可以获得4个6位串,取里面的任意一个就可作为这个长url 的短 url 地址

实战-短链接接口开发

《短链接转换器》的原理:

1.长链接转换为短链接
实现原理:长链接转换为短链接加密串key,然后存储于redis的hash结构中。

2.重定向到原始的url
实现原理:通过加密串key到redis找出原始url,然后重定向出去

工具类:ShortUrlUtils

package com.xk857.util;import org.springframework.util.DigestUtils;/*** @author cv大魔王* @version 1.0* @date 2021/5/23 11:35*/
public class ShortUrlUtils {public static final 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", "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"};/*** 长链接转换为4个短KEY** @param url* @return*/public static String[] shortUrl(String url) {String key = "";// 对地址进行md5加密String sMD5EncryptResult = DigestUtils.md5DigestAsHex((key + url).getBytes());String hex = sMD5EncryptResult;String[] resUrl = new String[4];for (int i = 0; i < 4; i++) {// 取出8位字符串,md5 32位,被切割为4组,每组8位字符String sTempSubString = hex.substring(i * 8, i * 8 + 8);// Long.parseLong(sTempSubString, 16) 将其转换成16进制,详情见说明1尝试理解// 先转换成16进制,然后用 0x3FFFFFF 进行位与运算,目的是格式化截取前30位long lHexLong = 0x3FFFFFF & Long.parseLong(sTempSubString, 16);String outChars = "";for (int j = 0; j < 6; j++) {// 0x0000003D的10进制是61,61代表chars数组长度62的0~61的坐标// 0x0000003D & lHexLong 进行位与运算,就是格式化为6位,即61内的数字// 保障了index绝对是61以内的值long index = 0x0000003D & lHexLong;outChars += chars[(int) index];// 每次循环按位移5位,因为30位的二进制分6次循环,即每次右移5位lHexLong = lHexLong >> 5;}resUrl[i] = outChars;}return resUrl;}}

接口开发:

@RestController
@RequestMapping("/api/short")
public class ShortUrlController {@Autowiredprivate RedisTemplate redisTemplate;private final static  String SHORT_KEY ="short:url";@GetMapping("/encode")public String encode(String url){String[] keys = ShortUrlUtils.shortUrl(url);String key = keys[0];redisTemplate.opsForHash().put(SHORT_KEY,key,url);return "http://localhost:8080/api/short/"+ key;}/*** 重定向到原始的* @param key*/@GetMapping(value = "/{key}")public void decode(@PathVariable String key,HttpServletResponse response) {String url = (String)redisTemplate.opsForHash().get(SHORT_KEY,key);System.out.println(url);try {response.sendRedirect(url);}catch (IOException e) {e.printStackTrace();}}
}

Redis数据结构Hash实战之淘宝短链接相关推荐

  1. tinyurl淘宝短链接业务

    ##淘宝短链接如何设计? 体验淘宝短链接业务场景 场景1:淘宝短信 你们应该收到淘宝的短信 [天猫]有优惠啦!黄皮金煌芒果(水仙芒)带箱10斤49.8元! 核薄无丝很甜喔!购买: c.tb.cn/c. ...

  2. Redis数据结构Hash应用场景-存储商品、购物车、淘宝短链接、分布式Session、用户注册、发微博功能

    Hash应用场景 Hash Hash应用场景 redis存储java对象常用String,那为什么还要用hash来存储? SpringBoot+redis+hash存储商品数据 短链接 场景1:淘宝短 ...

  3. php根据淘宝短链接获取商品ID

    很多人在做淘宝客API开发时,不知道怎么根据短链接获取商品ID,其实很简单,废话不多说,直接开干 //根据复制出来的宝贝短链接,提取商品ID $cp_url = 你要解析的URL; $tao302 = ...

  4. Python项目实战 —— 04. 淘宝用户行为分析

    Python项目实战 Python项目实战--目录 Python项目实战 -- 04. 淘宝用户行为分析 一.背景 二.解题思路 三.数据分析 3.1 数据清洗 3.2 数据分析 3.2.1 用户整体 ...

  5. 淘宝短视频,为什么搬运的短视频没有流量?从算法角度分析

    做淘系电商的商家都知道,之所以切入"短视频"这个赛道,一方面是因为"内容赛道"是阿里当下的战略主战场:另一方面,淘系的流量实在越来越少,实在没有更好的获取流量的 ...

  6. Python实战:淘宝自动抢购

    Python实战:淘宝自动抢购 淘宝的限时抢购活动让许多消费者都感到头痛,往往在短时间内就被抢空了.有没有想过用Python写一个抢购程序呢?今天我们就来一起学习如何使用Python实现淘宝自动抢购. ...

  7. 怎么入驻印象淘宝短视频 申请通过印象淘宝条件要求

    印象淘宝是对淘宝的所有短视频的一个筛选,然后再进行审核,审核通过后进入印象淘宝的推荐池,进行淘内多渠道的分发. 怎么入驻印象淘宝 需要先申请一个达人账号:在短视频频道进行申请(需要准备3条以上的短视频 ...

  8. 淘宝短视频批量自动发布,无需人工RPA开源

    淘宝目前很大的困扰来自人口的增长红利已经见顶,而用户的停留时间受拼多多.抖音.快手.小红书等平台的严重挤压."用户不爱/没有兴趣逛淘宝", 如何提升用户的停留时长成为阿里的当务之急 ...

  9. 淘宝短视频全面升级-光合平台

    很多商家最近咨询我,淘宝短视频无法在阿里创作者平台进行发布了.如图: 其实,主要是阿里最近刚刚做了升级:淘宝短视频发布全面升级为[光合平台--"猜你喜欢"发布渠道]. 两者有什么区 ...

最新文章

  1. 已知机器人阿木木_LOL殇之机器人 阿木木皮肤
  2. sublime Text3快捷键使用大全
  3. 2019年中国十大人才发展趋势
  4. linux eclipse java_实验一 Java开发环境的熟悉(Linux + Eclipse)
  5. 初学__Python——Python 变量的作用域
  6. sqlserver存储过程的参数传递注意事项
  7. 适用于Linux的Windows子系统WSL
  8. repeating 路由_CSS中带有示例的repeating-linear-gradient()函数
  9. Java 时间处理(格式解释、格式化时间、获取当前时间、获取年份、月份等、时间戳转换成时间)
  10. Excel VBA利用事件对图表自动更新
  11. 在沈阳存款多少可以不用工作?
  12. python读取数据流_IOError:读取图像fi时数据流中断
  13. php用户名框架,ThinkPHP框架结合Ajax实现用户名校验功能示例
  14. mysql8自定义安装位置_docker 自定义安装 mysql8
  15. Android权限之sharedUserId和签名
  16. IAR8.3.2破解说明
  17. 语法分析分析器的实现
  18. jquery获取选中和未选中的checkbox复选框
  19. POJ1436Horizontally Visible Segments线段树+lazy
  20. Microsoft SQL Server Native Client(sqlncli.msi)的安装程序包

热门文章

  1. WORD2010加载mathtype6.6
  2. Python数据分析——Matplotlib数据可视化基础(二)
  3. 数据分析系列4—pandas使用
  4. 用友云强化人工智能AI技术,赋能中国企业
  5. 《我们一无所有》读后感2
  6. 用自己的域名创建邮箱( 苹果用户订阅 icloud + 服务)
  7. django数据库操作和中间件
  8. PMP超强备考攻略,考生必看
  9. android OTA 简介
  10. Luogu2343 宝石管理系统(平衡树)