redis分桶路由方案及代码(项目功能模拟)

项目背景:把黑白名单数据,通过hash分桶路由的方式存储在redis里面

项目为短信发送平台,以下是黑白名单相关介绍:

黑名单包括三类:
第一类,平台黑名单
此类是指的平台设置的黑名单手机号,设置了以后,就不能给这个手机号发送短信

第二类:账号黑名单
每个使用平台的用户都有一个账号,每个账号可以自己设置一些黑名单手机号

第三类:省份黑名单
此类指的是,可以设置某个省份,凡是判断出手机号码是某个省份的,就不发这个省份

第四类:账号白名单
每个使用短信平台的用户都有一个账号,每个账号可以自己设置一些白名单手机号,优先级高于所有黑名单,在这个账号的白名单中这个账号就可以给这个手机号发送短信

下面是示例代码:

import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;import java.util.Map;public class BlackWhiteListService {private static final int NUM_SHARDS = 4; // 分片数量private final RedisTemplate<String, String> redisTemplate;private final HashOperations<String, String, String> hashOperations;public BlackWhiteListService(RedisTemplate<String, String> redisTemplate) {this.redisTemplate = redisTemplate;this.hashOperations = redisTemplate.opsForHash();}// 计算手机号所在的分片private String getShard(String phoneNumber) {int hashCode = phoneNumber.hashCode();int shardIndex = Math.abs(hashCode % NUM_SHARDS); // 使用取模运算确定分片索引return "shard" + (shardIndex + 1); // 分片索引从1开始}// 存储黑名单信息public void addToBlacklist(String phoneNumber, String blacklistType, String reason) {String shard = getShard(phoneNumber);String key = shard + ":blacklist:" + blacklistType;hashOperations.put(key, phoneNumber, reason);}// 存储白名单信息public void addToWhitelist(String phoneNumber, String whitelistType, String allowed) {String shard = getShard(phoneNumber);String key = shard + ":whitelist:" + whitelistType;hashOperations.put(key, phoneNumber, allowed);}// 存储省份黑名单信息public void addToProvinceBlacklist(String province, String phoneNumber, String blacklistType, String reason) {String key = "province:" + province + ":blacklist:" + blacklistType;hashOperations.put(key, phoneNumber, reason);}// 获取黑名单信息public Map<String, String> getBlacklist(String phoneNumber, String blacklistType) {String shard = getShard(phoneNumber);String key = shard + ":blacklist:" + blacklistType;return hashOperations.entries(key);}// 获取白名单信息public Map<String, String> getWhitelist(String phoneNumber, String whitelistType) {String shard = getShard(phoneNumber);String key = shard + ":whitelist:" + whitelistType;return hashOperations.entries(key);}// 获取省份黑名单信息public Map<String, String> getProvinceBlacklist(String province, String blacklistType) {String key = "province:" + province + ":blacklist:" + blacklistType;return hashOperations.entries(key);}// 获取所有省份黑名单信息public Map<String, Map<String, String>> getAllProvinceBlacklist(String blacklistType) {Set<String> keys = redisTemplate.keys("province:*:blacklist:" + blacklistType);return hashOperations.multiGet(keys);}
}

