redis是一种基于键值对的来存储数据的nosql数据库
其中对应的value支持string,list,set,zset,bitmaps,hyperloglog,GEO地理信息数据
常用的有String,list,set,zset,hash
- String类型是redis最基本类型之一,其存储数据方式为key和value的方式,其中value即为String类型,常用方式get set获取对应的key
- list是一种数据结构(链表),可以将list当成栈,也可以当成队列,常用指令lpush ,rpush
- set类型的数据类型与List数据类型对最大的不同就是不允许存在相同的元素(无序,不重复集合),常用指令sadd,sdiff set2 set3(求set2和set的差集),sinter set2 set3(求set2和set3的交集),sunion set2 set3(求set2和set3的并集)
- Hash表类型可以理解成一个Map集合,即Value是一个Map集合;常用指令hset map1 name zhangsan(添加一个元素),批量添加(hmset map1 age 15 gender male)
- zset类型在set的基础上增加了一个值(这个值可以用来排序),可以把Zset看成是有序set;常用指令zadd zset1 1 zhangsan(增加一个排序score)
使用场景
string 用来缓存存储一些简单的数据,比如用户名,密码,token,session等;
hash键值对存储,hset user:1 name zhangsan age 18 gender male
list 存储一些需要按照顺序存储的数据,比如消息队列,日志,缓存等;
set 存储一些需要去重且无序的数据,比如用户访问过的页面,用户访问过的商品等(抽奖系统:SADD 添加参与者,SPOP 随机抽取中奖者;标签/好友关系:存储用户标签,通过 SINTER 查找共同关注;去重统计:记录用户点赞、签到等唯一行为);
sort set 元素关联分数,按分数排序;如游戏积分,排行榜
底层数据结构
hash底层的数据结构是ziplist或hashtable,键值对个数超过512 会由ziplist转换为hashtable
set底层的数据结构是intset或hashtable,元素为整数且键值对个数小于512为intset,若超过或不符合则转换为hashtable
zset底层数据结构为压缩列表ziplist或skiplist+dict(跳表+字典),元素数量小于128且元素长度小于64;超过此阈值则转换为跳表+字典
list的底层数据结构为压缩列表ziplist或快速列表quicklist,元素数量小于512且元素长度小于64用ziplist;超过此阈值则转换为quicklist,由多个ziplist节点组成的双向链表,可以平衡内存与性能