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

1.字符串String (也可以存为int)
常用命令

编码
- int: 8个字节的长整型。
- embstr: 小于等于39个字节的字符串。
- raw: 大于39个字节的字符串。
使用场景
- 缓存功能
- 计数
- 共享Session
- 限速
//一分钟不能访问5次 isExists = redis.set(key,1,"EX 60","NX"); if(isExists != null || redis.incr(key) <=5){ // 通过 }else{ // 限速 } - 分布式锁
//利用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作为集合的内部实现。
使用场景
主要特征是交集并集差集上
- 标签
- 复杂查询 如要经常访问销量大于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的读写效率会下降。
使用场景
排行榜,分数为时间、按照播放数量、按照获得的赞数
延迟任务:超时订单取消