聊一聊Redis基本类型和使用场景

667次围观   0个点赞   1人评论

作者头像

zeal

1年前 发表于 技术专栏

聊一聊Redis基本类型和使用场景

667次围观   0个点赞   1人评论

作者头像

zeal

1年前 发表于 技术专栏

聊一聊 Redis 基本类型和使用场景

在如今分布式集群架构的互联网体系中,Redis 的应用越来越广泛,在很多场景下,Redis 都是我们性能提升的利器,下面就从 Redis 的基本类型,来结合一些实际使用场景,来换一个角度聊聊 Redis 都有哪些骚操作。

Redis 的五种基本类型

redis 有 5 种基本类型,分别是:

1.String : 字符串。2.Hash: 散列。3.List: 列表。4.Set:集合。5.Sorted Set(Zset): 有序集合。

Redis基本类型
Redis基本类型

String

简介

String 是 Redis 最基本的类型,一个 key 对应一个 value,value 其实不仅是 String,也可以是数字。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。

特性

可以包含任何数据,比如 jpg 图片或者序列化的对象,规定字符串的长度不得超过 512MB。Redis 的字符串有两种存储方式,在长度特别短时,使用 embstr 形势存储,而长度超过 44 字节时候,使用 raw 形势存储

场景

单值缓存

1.存储访问人数或阅读人数,如果人数增加,可以使用 (INCR key)。2.存储 token 也是常见情形。 (GET key)。3.分布式 session 存储。4.分布式系统 lock 实现,可以借助 (SETNX key)。5.分布式系统全局自增系列号(可以批量来提升性能)。

对象缓存

1.常见的情形是将一个对象格式化成 json 字符串,然后进行存储,比如存储当前用户对象。2.也可以将 List 转成 json 字符串,比如省市区,某些数据字典等。

Hash

简介

Redis hash 是一个键值(key => value)对集合。相当于 Java 语言里面的 HashMap。

特性

适合存储对象,并且可以像数据库中 update 一个属性一样只修改某一项属性值(Memcached 中需要取出整个字符串反序列化成对象修改完再序列化存回去)。

优点1.同类数据归类整合储存,方便数据管理。2.相比 string 操作消耗内存与 cpu 更小。3.相比 string 储存更节省空间。缺点1.过期功能不能使用在 field 上,只能用在 key 上 Redis 集群架构下不适合大规模使用。

场景

1.对象缓存,可以直接缓存当前用户。2.购物车模型,以用户 id 为 key,商品 id 为 field,商品数量为 value。
添加商品 ->hset cart:1001 10088 1
增加数量 ->hincrby cart:1001 10088 1
商品总数 ->hlen cart:1001
删除商品 ->hdel cart:1001 10088
获取购物车所有商品 -> hgetall cart:1001

List

简介

列表是简单的字符串列表,按照插入顺序排序。Redis 的列表相当于 Java 的 LinkedList。List 的结构底层实现不是一个简单的 LinkedList,而是快速链表(quicklist)

特性

你可以添加一个元素到列表的头部(左边)或者尾部(右边)。增删快,提供了操作某一段元素的 API。列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储 40 多亿)。

List操作
List操作

场景

常用数据结构

1.Stack(栈) = LPUSH + LPOP2.Queue(队列)= LPUSH + RPOP3.Blocking MQ(阻塞队列)= LPUSH + BRPOP

信息流

1.比如微博大 v 或者公众号发布新消息,用户获取信息流。2.各种发送消息,消息队列。

Set

简介

Set 是 string 类型的无序集合。相当于 Java 语言里面的 HashSet,内部的键值对是无须的、唯一的。

特性

集合是通过 hashtable 实现的,概念和数学中个的集合基本类似,可以交集,并集,差集等等,set 中的元素是没有顺序的。所以添加,删除,查找的复杂度都是 O(1)。

场景

抽奖模型

1.点击参与抽奖加入集合 SADD key {userlD}2.查看参与抽奖所有用户 SMEMBERS key3.抽取 count 名中奖者 SRANDMEMBER key [count] / SPOP key [count]

SRANDMEMBER key [count] //从集合 key 中选出 count 个元素,元素不从 key 中删除
SPOP key [count] //从集合 key 中选出 count 个元素,元素从 key 中删除

微信微博点赞,收藏,标签

1.点赞 SADD like:{消息ID} {用户ID}2.取消点赞 SREM like:{消息ID} {用户ID}3.检查用户是否点过赞 SISMEMBER like:{消息ID} {用户ID}4.获取点赞的用户列表 SMEMBERS like:{消息ID}5.获取点赞用户数 SCARD like:{消息ID}

集合操作

1.求三个集合的交集 SINTER set1 set2 set3 -> { c }2.求三个集合的并集 SUNION set1 set2 set3 -> { a,b,c,d,e }3.用 set1 减去 set2 和 set3 的并集 SDIFF set1 set2 set3 -> { a }

微博微信关注模型

1.我关注的人: subscribeSet-> {Jack Ma, Pony }2.Jay Chou 关注的人:jaySubscribeSet-> {Jack Ma, Mini }3.我和Jay Chou 的共同关注好友:SINTER subscribeSet jaySubscribeSet--> {Jack Ma}4.我可能认识的人: SDIFF jaySubscribeSet subscribeSet->{Mini}

筛选模型

1.SADD brand:huawei P402.SADD brand:xiaomi mi-103.SADD brand:iPhone iphone124.SADD os:android P40 mi-105.SADD cpu:brand:intel P40 mi-106.SADD ram:8G P40 mi-10 iphone12

按条件筛选 android&intel&8G SINTER os:android cpu:brand:intel ram:8G -> {P40,mi-10}

Sorted Set(Zset)

简介

和 set 一样也是 string 类型元素的集合,且不允许重复的成员。类似于 Java 的 SortedSet 和 HashMap 的结合体,和 Set 相比,Sorted Set 关联了一个 double 类型权重参数 score。

特性

数据插入集合时,已经进行天然排序

场景

排行榜

1.点击新闻 ZINCRBY hotNews:20190819 1 守护香港2.展示当日排行前十 ZREVRANGE hotNews:20190819 0 9 WITHSCORES3.七日搜索榜单计算 ZUNIONSTORE hotNews:20190813-20190819 7 hotNews:20190813 hotNews:20190814... hotNews:201908194.展示七日排行前十 ZREVRANGE hotNews:20190813-20190819 0 9 WITHSCORES


推荐阅读

Redis高可用架构系列(一)主从架构揭秘 Redis 的高性能Redis 的持久化原理


如果觉得文章对你有帮助,可以点个赞,转载请注名出处。

标签:
评论 (1)
在这里说点什么吧... (取消回复)
留下一个好听的昵称吧!
好听的昵称!
请输入正确的邮箱格式!
不错的邮箱!
评论内容不能为空!
理性发言,和谐讨论!