【分布式基础】一致性哈希

浅谈Loki分布式架构中的一致性哈希 Loki在分布式部署的模式下,保存Ingester服务的状态主要有3个渠道,分别是etcd、consul和基于gossip协议的memberlist。不管Loki用的是什么方式,它们最终都是将哈希环以KV的方式保存。再聊Loki之前,先来了解下一致性哈希的基本概念。 一致性哈希是在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法。相较于普通的哈希算法,一致性哈希除了继承数据的离散性、扩展性和容错性之外,还引入了虚拟节点的概念,极大的优化了数据在存储过程的中出现的倾斜问题。另外,遇到需要在不中. 阅读详情

分布式过程中我们将服务分散到若干的节点上,以此通过集体的力量提升服务的目的。然而,对于一个客户端来说,该由哪个节点服务呢?或者说对某个节点来说他分配到哪些任务呢?

1. 强哈希

考虑到单服务器不能承载,因此使用了分布式架构,最初的算法为 hash() mod n, hash()通常取用户ID,n为节点数。此方法容易实现且能够满足运营要求。缺点是当单点发生故障时,系统无法自动恢复。同样不也不能进行动态增加节点。

2. 弱哈希

为了解决单点故障,使用 hash() mod (n/m), 这样任意一个用户都有m个服务器备选,可由client随机选取。由于不同服务器之间的用户需要彼此交互,所以所有的服务器需要确切的知道用户所在的位置。因此用户位置被保存到memcached中。当一台发生故障,client可以自动切换到对应backup,由于切换前另外1台没有用户的session,因此需要client自行重新登录。

他比强哈希的好处是:解决了单点问题。

但存在以下问题:负载不均衡,尤其是单台发生故障后剩下一台会压力过大;不能动态增删节点;节点发生故障时需要client重新登录

3. 一致性哈希

一致性哈希也只是提出四个概念和原则,并没有提及具体实现:
1
、 balance :哈希结果尽可能的平均分散到各个节点上,使得每个节点都能得到充分利用。
2
、 Monotonicity :上面也说了,如果是用签名取模算法,节点变更会使得整个网络的映射关系更改。如果是 carp ,会使得 1/n 的映射关系更改。一致性哈希的目标,是节点变更,不会改变网络的映射关系。
3
、 spread :同一份数据,存储到不同的节点上,换言之就是系统冗余。一致性哈希致力于降低系统冗度。
4
、 load :负载分散,和 balance 其实是差不多的意思,不过这里更多是指数据存储的均衡, balance 是指访的均衡。

一致性哈希算法在1997年由麻省理工学院提出,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。

我们把每台server分成v个虚拟节点,再把所有虚拟节点(n*v)随机分配到一致性哈希的圆环上,这样所有的用户从自己圆环上的位置顺时针往下取到第一个vnode就是自己所属节点。当此节点存在故障时,再顺时针取下一个作为替代节点。



引用:

http://baike.baidu.com/view/1588037.htm



Python实现分布式核心算法:一致性哈希、选主与分布式锁实战 分布式系统从单机走向多机后,数据分片、并发控制与故障转移成为基础问题。一致性哈希通过哈希环将节点和key映射到同一空间,并借助虚拟节点改善均衡性,使扩缩容只影响相邻数据段;选主心跳用于维护节点状态并触发故障转移,分布式锁协调并发访问,幂等与限流则保障重试安全和流量稳定。这些机制能降低扩容时缓存击穿、主节点故障、重复请求和流量突增带来的风险,常用于缓存分片、服务协调、任务调度与API网关限流等场景。这套Python可运行模块按算法拆解参数入口和失败路径,便于开发者复现、调参和压测。 阅读详情

相关推荐

基于Simulink的前馈解耦SVPWM整流器仿真

本文提出了一种基于Simulink的前馈解耦SVPWM整流器仿真方案,针对传统双闭环控制存在的耦合严重、电压利用率低等问题进行优化。通过前馈补偿dq轴耦合项(ωLiq和ωLid)结合SVPWM调制算法,实现了电流跟踪误差<3%、电压利用率达0.99、THD<3%的性能指标。文章详细阐述了系统架构设计,包括前馈解耦原理推导、SVPWM算法实现步骤,并提供了完整的Simulink建模方法。仿真结果表明,该方案在动态响应速度(25ms)和直流电压纹波(1.1%)方面显著优于传统SPWM控制。同时给出了

MHD0815的博客 162

【代码扫描修复】弱HASH(中危)

【代码扫描修复】弱HASH(中危)

ACGkaka的博客 2846

嵌入式GUI显示驱动配置实战:从emWin硬件接口到SPI屏驱动优化

在嵌入式系统开发中,显示驱动是连接GUI库与物理屏幕的核心底层模块,其本质是CPU与显示控制器之间的数据“翻译”与“传输”系统。其工作原理是通过实现特定的硬件抽象层接口,将GUI生成的图形数据转换为屏幕能识别的时序和协议。这项技术的核心价值在于,它允许开发者在资源受限的MCU上,通过适配不同的硬件接口,以最小的硬件开销实现稳定的图形输出。其典型应用场景包括智能家居面板、工业HMI、可穿戴设备等嵌入式图形界面开发。本文将深入解析emWin GUI库的驱动框架,重点探讨如何针对SPI、I2C等串行接口进行高效的

weixin_29159711的博客 342

Hash算法进行签名验签

Hash算法进行签名验签 Hash算法 哈希算法(Hash 算法,Hash 算式,散列算法,消息摘要算法) :将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。 性质 单向性。即给定一个输入数,容易计算出它的哈希值,但是已知一个哈希值根据同样的算法不能得到原输入数。 弱抗碰撞性。即给定一个输入数,要找到另一个得到给定数的哈希值,在使用同一种方法时,在计算上不可行。 强...

免费SSL证书 803

Android开发Intent详解

本文详解Android开发Intent。

qq_30725967的博客 2414

基于微信小程序的答题系统

学习视频:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!5812)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_83330193的博客 499

【漏洞复现】CVE-2004-2761:使用弱哈希算法签名的 SSL 证书(SSL Certificate Signed Using Weak Hashing Algorithm)

本次复现是针对编号为CVE-2004-2761的漏洞,由于条件有限,本次复现通过创建自签名证书进行操作。解决证书链中的 SSL 证书使用弱哈希算法进行签名的问题。

qq_43455906的博客 2万+

RACECAR底层平台安装:Jetson Nano+ROS Melodic全栈部署指南

移动机器人开发中,底层平台安装是将硬件转化为可编程移动平台的关键起点。其核心在于嵌入式系统、ROS中间件与传感器驱动的深度协同——需兼顾内核模块加载、GPIO/PWM精确控制、I2C设备初始化及ROS工作空间构建等多层技术耦合。尤其在竞速级小车如RACECAR场景下,Jetson Nano的硬件加速能力、MPU6050 IMU固件加载、TB6612FNG电机驱动配置等细节,直接决定运动控制精度与实时性。本文聚焦Ubuntu 18.04 + ROS Melodic + JetPack 4.4.1技术栈,覆盖从

weixin_32025789的博客 255

弱类型语言 Hash比较存在缺陷

转自:来自FreeBuf黑客与极客(FreeBuf.COM)-->http://www.freebuf.com/news/67007.html 最近一个被称为“Magic Hash”的PHP漏洞可以使得攻击者非法获取用户的账号信息。漏洞原因是PHP以一种特定的方式处理被哈希的字符串,攻击者可以利用其从中尝试并可能获取密码,绕过登录认证系统和其它运行在PHP哈希比较之上的函数。 漏洞描述

Lisam Blog 1576

【主力资金密码】副图指标升级版使用技术图文案例分解,通达信软件炒股指标公式代码

(1)主力资金线在低位时,对应的副图指标显示柱线是绿色,这个阶段主力资金参与小,行情处于下跌趋势或弱势震荡。当然,如果结合主图指标【翻倍密码系统】操作,主图的两个买卖点以及K线均线变色跟踪功能,更多的技术支撑,多空更加清晰,共振做多或多头更加确定和安全。如上图标记,中档虚线是参考安全操作的一个区间划分,粉色阶段做多或持股为主,为操作增加一道安全保护。如上图,副图指标【主力资金密码】更新叠加操作区间背景,绿色阶段持币或做空,粉色阶段做多或持股。如上图,副图指标,标记的两个区间,绿色区间时做空或持币。

weixin_69760830的博客 2553

Qt C++ 信号发生器控制软件

