php redis做mysql的缓存,怎么异步redis同步到mysql数据库?
正常情况下是没有问题的,
但是有人用恶意脚本进行刷奖,也就是同一个人发起大量请求,1秒可能一两百的请求甚至更多,而且不只一个人刷奖。
问题出在1这一步
举个例子,假设每人只能抽一次奖,因为请求太快,同一人的a,b两个请求几乎同时来,a走完抽奖逻辑了,并且在抽奖表中插入记录的过程时,因为mysql的性能的问题,b去走1这一步是读不到表中的记录的,因为a的插入根本没有完成。所以b请求会再走一次抽奖逻辑。造成同一人抽奖两次,然后再插入抽奖表。
我关心的是能否a插入抽奖表的瞬间,b就能判断出抽奖表有数据。
所以我觉得问题是mysql写入的不够快,读取的不够快,所以我要采用redis做一层快速缓存。
我们做的抽奖是单一奖品百分之百中奖,只限制奖品数量,所以必须保证每人只能抽一次,而且尽量在程序层面去解决。
Redis的“表”怎么设计的?
应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql。
同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。
这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发,而且redis的高可用集群架构相对更复杂,一般不是很推荐。
大量写入操作的mysql,用什么样的负载均衡技术好?
这个不建议使用负载均衡,而是采用缓存来进行。缓存使用redis,内存数据库,网民每次访问的写入操作,都先存在redis中。另一个程序控制,每隔1min,从redis中把数据同步到mysql中。这样做有两个好处:提高写入速度,减小读写压力即使redis数据丢失,也只是丢失1min内的少量数据。
如何将Oracle迁移至mysql?
这里给您提供一些技术上的建议:
准备工作
(1)提前准备好数据,准备好源数据库与目标数据库,准备好迁移软件。
(2)如果迁移过程会产生增量数据,提前做好准备方案。
(3)对于特殊的对象,如存储过程、触发器、序列、函数等处理方案
(4)数据有效性校验方案,迁移后的数据如何校验。
(5)应急预案,用于处理迁移过程中可能出现的各种问题。
(6)性能调优方案,数据库迁移之后需要进行数据库优化工作。
迁移方案
(1)可以采用Oracle提供的迁移工具OGG工具进行数据迁移
(2)可以采用Mysql提供的迁移工具MySQL Migration Toolkit工具进行数据迁移
(3)使用开源免费的ETL工具Kettle进行数据迁移
迁移处理
(1)选定好某款迁移工具之后,可以开始迁移。
(2)在完成数据迁移后,处理部分特殊的对象,对部分错误信息进行处理。
(3)完成所有对象迁移之后,对MySQL数据库进行调优。
(4)MySQL数据库中数据有效性校验。
希望对您有帮助,谢谢!