java如何保证缓存同步
java后台接口怎么防止重复提交?
java后台接口怎么防止重复提交?
这个问题主要以前端解决为主,后端打配合的解决方案。
1.前端来讲可以采用同步提交,在后端接口返回成功之前禁止相应点击事件,提交后直接置灰按钮,待有效编辑后再使能按钮,这种方案最简单有效。
2.后端接口需要做幂等设计,比如重复删除已经删除的订单号,需要判空后接口返回正确即可,又如重复下单,可以看订单状态,如果没完成支付的同一商品,接口返回提示完成订单再下单。
如何去学好java中的缓存?
介绍所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。
缓存主要可分为二大类:
一、通过外部中间件缓存,如Redis,Memcached
二、通过系统内部的Map或者引入的第三方jar包来进行缓存,如Google Guava Cache
第一大类不会占用系统的内存,缓存的数据可以进行持久化,而第二类会占用系统的缓存,缓存的数据不能进行持久化,分享一下这两大类的主要区别和应用场景
Redis
1.1 数据库
在Redis里,数据库简单的使用一个数字编号来进行辨认,默认数据库的数字编号是0。如果你想切换到一个不同的数据库,你可以使用select命令来实现。在命令行界面里键入select 1,Redis应该会回复一条OK的信息,然后命令行界面里的提示符会变成类似redis 127.0.0.1:6379[1]gt这样。如果你想切换回默认数据库,只要在命令行界面键入即可
1.2 命令、关键字和值
Redis不仅仅是一种简单的关键字-值型存储,从其核心概念来看,Redis的5种数据结构中的每一个都至少有一个关键字和一个值
关键字(Keys)是用来标识数据块,值(Values)是关联于关键字的实际值,可以是字符串、整数、序列化对象(使用JSON、XML或其他格式)
Redis命令的基本构成,如:set users:leto {name: leto, planet: dune, likes: [spice]}
关键字和值的是Redis的基本概念,而get和set命令是对此最简单的使用
1.3 Redis查询
对于Redis而言,关键字就是一切,而值是没有任何意义。Redis不允许通过值来进行查询
1.4 存储器和持久化
Redis是一种持久化的存储器内存储(in-memory persistent store)默认情况下,Redis会根据已变更的关键字数量来进行判断,然后在磁盘里创建数据库的快照(snapshot)。你可以对此进行设置,如果X个关键字已变更,那么每隔Y秒存储数据库一次。默认情况下,如果1000个或更多的关键字已变更,Redis会每隔60秒存储数据库;而如果9个或更少的关键字已变更,Redis会每隔15分钟存储数据库
至于存储器,Redis会将所有数据都保留在存储器中。显而易见,运行Redis具有不低的成本:因为RAM仍然是最昂贵的服务器硬件部件
1.5 小结
关键字(Keys)是用于标识一段数据的一个字符串
值(Values)是一段任意的字节序列,Redis不会关注它们实质上是什么
Redis展示了(也实现了)5种专门的数据结构
上面的几点使得Redis快速而且容易使用,但要知道Redis并不适用于所有的应用场景
Google Guava Cache
Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。
通常来说,Guava Cache适用于:
你愿意消耗一些内存空间来提升速度。你预料到某些键会被查询一次以上。缓存中存放的数据总量不会超出内存容量。(Guava Cache是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。如果这不符合你的需求,请尝试Memcached这类工具)如果你的场景符合上述的每一条,Guava Cache就适合你。并且自定义你的缓存才是最有趣的部分。
注:如果你不需要Cache中的特性,使用ConcurrentHashMap有更好的内存效率——但Cache的大多数特性都很难基于旧有的ConcurrentMap复制,甚至根本不可能做到。