Linux基于Redis实现短地址服务

Linux基于Redis实现短地址服务Linux 基于 Redis 实现短地址服务 URL 压缩 把原始长地址压缩成短地址 便于文本长度限制的场景使用 短信 社交网络 网络营销 短地址

大家好,欢迎来到IT知识分享网。

URL 压缩,把原始长地址压缩成短地址,便于文本长度限制的场景使用(短信、社交网络、网络营销)

2.2.长链接转成短链接策略方法

摘要算法算法过程:

        同时对于链接高频访问性能问题:对于可能被高频访问短链接,通过增加缓存来提高自增号对应长链接的查找速度。查询走缓存大大降低数据库的压力。

        Redis的内存数据存储特性确保了即使是在高并发访问的情况下,短链接的查找速度也能保持快速和稳定。通过将短链接映射到长链接的键值对存储,Redis能够实现极速的响应时间。

缓存 kv 形式:

        自增号 -> 长链接 或 短码 -> 长链接。Redis 缓存并采用LRU 算法淘汰经常不访问的长链接或短码。并通过2级别缓存,提高缓存的高可用,本次短地址服务就使用Redis实现。

        解决方案:短码超用的问题,首先是自增号 long 最大值 L == 2 63次方 -1,假设我们短码用 6 位表示:就会产生约 62 的 6 次方约等于 568 亿,这么大的数量量基本不会用超。就算6位用完可以用7 位 、8位。

具体实现,附代码

—————

1. 生成短地址,同时记录有效期、访问次数、创建时间、访问渠道(ip)、阅后即焚

2. 解析短地址

3. 数据显示

    – 删除短地址

    – 开通会员~增长有效期

4. 统计信息

5. 退出程序

#include <stdio.h> #include <hiredis/hiredis.h> #include <time.h> void show(); void createTinyURL(); redisContext *connectRedis(); void analyzeTinyURL(); void dataDisplay(); void statisticalInformation(); void deleteTinyURL(); void riseURLTime(); void operationTinyURL(); int main(int argc, char const *argv[]) { while (1) { show(); printf("请选择操作:"); int action; scanf("%d", &action); switch (action) { case 1: createTinyURL(); break; case 2: analyzeTinyURL(); break; case 3: operationTinyURL(); break; case 4: statisticalInformation(); break; case 5: return 0; default: printf("请选择正确操作数(1-5)\n"); break; } } return 0; } // 面板展示 void show() { printf("=================短地址服务===================\n"); printf("1. 生成短地址\n"); printf("2. 解析短地址\n"); printf("3. 数据显示\n"); printf("4. 统计信息\n"); printf("5. 退出程序\n"); printf("=============================================\n"); } // 生成短地址:唯一ID、有效期、次数,并与长地址存入数据库 void createTinyURL() { printf("-----------------生成短地址--------------------\n"); printf("请输入需要缩短的长地址:\n"); char url[64]; scanf("%s", url); char tiny_url[32] = {'0', '0', '0', '0', '0'}; int i = 4; redisContext *conn = connectRedis(); redisReply *reply = redisCommand(conn, "incr url_id"); freeReplyObject(reply); reply = redisCommand(conn, "get url_id"); int id = atoi(reply->str); freeReplyObject(reply); char c; while (id) { int tem = id % 62; if (tem > 35) { tem -= 36; c = tem + 'A'; } else if (tem > 9) { tem -= 10; c = tem + 'a'; } else { c = tem + '0'; } tiny_url[i] = c; i--; id /= 62; } printf("生成的短地址为:ak.cn/%s\n", tiny_url); // 获取当前时间,并转为字符串 time_t now = time(NULL); char time_str[20]; strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M", localtime(&now)); // 存入短地址、长地址、创建时间、有效期、访问次数 reply = redisCommand(conn, "hset ak.cn/%s url %s create_time %s days 7 num 0", tiny_url, url, time_str); freeReplyObject(reply); redisFree(conn); } // 创建数据库连接 redisContext *connectRedis() { redisContext *conn = redisConnect("127.0.0.1", 6379); if (conn->err) { printf("connection error\n"); redisFree(conn); return 0; } return conn; } // 解析短地址 void analyzeTinyURL() { printf("-----------------解析短地址--------------------\n"); printf("请输入需要解析的短地址:"); char tiny_url[64]; scanf("%s", tiny_url); redisContext *conn = connectRedis(); redisReply *reply = redisCommand(conn, "hget %s url", tiny_url); printf("解析短地址成功,原地址为:%s\n", reply->str); freeReplyObject(reply); // 每次查询访问,访问次数加1 redisCommand(conn, "hincrby %s num 1", tiny_url); redisFree(conn); } // 短地址、长地址、有效期,数据显示 void dataDisplay() { printf("-----------------数据显示--------------------\n"); printf("短地址\t\t原地址\t\t\t创建时间\t\t有效期\n"); redisContext *conn = connectRedis(); redisReply *reply = redisCommand(conn, "keys *"); redisReply *reply_row; for (int i = 0; i < reply->elements; i++) { if (reply->element[i]->len > 6) { reply_row = redisCommand(conn, "hvals %s", reply->element[i]->str); printf("%s\t", reply->element[i]->str); // 短地址名 printf("%s\t", reply_row->element[0]->str); // 原地址名 printf("%s\t", reply_row->element[1]->str); // 创建时间 printf("%5s\t\n", reply_row->element[2]->str); // 有效期 } } freeReplyObject(reply); redisFree(conn); } // 对显示数据进行操作,删除短地址、增长有效期 void operationTinyURL() { int flag = 0; dataDisplay(); while (1) { if (flag == 1) { dataDisplay(); } printf("可选择操作:\n"); printf("\t1. 删除短地址\n"); printf("\t2. 开通会员~增长有效期\n"); printf("\t3. 返回\n"); printf("请选择操作:"); int action; scanf("%d", &action); switch (action) { case 1: deleteTinyURL(); break; case 2: riseURLTime(); break; case 3: return; default: printf("请选择正确操作数(1-3)\n"); break; } flag = 1; } } // 统计数据信息,短地址、被访问次数 void statisticalInformation() { printf("-----------------统计信息--------------------\n"); printf("短地址\t\t访问次数\n"); redisContext *conn = connectRedis(); redisReply *reply = redisCommand(conn, "keys *"); redisReply *reply_row; for (int i = 0; i < reply->elements; i++) { if (reply->element[i]->len > 6) { reply_row = redisCommand(conn, "hvals %s", reply->element[i]->str); printf("%s\t", reply->element[i]->str); // 短地址名 printf("%5s\t\n", reply_row->element[3]->str); // 访问次数 } } freeReplyObject(reply); redisFree(conn); } // 删除短地址 void deleteTinyURL() { printf("请输入需要删除的短地址:\n"); char tiny_url[64]; scanf("%s", tiny_url); redisContext *conn = connectRedis(); redisReply *reply = redisCommand(conn, "del %s", tiny_url); printf("删除成功~\n"); freeReplyObject(reply); redisFree(conn); } // 增长短地址有效期 void riseURLTime() { printf("请输入需要增长有效期的短地址:"); char tiny_url[64]; scanf("%s", tiny_url); int days; printf("请输入需要增长天数:"); scanf("%d", &days); redisContext *conn = connectRedis(); redisReply *reply = redisCommand(conn, "hincrby %s days %d", tiny_url, days); freeReplyObject(reply); redisFree(conn); }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/130719.html

(0)
上一篇 2025-08-13 15:26
下一篇 2025-08-13 15:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信