redis缓存数据库详解(三):redis的持久化

5. 缓存-Redis Redis是一个高性能的开源内存键值数据库,支持多种数据结构如String、List、Hash、Set、Zset等,适用于缓存、会话存储、排行榜等场景。其核心特性包括内存存储、高效数据结构、单线程架构(核心命令执行)结合I/O多路复用技术,以及可选的持久化机制(RDB快照和AOF日志),确保高吞吐量和低延迟。 阅读详情

推荐一篇讲的十分清晰的文章https://blog.youkuaiyun.com/bible_reader/article/details/84138665

redis持久化

主要有两种RDB和AOF两种方式,redis默认使用的是RDB。

RDB也称为快照方式,是在满足触发条件时,一次性存储redis中的所有数据,数据是存储在dump.rdb文件中,采取的方式时fork一个子线程来新建一个当前redis的快照文件dump.rdb,当数据备份完成,删除旧的dump.rdb文件。

//触发持久化的条件
save 900 1 900秒有一个更新
save 300 10 300秒有十个更新
save 60 10000 60秒有10000个更新
//存储快照的文件
dbfilename dump.rdb

但是因为RDB在服务器宕机时可能会丢失部分数据,因为只有满足触发条件才会持久化,所以redis还提供了另外一种持久化方式AOF。

AOF默认是不开启的,可以在配置中打开,aof是保存redis的操作指令,aof文件是有最大容量限制的,如果超过最大容量,redis就会fork一个子线程来重写aof文件,就是精简旧的aof文件到新的文件中,这个过程主线程还是可以进行读写,写到旧的aof文件中,当重写完毕后,会删除旧的aof文件。

//默认是no,改为yes开启
appendonly yes
//这是aof的策略
# appendfsync always 总是持久化
appendfsync everysec 每秒持久化
# appendfsync no 不持久化
//存储操作指令的文件
appendfilename "appendonly.aof"

一般来讲,线上环境是两种方式都开启,rdb用来备份大量的数据,aof用来备份少部分rdb没有备份成功的数据。

Redis实战:高性能缓存与数据持久化 Redis作为一款高性能的键值对数据库,在缓存和数据持久化方面有着出色的表现。通过合理的缓存策略和持久化策略,可以显著提高系统的响应速度和性能,并确保数据的安全性。在实际应用中,需要根据业务需求进行权衡和调整,以达到最优的Redis使用效果。希望本文的分享能够帮助读者在Redis实战中取得更大的进步。 阅读详情

相关推荐

State of GPT (ChatGPT 原理及现状介绍)

要用 RLHF 的一个简单的原因就是 RLHF 模型效果更好,下面的图来源于 InstructGPT 论文,PPO (RLHF 算法) 后的模型生成的答案更被人类喜欢。karpathy 认为 RLHF 有用的原因是判别比生成更容易,让标注员去写一些 SFT 的 QA 数据对是比较难的,如果有一个 SFT 模型生成一些数据让标注员判断哪个更好就简单很多。,GPT4 最强,前三个都是 RLHF 模型,其他模型都是 SFT 模型。伯克利做的模型评测榜单。

kebijuelun的博客 3577

Redis中的两种持久化方式的介绍(RDB、AOF)

Redis作为一个缓存数据库,如果我们不设置其持久化方式,那么数据是不会被保存下来的,因为其基于内存进行数据存储,一旦服务器宕机后,其数据便不可恢复。 一、RDB方式的持久化 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。 1.rdb方式下redis如何进行数据持久化的? Redis会单独创建(fork)一个子进程来...

sout 428

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3350

分布式缓存Redis之持久化

写在前面  本学习教程所有示例代码见GitHub:https://github.com/selfconzrr/Redis_LearningRedis 可以持久化,当做Cache时持久化的意义在哪?  持久化的意思就是说服务器重启之后,缓存依然存在,内存类型的缓存,服务器重启后就不存在了。比如使用持久化的方案做登录Session,服务器重启后用户不用再次登录,而一般内存方案需要再次登录。  Redis

ZhangRui的博客 6744

24位ADC的精度陷阱:为什么你的ADS1232实测性能不达标?

本文深入探讨了24位ADC芯片ADS1232在实际应用中性能不达标的原因,揭示了高精度ADC性能依赖周边电路设计的关键问题。通过分析电源系统、参考电压稳定性、PCB布局等常见陷阱,提供了优化方案和调试技巧,帮助工程师充分发挥ADS1232的潜力,实现接近理论值的测量精度。

weixin_28285943的博客 405

【国产化信创实践】宝兰德bes中间件集成springboot

【国产化信创实践】宝兰德bes中间件集成springboot

