Redis(三):Redis数据结构、使用场景及经常使用命令



Redis 命令参考php


Redis数据结构

String(字符串)List(列表)Set(集合)Hash(哈希表)SortedSet(有序集合)
Redis数据结构
String(字符串)
string
List(列表)
list
Set(集合)
set
Hash(哈希表)
hash
SortedSet(有序集合)
sort setweb

Redis常见应用场景及经常使用命令


• 排行榜类的应用,取TOP N操做,前面操做以时间为权重,这个是以某个条件为权重,好比按顶的次数排序计数器应用
• 存储关系:好比社交关系,好比Tag等redis

缓存
对于热点数据,缓存之后可能读取数十万次,所以,对于热点数据,缓存的价值很是大。例如,分类栏目更新频率不高,可是绝大多数的页面都须要访问这个数据,所以读取频率至关高,能够考虑基于 Redis 实现缓存。数据库

会话缓存
能够考虑使用 Redis 进行会话缓存。例如,将 web session 存放在 Redis 中。缓存

时效性
例如验证码只有60秒有效期,超过期间没法使用,或者基于 Oauth2 的 Token 只能在 5 分钟内使用一次,超过期间也没法使用。服务器

访问频率
出于减轻服务器的压力或防止恶意的洪水攻击的考虑,须要控制访问频率,例如限制 IP 在一段时间的最大访问量。cookie

计数器
数据统计的需求很是广泛,经过原子递增保持计数。例如,应用数、资源数、点赞数、收藏数、分享数等。session

社交列表
社交属性相关的列表信息,例如,用户点赞列表、用户分享列表、用户收藏列表、用户关注列表、用户粉丝列表等,使用 Hash 类型数据结构是个不错的选择。数据结构

记录用户断定信息
记录用户断定信息的需求也很是广泛,能够知道一个用户是否进行了某个操做。例如,用户是否点赞、用户是否收藏、用户是否分享等。并发

交集、并集和差集
在某些场景中,例如社交场景,经过交集、并集和差集运算,能够很是方便地实现共同好友,共同关注,共同偏好等社交关系。

热门列表与排行榜
按照得分进行排序,例如,展现最热、点击率最高、活跃度最高等条件的排名列表。

最新动态
按照时间顺序排列的最新动态,也是一个很好的应用,可使用 Sorted Set 类型的分数权重存储 Unix 时间戳进行排序。

消息队列
Redis 能做为一个很好的消息队列来使用,依赖 List 类型利用 LPUSH 命令将数据添加到链表头部,经过 BRPOP 命令将元素从链表尾部取出。同时,市面上成熟的消息队列产品有不少,例如 RabbitMQ。所以,更加建议使用 RabbitMQ 做为消息中间件。


Key(键)

TTL key //(获取key的过时时间),以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
KEYS * //查看全部key,匹配数据库中全部 key

Server(服务器)

FLUSHALL //清空整个 Redis 服务器的数据(删除全部数据库的全部 key )

一、String(字符串)

String数据结构是简单的key-value类型,value其实不只能够是String,也能够是数字。

SET key value //将字符串值 value 关联到 key
GET key //返回 key 所关联的字符串值

INCR key //将 key 中储存的数字值增一
DECR key //将 key 中储存的数字值减一
DECRBY key decrement //将 key 所储存的值减去减量 decrement

MSET key value [key value ...] //同时设置一个或多个 key-value 对
MGET key [key ...] //返回全部(一个或多个)给定 key 的值

EXPIRE key seconds //给指定的key设置过时时间,为给定 key 设置生存时间,当 key 过时时(生存时间为 0 ),它会被自动删除
PERSIST key //清除过时时间,移除给定 key 的生存时间

STRLEN key //返回 key 所储存的字符串值的长度

使用场景:

常规key-value缓存应用;
常规计数:微博数,粉丝数等。
缓存、限流、计数器、分布式锁、分布式Session


二、List(列表)

list就是链表,Redis list的应用场景很是多,也是Redis最重要的数据结构之一,好比微博的关注列表,粉丝列表,最新消息排行等功能均可以用Redis的list结构来实现。
Redis list的实现为一个双向链表,便可以支持反向查找和遍历,更方便操做,不过带来了部分额外的内存开销。

LPUSH key value [value ...] //将一个或多个值 value 插入到列表 key 的表头
LPOP key //移除并返回列表 key 的头元素

RPUSH key value [value ...] //将一个或多个值 value 插入到列表 key 的表尾(最右边)
RPOP key //移除并返回列表 key 的尾元素

