Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)String是redis中最基本的数据类型,一个key对应一个value,它的类型是二进制安全的。意思是 redis 的 string 可以包含任何数据,比如数字,字符串,jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。使用场景:
缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力;
计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源;
session:常见方案spring session + redis实现session共享。
使用命令:get 、 set 、 del 、 incr、 decr 等。如下图:
Hash(哈希)
Hash,是一个 string 类型的 field 和 value 的映射表,相当于一个Mapmap,即一个键值(key=>value)对集合,指value值本身又是一种键值对结构。hash 特别适合用于存储对象,如 value={{field1,value1},......fieldN,valueN}}。每一个Hash可以存储4294967295个键值对。使用场景:
缓存: 能直观的、相比string更节省空间的维护缓存对象信息,如用户信息,视频信息等,可以存储、读取、修改对象的属性。
hash的命令都是 h 开头的 hget 、hset 、 hdel 等。如下图:
List(列表)List(链表),List 说白了就是链表(redis 使用双端链表实现的 List),可以通过下标取出对应的value值,可以添加一个元素到列表的头部(左边)或者尾部(右边)。Redis的list是由多个字符串值组成的有序可重复(value可以重复)的序列,由于是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。list最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。使用场景:lpush+lpop=Stack(栈);lpush+rpop=Queue(队列);Ipush+ltrim=Capped Collection(有限集合);Ipush+brpop=Message Queue(消息队列)。如:
timeline:例如微博的时间轴,有人发布微博,用lpush加入时间轴,展示新的列表信息。
list的命令:lpush、rpop、ltrim等。如下图:
Set(集合)
Set(集合),集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合类型也是用来保存多个字符串的元素,但和列表不同的是set集合中不允许有重复的元素,集合中的元素是无序的,不能通过索引下标获取元素,支持集合间的操作。集合最大的优势是可以从多个集合取交集、并集、差集。使用场景:
标签(tag):给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人,好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐;
共同好友:利用交集求共同好友;
不可重复性:利用唯一性,可以统计点赞,点踩,收藏,访问网站的所有独立IP等。
命令都是以s开头的 sset 、srem、scard、smembers、sismember。如下图:
zset(有序集合)
zset(有序集合),Redis的zset 和 set集合有着必然的联系, 也是string类型元素的集合,且不允许重复的成员。区别是有序集合中的元素是可以排序的,它给每个元素设置一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合中的元素不可以重复,但是score分数可以重复。使用场景: