基本数据类型
String、List、Set、Zset、Hash
数据类型特点
类型 | 值 | 操作 |
---|---|---|
String | 可以是字符串、整数或浮点数 | 对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作; |
List | 一个链表,链表上的每个节点都包含一个字符串 | 对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素; |
Set | 包含字符串的无序集合 | 字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等 |
Zset | 和散列一样,用于存储键值对 | 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素 |
Hash | 包含键值对的无序散列表 | 包含方法有添加、获取、删除单个元素 |
使用场景及数据结构
String场景
- 缓存:缓存图片、验证码等信息,降低mysql读写压力
- session共享
- 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源
数据结构
- 字符串是Redis最基本的数据类型,不仅所有key都是字符串类型,其它几种数据类型构成的元素也是字符串。注意字符串的长度不能超过512M。
List场景
- 使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。
- List的另一个应用就是消息队列,可以利用List的PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。
- Redis还提供了操作List中某一段的api,你可以直接查询,删 除List中某一段的元素。
- 微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。
- 消息队列
Redis 的 Set 是 String 类型的无序集合。
Set场景
- 集合成员是不可重复的 Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
- 标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。点赞,或点踩,收藏等,可以放到set中实现
Hash场景
- Redis hash 是一个 string 类型的 field(字段) 和 value(属性) 的映射表,hash特别适合用于存储对象。一个hash可以存多个key-value,类似一个对象的多个字段和属性
- 缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
Zset有序集合
简介
Redis 有序集合和集合一样基本一致
每个元素都会关联一个 double 类型的权重参数(score),使得集合中的元素能够按score进行有序排列。
特点:
- 有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
- 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
- 成绩排行:比如一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分,形成了按成绩排序。
- 权重分配:可以用sortedset来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。