咨询热线
咨询热线:
028-86052836
在线咨询
官方微信
Redis的应用场景
时间:2023-01-07 | 作者: | 浏览:757
  • Redis的应用场景
    时间:2023-01-07 | 作者: | 浏览:757

    先介绍一下Redis

    简介:REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的 key-value存储系统,是跨平台的非关系型数据库。

    Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的API。

    Redis通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

    优势

    1:速度快,因为数据存在于内存中,类似hashmap的优势就是查找和操作的时间复杂度都是o(1)

    2:支持丰富的数据类型,string、list、hash、set、zset

    3:支持事务,操作都是原子性的。

    4:丰富的特性:可用于缓存、消息,按key设置过期时间,过期自动删除

    应用场景

    1、缓存

    可以使用String类型

    例如:热点数据缓存(例如报表、热销商品),对象缓存、全页缓存、可以提升热点数据的访问数据。

    image1.png

    2、数据共享分布式

    String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享

    例如:分布式Session需要引入此依赖

    image2.png

    3、分布式锁

    String 类型setnx方法,只有不存在时才能添加成功,返回true

    image3.png

    将key 的值设为value ,当且仅当key不存在。

    若给定的 key已经存在,则SETNX不做任何动作。

    4、全局ID

    int类型,incrby,利用原子性

    image4.png

    如果是分库分表的场景,一次性拿一段。

    5、计数器

    int类型,incr方法

    例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库

    image5.png

    6、限流

    基于redis的数据结构zset

    zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以对指定键的值进行排序权重的设定,它应用排名模块比较多。

    我们可以将请求打造成一个zset数组,当每一次请求进来的时候,value保持唯一,可以用UUID生成,而score可以用当前时间戳表示,因为score我们可以用来计算当前时间戳之内有多少的请求数量。而zset数据结构也提供了range方法让我们可以很轻易的获取到2个时间戳内有多少请求。

    image6.png

    7、位统计

    String类型的bitcount(1.6.6的bitmap数据结构介绍)

    image7.png

    字符是以8位二进制存储的

    例如:在线用户统计,留存用户统计,支持按位与、按位或等等操作,计算出7天都在线的用户。

    8、购物车

    传统的购物车实现有很多种方式,如session,cookie,数据库等,如果用Redis相当于一个内存数据库,可以用来做缓存,存储数据等。

    类型用String 或hash。所有String可以做的hash都可以做。

    image8.png

    9、用户消息时间线

    list,双向链表,直接作为timeline就好了。插入有序。

    10、消息队列

    List提供了两个阻塞的弹出操作:blpop/brpop,可以设置超时时间。

    blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

    brpop:brpop key1 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

    上面的操作。其实就是java的阻塞队列。学习的东西越多。学习成本越低。

    队列:先进先除:rpush blpop,左头右尾,右边进入队列,左边出队列。

    栈:先进后出:rpush brpop。

    11、抽奖

    移除并返回集合中的一个随机元素。

    image9.png

    返回集合中一个或多个随机数。

    image10.png

    将所有的奖品通过SADD添加到SET集合中,然后通过随机命令获取对应的奖品即可。而且,抽奖一般是有时效性,正好可以配合redis的key的失效时间使用。使得抽奖功能很完美的解决。

    12、点赞、签到、打卡

    假如上面的微博ID是t1001,用户ID是u3001

    用 like:t1001 来维护 t1001 这条微博的所有点赞用户

    点赞了这条微博:sadd like:t1001 u3001

    取消点赞:srem like:t1001 u3001

    是否点赞:sismember like:t1001 u3001

    点赞的所有用户:smembers like:t1001

    点赞数:scard like:t1001

    相对于数据库简单很多

    13、商品标签

    使用tags:来给对象打标签,然后可以直接查找出来。

    image11.png

    14、商品筛选

    一个集合进行查找

    image12.png

    多个集合进行运算是按照顺序,一路算下去的结果

    SDIFF计算差集   

    SINTER 计算并集

    SUNION 计算交集

    15、用户关注、推荐模型

    实际上就是redis的交集,并集差集的使用交错

    举例:

    image13.png

    16、排行榜

    实现这个功能主要用到的 redis 数据类型是 redis 的有序集合 zset。zset 是 set 类型的一个扩展,比原有的类型多了一个顺序属性。此属性在每次插入数据时会自动调整顺序值,保证 value 值按照一定顺序连续排列。

    image14.png

    查看用户 e 的实际排名 (ZREVRANK 为降序,ZRANK 为升序)、实时分数。



    先介绍一下Redis

    简介:REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的 key-value存储系统,是跨平台的非关系型数据库。

    Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的API。

    Redis通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

    优势

    1:速度快,因为数据存在于内存中,类似hashmap的优势就是查找和操作的时间复杂度都是o(1)

    2:支持丰富的数据类型,string、list、hash、set、zset

    3:支持事务,操作都是原子性的。

    4:丰富的特性:可用于缓存、消息,按key设置过期时间,过期自动删除

    应用场景

    1、缓存

    可以使用String类型

    例如:热点数据缓存(例如报表、热销商品),对象缓存、全页缓存、可以提升热点数据的访问数据。

    image1.png

    2、数据共享分布式

    String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享

    例如:分布式Session需要引入此依赖

    image2.png

    3、分布式锁

    String 类型setnx方法,只有不存在时才能添加成功,返回true

    image3.png

    将key 的值设为value ,当且仅当key不存在。

    若给定的 key已经存在,则SETNX不做任何动作。

    4、全局ID

    int类型,incrby,利用原子性

    image4.png

    如果是分库分表的场景,一次性拿一段。

    5、计数器

    int类型,incr方法

    例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库

    image5.png

    6、限流

    基于redis的数据结构zset

    zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以对指定键的值进行排序权重的设定,它应用排名模块比较多。

    我们可以将请求打造成一个zset数组,当每一次请求进来的时候,value保持唯一,可以用UUID生成,而score可以用当前时间戳表示,因为score我们可以用来计算当前时间戳之内有多少的请求数量。而zset数据结构也提供了range方法让我们可以很轻易的获取到2个时间戳内有多少请求。

    image6.png

    7、位统计

    String类型的bitcount(1.6.6的bitmap数据结构介绍)

    image7.png

    字符是以8位二进制存储的

    例如:在线用户统计,留存用户统计,支持按位与、按位或等等操作,计算出7天都在线的用户。

    8、购物车

    传统的购物车实现有很多种方式,如session,cookie,数据库等,如果用Redis相当于一个内存数据库,可以用来做缓存,存储数据等。

    类型用String 或hash。所有String可以做的hash都可以做。

    image8.png

    9、用户消息时间线

    list,双向链表,直接作为timeline就好了。插入有序。

    10、消息队列

    List提供了两个阻塞的弹出操作:blpop/brpop,可以设置超时时间。

    blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

    brpop:brpop key1 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

    上面的操作。其实就是java的阻塞队列。学习的东西越多。学习成本越低。

    队列:先进先除:rpush blpop,左头右尾,右边进入队列,左边出队列。

    栈:先进后出:rpush brpop。

    11、抽奖

    移除并返回集合中的一个随机元素。

    image9.png

    返回集合中一个或多个随机数。

    image10.png

    将所有的奖品通过SADD添加到SET集合中,然后通过随机命令获取对应的奖品即可。而且,抽奖一般是有时效性,正好可以配合redis的key的失效时间使用。使得抽奖功能很完美的解决。

    12、点赞、签到、打卡

    假如上面的微博ID是t1001,用户ID是u3001

    用 like:t1001 来维护 t1001 这条微博的所有点赞用户

    点赞了这条微博:sadd like:t1001 u3001

    取消点赞:srem like:t1001 u3001

    是否点赞:sismember like:t1001 u3001

    点赞的所有用户:smembers like:t1001

    点赞数:scard like:t1001

    相对于数据库简单很多

    13、商品标签

    使用tags:来给对象打标签,然后可以直接查找出来。

    image11.png

    14、商品筛选

    一个集合进行查找

    image12.png

    多个集合进行运算是按照顺序,一路算下去的结果

    SDIFF计算差集   

    SINTER 计算并集

    SUNION 计算交集

    15、用户关注、推荐模型

    实际上就是redis的交集,并集差集的使用交错

    举例:

    image13.png

    16、排行榜

    实现这个功能主要用到的 redis 数据类型是 redis 的有序集合 zset。zset 是 set 类型的一个扩展,比原有的类型多了一个顺序属性。此属性在每次插入数据时会自动调整顺序值,保证 value 值按照一定顺序连续排列。

    image14.png

    查看用户 e 的实际排名 (ZREVRANK 为降序,ZRANK 为升序)、实时分数。



    分享到:
  • 下单热线: 028-86052836/ 18980549418
    我要和顾问聊聊
    友情链接:
    在线客服
    扫码关注我们
    18980549418
    业务咨询,我们欢迎您的来电!
    13320969483
    服务热线
    扫码关注我们
    重庆天健世纪科技有限公司是一家从事政府、企事业单位信息化系统研发、企业门户建设、移动客户端开发、电子商务运营、技术服务、互联网一站式营销的国家高新技术企业。
    业务咨询: 18980549418
    服务电话: 13320969483
    公司地址: 重庆市两江新区黄山大道中段 1 号
    关注我们
    在线客服
    Copyright© 2020 天健世纪. All Rights Reserved. 渝ICP备20003512号
    Copyright© 2020 天健世纪. All Rights Reserved.
    渝ICP备20003512号