LLEN key //返回列表 key 的长度
LRANGE key start stop //返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。

使用场景:

取最新N个数据的操做
能够将最新的50条评论的ID放在List集合
微博的关注列表,粉丝列表,最新消息排行等
能够作简单的消息队列的功能。
能够利用lrange命令,作基于redis的分页功能,性能极佳,用户体验好。


三、Set(集合)

set对外提供的功能与list相似是一个列表的功能,特殊之处在于set是能够自动排重的。 当你须要存储一个列表数据,又不但愿出现重复数据时,set是一个很好的选择,而且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
在微博应用中,能够将一个用户全部的关注人存在一个集合中,将其全部粉丝存在一个集合。Redis能够很是方便的实现如共同关注、共同喜爱、二度好友等功能。

SADD key member [member ...] //增长set,将一个或多个 member 元素加入到集合 key 当中
SCARD key //返回集合 key 的基数(集合中元素的数量)
SISMEMBER key member //是否存在,判断 member 元素是否集合 key 的成员
SMEMBERS key //返回集合 key 中的全部成员
SPOP key //移除并返回集合中的一个随机元素
SUNION key [key ...] //返回一个集合的所有成员,该集合是全部给定集合的并集
SREM key member [member ...] //删除,移除集合 key 中的一个或多个 member 元素

使用场景:

赞、踩、标签、好友关系
在微博应用中,能够将一个用户全部的关注人存在一个集合中,将其全部粉丝存在一个集合。Redis能够很是方便的实现如共同关注、共同喜爱、二度好友等功能。
利用交集、并集、差集等操做,能够计算共同喜爱,所有的喜爱,本身独有的喜爱等功能。
获取某段时间全部数据排重值,使用set,好比某段时间访问的用户ID,或者是客户端IP


四、Hash(哈希表)

Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 好比咱们能够Hash数据结构来存储用户信息,商品信息等等。散列(hashes)
举个例子: 最近作的一个电商网站项目的首页就使用了redis的hash数据结构进行缓存,由于一个网站的首页访问量是最大的,因此一般网站的首页能够经过redis缓存来提升性能和并发量。我用jedis客户端来链接和操做我搭建的redis集群或者单机redis,利用jedis能够很容易的对redis进行相关操做,总的来讲从搭一个简单的集群到实现redis做为缓存的整个步骤不难。

HSET key field value //将哈希表 key 中的域 field 的值设为 value
HGET key field //返回哈希表 key 中给定域 field 的值
HGETALL key //返回哈希表 key 中,全部的域和值

HMSET key field value [field value ...] //同时将多个 field-value (域-值)对设置到哈希表 key 中
HMGET key field [field ...] //返回哈希表 key 中,一个或多个给定域的值

HLEN key //返回哈希表 key 中域的数量

使用场景:

存储用户信息、用户主页访问量、组合查询,商品信息等
在作单点登陆的时候,用这种数据结构存储用户信息,以cookieId做为key,设置30分钟为缓存过时时间,能很好的模拟出相似session的效果。


五、SortedSet(有序集合)(Zset)

经常使用命令: zadd,zrange,zrem,zcard
和set相比,sorted set增长了一个权重参数score,使得集合中的元素可以按score进行有序排列。
举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各类礼物排行榜,弹幕消息(能够理解为按消息维度的消息排行榜)等信息,适合使用Redis中的SortedSet结构进行存储。

ZADD key score member [[score member] [score member] ...] //将一个或多个 member 元素及其 score 值加入到有序集 key 当中
ZCARD key //返回有序集 key 的基数
ZRANGE key start stop [WITHSCORES] //返回有序集 key 中,指定区间内的成员
ZRANK key member //返回有序集 key 中成员 member 的排名

使用场景:

取TOP N操做
排行榜应用
在直播系统中,实时排行信息包含直播间在线用户列表,各类礼物排行榜,弹幕消息(能够理解为按消息维度的消息排行榜)等信息


Pub/Sub(发布/订阅)


Transaction(事务)

MULTI //标记一个事务块的开始。
EXEC //执行全部事务块内的命令。
DISCARD //取消事务,放弃执行事务块内的全部命令。
UNWATCH //取消 WATCH 命令对全部 key 的监视。
WATCH key [key ...] //监视一个(或多个) key ,若是在事务执行以前这个(或这些) key 被其余命令所改动,那么事务将被打断。

Redis(五):Redis事务

— The end —