waveformComboBox->addItems({"正弦波", "方波", "三角波", "锯齿波", "脉冲波"});frequencyLabel = new QLabel("频率 (Hz):");amplitudeLabel = new QLabel("幅值 (V):");offsetLabel = new QLabel("直流偏移 (V):");} else if (currentWaveform == "三角波") {} else if (currentWaveform == "方波") {

寒寒豆豆软件公司的博客 125

SSL Certificate Signed Using Weak Hashing Algorithm,使用弱哈希算法签名的 SSL 证书的解决方法,在docker下Nginx生成ssl证书https

SSL Certificate Signed Using Weak Hashing Algorithm,使用弱哈希算法签名的 SSL 证书的解决方法,在docker下Nginx生成ssl证书https协议

weixin_40555654的博客 1万+

matlab 一维相位解缠

一维相位解缠算法的matlab代码实现。

点云侠的博客 372

分布式理论

百度百科上,“分布式”即“分布式计算”:所谓分布式计算就是在两个或多个软件互相共享信息,这些软件既可以在同一台计算机上运行,也可以在通过网络连接起来的多台计算机上运行分布式计算是计算机科学中一个研究方向,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果。所以,分布式是一种计算方式,我们熟知的计算方式还有:集中式计算、并行计算、客户端-服务器计算、网格计算、云计算、边缘计算,等等。

usenameR的专栏 1805

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

分布式系统设计之基础设施(一)

分布式系统设计之基础设施一个大型,稳健,成熟的分布式系统背后,是由很多系统共同支撑的,我们将这些支撑系统成为分布式系统的基础设施。分布式缓存简介 分布式缓存主要用于高并发环境下,减轻数据库的压力,提高系统的响应速度和并发吞吐能力。在请求到数据库前,优先进行缓存读取数据,降低对数据库的访问。 memcache安装(略) memcacheAPI与分布式 采用memcache协议进行通信,这

u012244265的专栏 739

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【算法】哈希、一致性哈希

-------------------------------------------------------- 此篇博客想写什么?我的理解: 1.关于哈希算法:概念、理解、应用 MD5如何运用在项目中的用户名登录注册加密上? 2.关于一致性哈希:概念、详解、应用 关于分布式、集群的概念和区别? ---------------------------------------...

zDavid_2018的博客 482

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

分布式数据管理基础

分布式数据管理基础

weixin_47692652的博客 731

缓存+一致性哈希+分布式面试题

前言 说起来开始进行面试是年前倒数第二周,上午9点,我还在去公司的公交上,突然收到蚂蚁的面试电话,其实算不上真正的面试。面试官只是和我聊了下他们在做的事情(主要是做双十一这里大促的稳定性保障,偏中间件吧),说的很详细,然后和我沟通了下是否有兴趣,我表示有兴趣,后面就收到正式面试的通知,最后没选择去蚂蚁表示抱歉。 当时我自己也准备出去看看机会,顺便看看自己的实力。当时我其实挺纠结的,一方面现在部门也正需要我,还是可以有一番作为的,另一方面觉得近一年来进步缓慢,没有以前飞速进步的成就感了,而且业务和技术偏于稳定

m0_57286679的博客 104

【Go | 从0实现简单分布式缓存】-6:GeeCache总结

总结之前 GoCache 的实现过程,这是一个从零开始用 Go 语言实现的分布式缓存系统。详细介绍了缓存淘汰策略LRU、并发控制、一致性哈希算法、分布式节点通信、缓存击穿的解决方案以及优化方向。

theaipower的博客 3万+

分布式任务调度与分片——一致性哈希算法全面解析

分布式任务调度与分片——一致性哈希算法全面解析

专注分享技术、实用优质教程、资源 810

分布式节点、一致性哈希与架构降维:从原理到Python模拟实战

随着业务系统走向微服务化和容器化,分布式节点如何被高效调度、算法如何在路由决策中发挥作用、架构如何通过分层降维降低复杂度,成为后端工程师必须面对的核心问题。一致性哈希作为经典的路由算法,能够减少节点变动带来的数据迁移;注册中心则负责维护健康节点列表并动态摘除故障实例。理解这些基础机制,是构建高可用系统的前提。文章聚焦分布式节点、一致性哈希算法与架构降维的交汇点,通过一个基于Python的模拟案例,完整展示从节点注册、心跳续约到哈希环路由的链路,帮助读者将理论映射到实际工程。

weixin_30567225的博客 349

分布式哈希表

分布式哈希表 Posted on 2011-11-26 16:42天地玄黄阅读(19)评论(0)编辑收藏 我们从浅入深一步一步介绍什么是分布式哈希表。 1、哈希函数 哈希函数是一种计算方法,它可以把一个值A映射到一个特定的范围[begin, end]之内。对于一个值的集合{k1, k2, … , kN},哈希函数把他们均匀的映射到某个范围之中。这样,...

weixin_30920853的博客 352

java分布式都有哪些知识点

分布式计算就是通过计算机网络将计算工作分布到多台主机上,多个主机一起协同完成工作。我试着列一下相关知识吧。网络通讯,网络是分布式的基础,对分布式的理解建立在对网络的理解上,包括:OSI模型的7层TCP/IP,DNS,NATHTTP,SPDY/HTTP2Telnet网络编程,是通过程序在多个主机之间通信。包括:Socket多线程非阻塞IO网络框架NettyMinaZeroMQ操作系统的网络部分RPC...

M_Jack的博客 795

关于分布式一致性哈希在微服务部署中的实战优化7

哖_少オ輕狂 210

《系统架构师成长之路》第 5 期|数据结构与算法:哈希表与一致性哈希——从 O(1) 查找到分布式分片

从单机哈希表的 O(1) 推导出发,到分布式取模分片扩容 N/(N+1) 全量失效的雪崩分析,再推一致性哈希如何把扩容影响压到 1/(N+1),并详解虚拟节点解决数据倾斜。

坐看风云变幻 351
上一篇: 【消息队列MQ】各类MQ比较
下一篇: 【linux基础】Valgrind
indie-XinYe
博客等级 码龄19年 154粉丝 41原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值