1 put
put重载了三个方法,namespace是存储空间,0到65535之间,key和value都会序列化,version是版本号,expireTime是失效时间,单位为秒
ResultCode put(int namespace, Serializable key, Serializable value)
ResultCode put(int namespace, Serializable key, Serializable value, int version)
ResultCode put(int namespace, Serializable key, Serializable value, int version, int expireTime)
2 get
Result<DataEntry> get(int namespace, Serializable key)
get接口用于获取单个数据,要获取的数据由namespace和key指定。
当数据存在时,返回成功,数据存放在DataEntry对象中;
当数据不存在时,返回成功,ResultCode为ResultCode.DATANOTEXSITS,value为null。
3 mget
Result<List<DataEntry>> mget(int namespace, List<? extends Object> keys)
mget接口用于批量获取数据,要获取的数据由namespace和keys 集合指定。
数据存放在DataEntry对象中病放到List中返回
4 delete
ResultCode delete(int namespace, Serializable key)
根据namespace和key删除指定缓存
5 mdelete
ResultCode mdelete(int namespace, List<? extends Object> keys)
根据namespace和 keys 批量删除
6 getStat
Map<String,String> getStat(int qtype, String groupName, long serverId)
得到统计信息
7 incr/decr
Result<Integer> incr(int namespace, Serializable key, int value,int defaultValue, int expireTime)
Result<Integer> decr(int namespace, Serializable key, int value,int defaultValue, int expireTime)
namespace:计数器所在的namespace,key:缓存的key,value:本次增加 或者 减少值,defaultValue: 当计数器不存在时的初始化值 ,expireTime:过期时间,单位为秒
8 setCount
ResultCode setCount(int namespace, Serializable key, int count)
ResultCode setCount(int namespace, Serializable key, int count, int version, int expireTime)
将key对应的计数设置成count,忽略key原来是否存在以及是否是计数类型。因为Tair中计数的数据有特别标志,所以不能直接使用put设置计数值。
9 lock/unlock
ResultCode lock(int namespace, Serializable key)
ResultCode unlock(int namespace, Serializable key)
在并发情况下可以通过lock和unlock来实现分布式锁
10 invalid/minvalid
ResultCode invalid(int namespace, Serializable key)
ResultCode minvalid(int namespace, List<? extends Object> keys)
删除缓存
11 version支持
在Tair的put接口中,有一个version参数,这个参数是为了解决并发更新同一个数据而设置的。很多情况下,更新数据是先get,修改get回来的数据,然后put回系统。如果有多个客户端get到同一份数据,都对其修改并保存,那么先保存的修改就会被后到达的修改覆盖,从而导致数据丢失问题。
比如,缓存中有一个value值为 “a,b,c”,A和B同时get到这个value。A执行操作,在后面添加一个d,value为 “a,b,c,d”。B执行操作添加一个e,value为”a,b,c,e”。如果不加控制,无论A和B谁先更新成功,它的更新都可能会被后到的更新覆盖。
version使用方式
get接口返回的是DataEntry对象,该对象中包含get到的数据的版本号,可以通过getVersion()接口获得该版本号。在put时,将该版本号作为put的参数即可。 如果不考虑版本问题,则可设置version参数为0,系统将强行覆盖数据,即使版本不一致。
如果返回version不一致,怎么办?
如果更新所基于的version和系统中当前的版本不一致,则服务器会返回ResultCode.VERERROR。 这时你可以选择重新get数据,然后在新版本的数据上修改;或者设置version为0重新请求,以达到强制更新的效果。
12 Tair使用规范
- key和value不能设置太大,否则耗时大,服务qps(每秒查询率)低,影响性能
- key不要使用相同的值作为前缀,否则数据都会落到一个dataserver上,增加该数据节点的压力
- 批量请求的key个数不要太大,否则也会影响性能
- 超时时间也不要设置太大或者太小,设置太小容易超时,设置太大容易阻塞,建议使用默认值
- Tair虽然支持list,set,map等复杂数据结构,但是支持不是很好,元素个数不易过多