redis是Key-Value类型的内存数据库,对于数据库的操作都在内存中进行,并可定期的将数据异步的持久化到磁盘之上。由于是纯内存的操作,因此它的性能比普通的关系型数据库高出很多,同时由于是单线程串行的执行指令,因此也避免了加锁和释放锁的开销。相比于memcache,redis的每个value值最大可存储1GB,而memcache只有10MB,同时redis在速度上也快于memcache,还可以持久化。redis最大的特点则是,它可以支持五种基本数据类型,分别是字符串(string),哈希(hash),列表(list),集合(set),有序集合(Sorted Set)
字符串(string)
最基础的数据类型,首先key是字符串类型,其它的数据类型都是在字符串的基础之上构建的。
String 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字,还可以是二进制(图片、音频、视频)。
应用场景 | 具体说明 |
---|---|
用户签到、用户在线状态 | 用户签到、用户在线状态 |
缓存功能 | 常规key-value缓存应用,redis作为缓存层,Mysql作为储存层,绝大部分请求数据都是redis中获取的,由于redis的高并发特性,所以缓存通常能起到加速读写和降低后端压力的作用。 |
常规计数 | 使用redis作为计数的基础工具,可以实现快速计数、查询缓存的功能,同时数据可以一步落地到其他的数据源。 如:微博数,粉丝数等 |
共享session | 出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上, 用户刷新一次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理, 在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息都直接从redis中集中获取。 |
限速 | 处于安全考虑,每次进行登录时让用户输入手机验证码,为了短信接口不被频繁访问, 会限制用户每分钟获取验证码的频率 |
哈希(hash)
Hash一般也被称为字典,redis自己也可以作为一个比较大的hash存储。
在redis中哈希类型是指键本身又是一种键值对结构,如 value={{field1,value1},…{fieldN,valueN}}
一些关系型数据库中不是特别复杂的表,也无需复杂的关系查询,可以使用Redis的Hash来存储,也可以用Hash做表数据缓存。
应用场景 | 具体说明 |
---|---|
存储部分变更数据 | 如用户信息等 |
列表(list)
列表用来存储多个有序的字符串,一个列表最多可以存储2^32 - 1个元素,在redis中list是每个子元素都是String类型的双向链表,可以对列表的两端插入push和弹出pop,还可以取指定范围的元素,这样List即可以作为栈,也可以作为队列。
应用场景 | 具体说明 |
---|---|
实现秒杀模块 | 购物商场的秒杀商品。 |
消息队列系统 | 使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。 |
用作日志收集器 | 实际上还是一个队列,多个端点将日志信息写入Redis,然后一个worker统一将所有日志写到磁盘。 |
文章列表 | 每个用户都有属于自己的文章列表,现在需要分页展示文章列表,此时可以考虑使用列表,列表不但有序同时支持按照索引范围获取元素。 |
集合(set)
set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的
集合的概念就是一堆不重复值的组合。集合是用来保存多个字符串的元素,内部不允许有重复,集合内的元素是无序的,Redis支持集合的增删改查,同时支持多个集合取交集,并集,差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能
应用场景 | 具体说明 |
---|---|
标签(tag) | 如一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。 |
生成随机数 | 比如抽奖 ,订单号的唯一 |
有序集合(Sorted Set)
和Set相比,Sorted Set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列
sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构
它保留了元素不能重复的特性,但是csore可以重复,并且元素是有序的。
应用场景 | 具体说明 |
---|---|
排行榜 | 比如:在线游戏的排行榜,列出前100名高分选手, 列出某用户当前的全球排名 |