这一篇文章主要介绍 Redis 的数据结构与应用场景
NOSQL 之 Redis
Redis 是一款由 key-value 存储的软件. 说起 NOSQL, 有文档型, 键值型, 列型存储, 图形数据库. 其中, 在简单的读写性能来说, 键值型是最快的.
Redis 作为目前市面上使用最多的键值型数据存储软件, 内置了多种类型的数据结构, 并且提供了高可用解决方案, 使用方便快捷. 市面上有很多语言的库可以调用 Redis 服务器.
Redis 的数据结构类型
Redis 有很多种数据结构, 包括 string,hash,list,set,sortset,hyperloglog,GEO. 这些数据结构都可以设置键值的存在时间.
string 介绍
string 是以一种纯字符串作为 value 的形式存在的. 也是这几种之中使用最多的数据结构. value 可以存储 JSON 格式, 数值型等.
string 使用场景
string 使用场景一般是存储简单的键值类型. 比如用户信息, 登录信息, 配置信息等. 还有一种用得比较多的是 string 的 incr/decr 操作, 即自减 / 自增操作. 调用它是原子性的, 无论调用多少次, 都一一计算成功. 例如需要增减库存的操作.
尽管 string 的 value 可以存储很大, 甚至 500 多 MB 的容量. 但是在性能上来说, 我们尽量存储 value 的值不要过 1MB.
hash 介绍
hash 是一个集合, 使用过 hash 的人都知道, hash 的读取性能都一样快. 在 Redis 中, hash 因为是一个集合, 所以有两层. 第一层是 key:hash 集合 value, 第二层是 hashkey:string value. 所以判断是否采用 hash 的时候可以参照有两层 key 的设计来做参考. 并且注意的是, 设置过期时间只能在第一层的 key 上面设置.
hash 使用场景
使用 hash, 一般是有那种需要两层 key 的应用场景, 也可以是'删除一个 key 可以删除所有内容'的场景. 例如一个商品有很多规格, 规格里面有不同的值.
上面的例子表示成下面的图:
如果需要删除商品时, 可以一次性删除'商品 id'的 key, 则商品里面的所有规格也会删除, 而不需要找到对应的规格再做处理. 如果查找商品 id 与规格 id1 的商品时, 则通过两个 key 查找即可. 或者查找所有商品的规格, 查找商品 id 即可.
需要注意的是, 经过测试, 在性能上来说一般 hash 里面的第二层 key, 不要超过 200 个为佳. 尽管 hash 里面的 key-value 能达到 500 多 MB 的存储容量.
list 介绍
list 是一个集合, 而在 Redis 中, list 的使用场景多种多样. 在 Redis 中, 插入 list 中的值, 只需要找到 list 的 key 即可, 而不需要像 hash 一样插入两层的 key.list 是一种有序的, 可重复的集合.
list 使用场景
list 可以使用左推, 左拉, 右推, 右拉的方式. 所以你可以使用 list 作为集合存储, 比如存储某宝商铺里面的所有商品.
也可以用作轻量级别的队列来使用. 左推左拉, 右推右拉.
需要注意的是尽管 Redis 可以使用推拉的队列模式, 但是一定要注意场景. 因为 Redis 的队列是一种轻量级别的, 没有队列重试, 队列重放机制. 消费完队列消息在 Redis 代表已经删除了.
消息队列之发布订阅模式
Redis 除了 list 的推拉队列模式之外, 还有一种是发布订阅的模式. 发布订阅模式有是 publish/subscribe 的命令. 与推拉队列模式不同之处在于, 订阅者可以订阅多个频道, 发布者可以向指定的频道或者所有频道发送消息.
之所以在上面的 list 中结束这种队列模式, 主要为了对比这两种的区别.
set 介绍
set 是一种无序的, 不能重复的集合. 并且在 Redis 中, 只有一个 key.
set 使用场景
如保存一些标签的名字. 标签的名字不可以重复, 顺序是可以无序的.
如下面:
需要注意的是使用 set 一定不要存储大量的数据. value 的值不宜过大, 并且集合数量不宜过大. 几百个集合的值, value 不超过 1MB 为佳.
sortset 介绍
sortset 在 Redis 中是有序的, 并且不能重复. 既有 list 的有序, 又有 set 的不可重复性.
sortset 使用场景
sortset 的使用场景一般是排行榜之类的场景.
sortset 需要注意的地方与上面的 set 一致.
hyperloglog 介绍
hyperloglog, 使用得不多. hyperloglog 从创建一开始存储 12KB 的容量.
hyperloglog 使用场景
一般用于统计使用, 例如统计页面 PV/UV 等数据.
GEO 介绍
GEO, 使用得也不多. 用于处理地理位置的信息.
GEO 使用场景
在 Redis 中, GEO 可以保存地理位置的信息, 并且可以计算地理位置的距离等. 场景就在于使用地理位置时, 并且需要计算, 快速的场景, 可使用.
可以关注本人的公众号, 多年经验的原创文章共享给大家.
来源: http://www.bubuko.com/infodetail-2907897.html