一. String
1. 可以容纳最高 512M 的 value.
2. 经常用于通过 expire 来实现自动过期的一些值, 直接通过 setex 来.
3. 通过 incrby 的方式, 来实现 value 值得增长.
4. 执行 setnx 会返回加成后的值来决定谁获取到了锁, 比如同时往一个空的 key 写 setnx key value, 哪个线程返回值是 1, 即为抢到了锁.
基于以上, 则可以实现简单的分布式锁:
- public void lock(){
- if(jedis.setnx("test.lock","1") == 1){
- jedis.expire("test.lock",3);
- //TODO
- }
- }
- public void unlock(){
- jedis.del("test.lock");
- }
二. hash
hash 是一个 string 类型的 field 和 value 的映射表, hash 很多操作指令都类似于 string 类型的指令, 经常用于存储数据.
1.hash 常常用于存储数据.
2.hash 是 key field value 的数据结构, 与 String 相比, 更省内存, 但是对应自动过期粒度到 Key, 因此选择哪种数据结构依赖于需求决定.
三. List
List 简单就是队列, 一般都是用于做简单的 FIFO 队列.
1. 采用 rpush key value 把值赛进去, 通过 lpop 把值取出来.
2. 如果是一次取出多个可以用另外一种方式减少交互的次数, 降低往返的时延.
a.pipeline 降低交互次数.
b.lrange 获取数据
c.ltrim 移除数据
- Jedis client = clientManager.getPooledClient();
- Pipeline pipeline = client.pipelined();
- pipeline.lrange(key,start,end);
- pipeline.ltrim(key,end + 1, -1);
- List<Object> rs = pipeline.syncAndReturnAll();
- List<String> result = (List<String>) rs.get(0);
四. Set
Set 就是 set,String 类型的无序集合, 不允许重复
1.set 类型可以简单通过 sadd 判定某个值是否存在, 不存在则返回 1, 存在返回 0.
2. 在一些不允许重复值的场景下还是非常好用的.
五. sortedSet
有序集合, 默认根据 score 排序, 可使用场景非常多.
1. 热门排序, 由于在写入的时候就根据 score 排序, 因此根据 score 获取非常快, 但是在写入时候时间复杂度会相对高些.
2. 分布式定时任务, 这个当时无意中发现的, 再一些时间精度要求没那么高的场景时候非常好用.
a. 设置定时任务, key score(时间戳) member(定时任务参数)
b.zrangebyscore, 获取某个区间内的任务. 返回值是 Set<String> 即 member 的列表
c.zrem key member, 根据争抢有移除到的返回值为 1, 未移除到的返回值为 0, 来判断这个定时任务在哪台机器上执行.
d. 根据具体的 member 来执行任务
- // 添加定时任务
- jedis.zadd("cronKey",1554739013,"{'param':'123'}");
- // 获取区间定时任务
- Set<String> members = jeids.zrangeByScore("cronKey",0,currentTime);
- for(String value:members){
- if(jedis.zrem("cronKey",value)> 0){
- //TODO
- }
- }
来源: http://www.bubuko.com/infodetail-3016597.html