接下来是调用方:

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;public class Main {public static void main(String[] args) {// 创建 RedisTemplate 实例RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());// 设置 Redis 连接配置(例如主机名、端口号、密码等)// 创建 BlackWhiteListService 实例BlackWhiteListService blackWhiteListService = new BlackWhiteListService(redisTemplate);// 添加黑名单String phoneNumber = "13812345678";String blacklistType = "platform"; // 黑名单类型为平台黑名单String reason = "This phone number is in the platform blacklist.";blackWhiteListService.addToBlacklist(phoneNumber, blacklistType, reason);// 添加白名单String whitelistType = "account"; // 白名单类型为账号白名单String allowed = "true";blackWhiteListService.addToWhitelist(phoneNumber, whitelistType, allowed);// 获取黑名单信息String retrievedReason = blackWhiteListService.getBlacklist(phoneNumber, blacklistType).get(phoneNumber);System.out.println("Blacklist Reason: " + retrievedReason);// 获取白名单信息String retrievedAllowed = blackWhiteListService.getWhitelist(phoneNumber, whitelistType).get(phoneNumber);System.out.println("Whitelist Allowed: " + retrievedAllowed);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony的C/C++三方库的适配

简介 本仓库主要用于存放已经适配OpenHarmony的C/C三方库的适配脚本和OpenHarmony三方库适配指导文档、三方库适配相关的工具。 三方库适配 本仓库的三方库主要是通过OpenHarmony SDK进行交叉编译适配的&#xff0c;并集成到应用端进行使用。 在使用OpenHarmony的SDK进行交…

智能合约:未来数字经济的基石

智能合约是一种自动执行交易的计算机协议&#xff0c;它以代码形式规定了交易双方的权利和义务&#xff0c;具有高度的可靠性和安全性。随着数字经济的发展&#xff0c;智能合约的重要性日益凸显&#xff0c;将成为未来数字经济的基石。 首先&#xff0c;智能合约在金融领域的应…

Java常见API

Java常见API Math 在Java中&#xff0c;Math是一个包含了许多数学函数和常量的类&#xff0c;它属于java.lang包&#xff0c;因此在使用时不需要显式地导入。Math类提供了许多静态方法来进行数学运算&#xff0c;比如三角函数、对数函数、指数函数等。 Math类的作用&#xf…

【目标检测数据集】城市街道垃圾堆相关数据集

一、GarbageOverflow&#xff1a;城市街道垃圾堆数据集 该垃圾堆数据集是通过爬虫从网上进行爬取得到的&#xff0c;一共包含1188张图片&#xff0c;有2个类别&#xff0c;分别为[overflow, No Overflow]&#xff0c;两个标签的数量分别为1734个标签和414个标签。部分数据集及…

23年坚守,只为打造高品质立秀膨体,索康让品质为中国说话

2024年3月23日&#xff0c;第二十三届上海国际整形美容外科大会&#xff08;以下简称“大会”&#xff09;在上海召开&#xff0c;本次大会由张涤生整形外科发展基金会主办&#xff0c;上海交通大学附属第九人民医院整复外科、Chinese Journal of Plastic and Reconstructive S…

阿里云2核2G服务器这么便宜,能用来做什么?

阿里云2核2G服务器这么便宜&#xff0c;能用来做什么&#xff1f;阿里云2核2G云服务器可以用来搭建网站、爬虫、邮件服务器、接口服务器、个人博客、企业官网、数据库应用、大数据计算、AI人工智能、论坛、电子商务、AI、LLM大语言模型、测试环境等&#xff0c;阿里云2核2G服务…

Uniapp+基于百度智能云完成AI视觉功能(附前端思路)

本博客使用uniapp百度智能云图像大模型中的AI视觉API&#xff08;本文以物体检测为例&#xff09;完成了一个简单的图像识别页面&#xff0c;调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…

Hi3861 OpenHarmony嵌入式应用入门--鸿蒙开发环境搭建

目录 简介 准备材料 安装开发环境 配置开发工具和sdk 新建工程 代码编译 简介 本篇将进行hi3861开发环境的搭建&#xff0c;并能够编译默认工程。 准备材料 华为集成开发环境工具DevEco Device Tool 华为集成开发环境IDE DevEco Device Tool下载 | HarmonyOS设备开发 …

SpringBoot自动配置原理(超级干货,直接面试使用,没有长篇大论)

SpringBoot的自动配置 遵循约定大于配置的原则&#xff0c;在boot程序启动后&#xff0c;起步依赖中的一下bean对象会自动注入到ioc容器 当面试官问你&#xff1a;说一说SpringBoot自动配置原理 你回答&#xff1a; 如此回答不到一分钟就过了&#xff0c;主打简单真实好用&am…

HarmonyOS开发学习:【DevEco Device Tool 安装配置(问题全解)】

本文介绍如何在Windows主机上安装DevEco Device Tool工具。 坑点总结&#xff1a; 国内部分网络环境下&#xff0c;安装npm包可能会很慢或者超时&#xff0c;推荐使用国内npm源&#xff08;如淘宝源、华为源等&#xff09;&#xff1b;serialport这个npm包安装的过程中需要编…

切比雪夫窗函数

Skip to content 产品解决方案学术支持社区活动 获取 MATLAB登录到您的 MathWorks 帐户 Help Center 搜索帮助中心 帮助中心 Off-Canvas Navigation Menu Toggle Documentation Home Signal Processing Signal Processing ToolboxSpectral AnalysisWindows chebwinO…

动态规划解决背包问题

目录 动态规划步骤&#xff1a; 1.01背包问题 2.完全背包问题 动态规划步骤&#xff1a; step1.分析问题&#xff0c;定义dp数组&#xff08;下标含义&#xff09; step2.初始化dp数组&#xff08;边界&#xff09; step3.写dp状态转换方程&#xff08;明确dp数组遍历顺序…

【Web】CTFSHOW-ThinkPHP5-6反序列化刷题记录(全)

目录 web611 web612 web613-622 web623 web624-626 纯记录exp&#xff0c;链子不作赘述 web611 具体分析&#xff1a; ThinkPHP-Vuln/ThinkPHP5/ThinkPHP5.1.X反序列化利用链.md at master Mochazz/ThinkPHP-Vuln GitHub 题目直接给了反序列化入口 exp: <?ph…

【刷题】图论——最小生成树:局域网

要想去除边&#xff0c;并且不改变连通性&#xff0c;而且去除的值最大&#xff0c;相当于保留最小生成树。 注意这题连通块有若干个&#xff0c;所以运行Kruskal相当于形成若干个最小生成树。 如果是prim只能事先处理好各个连通块&#xff0c;然后在连通块内部单独用prim 题目…

算法稳定币是未来趋势?

加密货币市场最近如火如荼的行情&#xff0c;稳定币作为不可或缺的一环可谓表现突出&#xff0c;目前总市值已超过 210 亿美元。新晋算法稳定币自带天然吸睛的博弈、投机、套利等行为&#xff0c;铺就了一个个极具吸引力的财富故事&#xff0c;进一步把加密世界的货币试验推到新…

动态规划(Dynamic Programming)详解

引言&#xff1a; 动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;是计算机科学与数学领域中的一个经典算法设计策略&#xff0c;用于解决具有重叠子问题和最优子结构特性的复杂问题。它通过将问题分解为更小的子问题来避免重复计算&#xff0c;从而提…

【vue】watch 侦听器

watch&#xff1a;可监听值的变化&#xff0c;旧值和新值 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

HarmonyOS开发实例:【自定义Emitter】

介绍 本示例使用[Emitter]实现事件的订阅和发布&#xff0c;使用[自定义弹窗]设置广告信息。 效果预览 使用说明 进入首页后弹出广告弹窗&#xff0c;点击即可关闭。点击商品列表中的一个商品可以跳转到商品详情页。在商品详情页点击首页可以返回到商品列表页&#xff0c;点…

结构型模式--2.桥接模式【大海贼时代】

1. 组建海贼团 哥尔D罗杰是罗杰海贼团船长。他最终征服了伟大航路&#xff0c;完成了伟大航路的航行&#xff0c;被人们成为海贼王。后来得了绝症&#xff0c;得知自己命不久矣&#xff0c;主动自首并在东海罗格镇被处刑。临死前罗杰的一句话“想要我的宝藏吗&#xff1f;想要…

std命名空间是C++标准库的命名空间

已经导入#include <string>&#xff0c;为何还要用 std::string&#xff1f;&#xff1f; 导入<string>头文件只是告诉编译器你要使用标准库中与字符串相关的功能&#xff0c;比如std::string类。然而&#xff0c;C中的标准库使用了命名空间&#xff08;namespace…