代码改变世界

redis数据类型--个人常规用法

2019-04-09 00:00  HA_Tinker  阅读(282)  评论(0编辑  收藏  举报

一.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 移除数据

1 Jedis client = clientManager.getPooledClient();
2 Pipeline pipeline = client.pipelined();
3 pipeline.lrange(key,start,end);
4 pipeline.ltrim(key,end + 1, -1);
5 List<Object> rs = pipeline.syncAndReturnAll();
6 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
  }
}