redis开发与运维-5种数据结构

Posted on By xqw

5种数据结构及存储
5种数据结构对应编码

官网文档

1.字符串String (也可以存为int)

常用命令

编码

  • int: 8个字节的长整型。
  • embstr: 小于等于39个字节的字符串。
  • raw: 大于39个字节的字符串。

使用场景

  1. 缓存功能
  2. 计数
  3. 共享Session
  4. 限速
     //一分钟不能访问5次
     isExists = redis.set(key,1,"EX 60","NX");
     if(isExists != null || redis.incr(key) <=5){
     // 通过
     }else{
     // 限速
     }
    
  5. 分布式锁
     //利用nx ex
     //加锁 5秒后超时 value可以自定义设置
     uuid = UUID.randomUUID();
     while(redis.set(key,time,"EX 5","NX") == null) {
         sleep(1);
     }
        
     doSomething();
        
     //TODO get del要原子操作,使用lua
     //判断uuid的原因:过期5s,若doSomething超过了5s,6s执行结束,这个时候就可能会删除别人的锁
     if (uuid == redis.get(key)) {
         redis.del(k);
     }
    

仍然存在的问题:
5s到6s这段时间的代码不是串行的
分布式锁

2.哈希 hash

常用命令

编码

哈希类型的内部编码有两种:

  • ziplist(压缩列表) : 当哈希类型元素个数小于hash-max-ziplist-entries 配置(默认512个) 、 同时所有值都小于hash-max-ziplist-value配置(默认64 字节) 时, Redis会使用ziplist作为哈希的内部实现, ziplist使用更加紧凑的 结构实现多个元素的连续存储, 所以在节省内存方面比hashtable更加优秀。
  • hashtable(哈希表) : 当哈希类型无法满足ziplist的条件时, Redis会使 用hashtable作为哈希的内部实现, 因为此时ziplist的读写效率会下降, 而 hashtable的读写时间复杂度为O(1) 。

使用场景

ORM映射,表名+id为key,字段名为field,值为vule

3 列表 list

常用命令

编码

  • ziplist(压缩列表) : 当列表的元素个数小于list-max-ziplist-entries配置 (默认512个) , 同时列表中每个元素的值都小于list-max-ziplist-value配置时 (默认64字节) , Redis会选用ziplist来作为列表的内部实现来减少内存的使 用。
  • linkedlist(链表) : 当列表类型无法满足ziplist的条件时, Redis会使用 linkedlist作为列表的内部实现。

使用场景

1.消息队列
2.文章列表(list+hash,hash存具体内容,list key:userId value 文章id[+name])

·lpush+lpop=Stack( 栈)
·lpush+rpop=Queue( 队列)
·lpush+ltrim=Capped Collection( 有限集合)
·lpush+brpop=Message Queue( 消息队列)

4 集合set

常用命令

scard:计算个数
sismember:是否存在
srandmember:随机返回指定个数
spop:随机弹出一个(随机删除一个,返回删除的)
inter:交集
uinon:并集
diff:差集(res=key1-key2-key3)

编码

  • intset(整数集合) : 当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个) 时, Redis会选用intset来作为集合的内部实 现, 从而减少内存的使用。
  • hashtable(哈希表) : 当集合类型无法满足intset的条件时, Redis会使 用hashtable作为集合的内部实现。

使用场景

主要特征是交集并集差集上

  1. 标签
  2. 复杂查询 如要经常访问销量大于1w的商品,(0,1w] (1w,2w] (2w,*] 3个key存了这三个区间的Id,那么大于1w的就可以使用并集

5 有序分数集合zset

常用命令

zrank:返回排名
zincrby:增加该成员的分数
zrange:返回开始到结束的成员 withscores会返回分数
zrangebyscore: 返回分数开始到结束的成员

127.0.0.1:6379> zrangebyscore user:ranking (200 +inf withscores
1) "tim"
2) "220"
3) "martin"
4) "250"
5) "tom"
6) "260

编码

  • ziplist(压缩列表) : 当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个) , 同时每个元素的值都小于zset-max-ziplist-value配 置(默认64字节) 时, Redis会用ziplist来作为有序集合的内部实现, ziplist 可以有效减少内存的使用。
  • skiplist(跳跃表) : 当ziplist条件不满足时, 有序集合会使用skiplist作 为内部实现, 因为此时ziplist的读写效率会下降。

使用场景

排行榜,分数为时间、按照播放数量、按照获得的赞数
延迟任务:超时订单取消

SpringDataRedis操作