一、redis数据类型
redis底层的数据结构包括简单动态字符串,双端链表,字典,压缩列表,整数集合等等。但是redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包括:
- 字符串对象(REDIS_STRING)
- 最常用,普通的key/value存储都可以归为此类,一个键最大能存储512MB。
- value 不仅可以是String,也可以是数字,或者序列化对象。
- String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
- 列表对象(REDIS_LIST)
- list的底层实现为一个双向链表,即可以支持反向查找和遍历,更方便操作;
- 常用于比如微博的timeline、消息队列等场景;
- 哈希对象(REDIS_HASH)
- Hash是一个健值对集合,是一个String类型的key与value的映射表,特别适合用于存储对象。
- 当哈希对象保存的所有键值对键和值的字符串长度小于64字节,或者键值对数量小于512时,Redis会采用压缩列表的方式来紧凑存储,对应的value redisObject的encoding为ziplist,当成员数量增大时会自动转成真正的HashMap,此时encoding为hashtable;
- 有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为json格式做为value进行保存。
- 集合对象(REDIS_SET)
- set 底层实现是一个 value永远为null的HashMap,通过计算hash的方式来快速排重,这也是set能提供判断一个成员是否在集合内的原因;
- 常用于微博或者qq求共同好友(求交集);
- 有序集合对象(REDIS_ZSET)
- 类似Redis集合,不同的是增加了一个功能,即集合是有序的。一个有序集合的每个成员带有分数,用于进行排序;
- 内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序;
- 常用于带有权重的元素,比如一个游戏的用户得分排行榜 。
二、使用Redis的好处
速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
支持丰富数据类型,支持string,list,set,sorted set,hash
支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
丰富的特性:可用于缓存,消息,按key设置timeout,过期后将会自动删除。
- 相比于memcached:
- memcached所有的值都是简单的字符串,redis作为其代替者,支持更丰富的数据类型
- redis速度比memcached快很多
- redis可以持久化其数据
三、Redis最适用的场景
会话缓存(Session Cache)
- 最常用就是使用Redis做会话缓存。
- Redis相比与其他存储的优势在于可持久化。
全页缓存
- 除基本的会话token之外,Redis还提供简便的全页缓存(FPC)平台。
- 即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度下降。
消息队列
- Redis在内存存储引擎领域的最大一个优点就是提供list和set操作,这使得Redis能做为一个很好的消息队列平台来使用。
排行榜/计数器
- Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(set)和有序集合(Sorted Set)也使得我们在执行这些操作时变得非常简单,Redis只是正好提供了这两种数据结构。
发布/订阅(Pub/Sub)
- Redis自带的发布/订阅功能可使用场景非常多。可以在社交网络连接中使用,还可以作为基于发布/订阅的脚本触发器,甚至可以用来建立聊天系统。
事务(Transactions)
- 虽然 Redis 的 Transactions 提供的并不是严格的 ACID 的事务,但是这个 Transactions 还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间不会有其它客户端命令插进来执行)。
- Redis 还提供了一个 Watch 功能,可以对一个 key 进行 Watch,然后再执行 Transactions,在这过程中,如果这个 Watched 的值进行了修改,那么这个 Transactions 会发现并拒绝执行。
参考文献:《Redis设计与实现》