项目管理、软件工厂、vue研发、Java研发、中国文化等。 1万+

支持持久化的内存数据库-----Redis

一、Redis概述 1.1、什么是RedisRedis是一种高级key-value数据库。它跟memcached类似,不过数据 可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。 Redis的所有数据都是保存在内存中,然后不定期的通过异步方式

一轮明月半城沙 1524

Ruoyi-Cloud集成Seata2.0实现分布式事务

在网络上,关于Spring Cloud和Ruoyi-Cloud整合Seata的教程有很多,针对不同版本的 Seata 也有不少相关教程。事实上,无论是 Spring Cloud 还是 Ruoyi-Cloud,其整合 Seata 的原理基本相同。这篇博文将详细介绍如何在本地开发环境下,在中实现Seata 2.0的整合,希望能为大家在分布式项目中实现 Seata 的整合提供实用的帮助,提供一个清晰的操作思路。

SR003的博客 2245

Redis 持久化,为什么,必须要持久化,不就一个cache吗?

鉴于很多企业对于 REDIS MONGODB 的不重视,所以才有了这样的文字,REDIS 很多企业都在用,但用的好不好,估计也只有自己知道,没有密码,监听地址乱写,或者没有持久化,或持...

sql server的专栏 3450

如何运用好DeepSeek为自己服务:智能增强的范式革命 || 目录

1.1 认知增强的三次浪潮1.2 DeepSeek认知增强模型1.3 人机认知耦合协议1.4 认知增强的数学基础。

𝓓𝓸𝓶𝓲𝓷𝓪𝓽𝓲𝓷𝓰 𝓐𝓵𝓵 𝓣𝓱𝓲𝓷𝓰𝓼 1218

Altium AD20差分对走线设置方法

AD20的PCB差分对走线设置 1、原理图添加差分对 先在原理图中,讲要设置差分对的网络对添加网络标签。 名称前面的内容要相同,后缀用 _P 和 _N 加以区分。 最后使用 放置差分对,将两个网络标记。 2、编译,更改到PCB 编译,更新到PCB,确认差分对网络的出现。 验证更改,执行更改。将改动更新到PCB中。 PCB中,可通过 右下角 Panels - 调出 PCB 显示。来对已添加的差分对进行查看。 这时原本的走线有一点点小问题,需要删掉原来走线,设置差分对规则,并重新布线。

Mark_md的博客 3万+

Redis进阶:持久化机制、缓存DB一致性、缓存隐患、分布式锁

客户端会向 Redis 集群中多个独立的 Redis 实例节点请求加锁,如果客户端能够从半数以上的 Redis 实例节点申请加锁成功,我们则认为客户端获取分布式锁成功,反之,则认为获取分布式锁失败!:把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。在某些分布式缓存系统中,数据可能有多个副本,第一次删除可能没有移除所有的副本。aof是基于内存中的数据进行重写的,重写的时候会把那些历史的无用命令都清除掉,只根据当前一刻内存的数据的最终命令进行重写。

m0_63432840的博客 1108

VMware使用Windows、WinXP等虚拟机上不了网的解决办法(管用)

这个情况一般出现在可以插网线的电脑上,比如台式机和有网线插口的笔记本。需要转换器才能插网线的笔记本一般不会出现这种情况. 查看主机的IP地址和虚拟机的IP地址是否在同一网段,如果在的话,虚拟机就能上网了!!(备注:虚拟机中的IP地址一定要和主机中的用来上网的那个连接的IP地址相同哦)。

爱吃雪糕的小布丁的博客 1万+

Redis持久化策略以及三大缓存问题

在我的Redis的必备知识(一)-优快云博客这篇文章当中的话其实我主要就是说了Redis的优点以及其中的五种数据类型以及进行相关操作的常用的命令,那么这个时候我就会和你们说一下Redis怎么进行持久化的以及其作为缓存进行使用的话是怎么解决的包括怎么保证数据库和缓存的数据库的一致性。

2201_75397629的博客 1644

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

使用Redis进行数据库缓存

当我们网站的数据量过大时,使用Java频繁访问数据库会造成延迟过大、数据丢失等问题,这时候就需要使用缓存技术将经常访问的数据保存在缓存数据库以减少数据库访问。我们经常使用Redis作为缓存数据库。

theVicTory的博客 8694

深度学习工具包 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")

Redis缓存机制(详解)

redis是*一个运行在内存上的key-value存储系统。是NoSQL数据库之一。redis持久化的意义,在于故障恢复,数据恢复,也可以归类到高可用的一个环节里面去。线程模型,数据结构,持久化,网络模型。持久化,主从复制,哨兵机制。...

m0_71202849的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Redis高手修炼之路】③持久化

RDB:只用作后备用途,建议15分钟备份一次就好AOF:在最恶劣的情况下,也只丢失不超过2秒的数据,数据完整性比较高,但代价太大,会带来持续的IO对硬盘的大小要求也高,默认64mb太小了!

阿莫夕林的博客 1680

【Redis缓存】

相比于数据库而言,缓存的操作性能更高,缓存性能高的主要原因有以下几点:1、缓存一般都是key-value查询数据的,因为不像数据库一样还有查询的条件等因素,所以查询的性能一般会比数据库高;2、缓存的数据是存储在内存当中的,而数据库的数据是存储在磁盘当中的,因为内存的操作性能远远大于磁盘,因此缓存的查询效率会高很多;3、缓存更容易做分布式部署(当一台服务器变成多台相连的服务器集群),而数据库一般比较难实现分布式部署,因此缓存的负载和性能更容易平行扩展和增加。缓存大致分为两大类:本地缓存、分布式缓存本地缓存:也

weixin_54161577的博客 9826

Redis缓存数据持久化:从原理到实践的全面解析

本文深入解析了Redis缓存数据的两种持久化方案:RDB和AOF。RDB通过定时快照实现高效持久化,适合性能优先场景;AOF则记录所有写操作命令,提供更好的数据安全性。文章详细比较了两者的工作原理、触发机制、优缺点及适用场景,并建议在高安全性需求时组合使用这两种方案。最后针对不同业务场景给出了配置建议,纯缓存场景推荐仅开启RDB,而关键数据场景建议同时启用AOF和RDB,实现性能与安全的平衡。

2301_80017072的博客 1134

Redis、MySQL、hive、hbase的区别以及数据库及数据仓库的比较

redis:分布式缓存,强调缓存,基于内存 传统数据库:注重关系,注重事务性 hbase:列式数据库,字典查询,稀疏性存储,无法做关系数据库的主外键,用于存储海量数据,底层基于hdfs hive:数据仓库工具,底层是mapreduce。不是数据库,不能用来做用户的交互存储 HBase和Redis都是基于Key、Value的数据库。 ...

qq_39682761的博客 7456

Redis持久化+Redis内存管理和优化+Redis三大缓存问题

Redis持久化+Redis内存管理和优化+Redis三大缓存问题

m0_71593537的博客 1320

Redis的持久化方式和缓存淘汰策略

redis的持久化方式和缓存淘汰策略 每天多学一点点~ 写博客的目的不仅在于分享,也是为了方便日后复习巩固 话不多说,这就开始吧… 文章目录redis的持久化方式和缓存淘汰策略1.序2.RDB快照(snapshot)2.AOF(append-only file)3.选择哪一个4.Redis4.0混合持久化及AOF重写5.缓存淘汰策略6.结语 1.序 昨天一个同事问了我一个问题,他在windows下...

爆裂无球的程序空间 3865

Redis 持久化终极指南:为什么你的缓存一断电就没了?

在 Redis 4.0 之前,我们还在争论用 RDB 还是 AOF。但在现代,最佳实践是“混合持久化” (Hybrid Persistence)。结合两者的优点前半段用RDB格式存(由于是压缩的,恢复快)。最近发生的增量数据用AOF格式存(保证不丢数据)。结论如果你只拿 Redis 做缓存(丢了也没事,哪怕从数据库重新加载),可以关掉持久化,性能起飞。如果你拿 Redis 当数据库用(不能丢数据),请务必开启RDB + AOF 混合模式。

郑龙飞 2036

Redis的缓存原理

Redis的缓存原理 Redis是什么? Redis 是一个高性能的开源的、C语言写的Nosql(非关系型数据库),数据保存在内存中。 Redis 是以key-value形式存储,和传统的关系型数据库不一样。不一定遵循传统数据库的些基本要求,比如说,不遵循sql标准,事务,表结构等等,非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 Java中数据结构:String,...

blondekid的博客 8892

Redis 缓存持久化机制详解:RDB vs AOF 全解析

RDB 会在某个时间点将 Redis 内存中的数据整体快照保存成一个 .rdb 文件,存储在硬盘上。AOF 会将每一次写命令(set、hset、lpush 等)都追加到一个日志文件中(.aof 文件),从而实现数据恢复。RDB 提供高性能的快照备份,AOF 提供更强的数据完整性保障。两者结合,才能让 Redis 在高可用场景下既稳又快!本文全面解析了 Redis 的两种持久化机制:RDB(快照)和 AOF(追加日志)。

一键难忘的博客 3093
上一篇: redis缓存数据库详解(二):redis的数据结构及基础命令
下一篇: redis缓存数据库详解(四):redis与springboot整合
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值