本文来说下Redis八种数据类型及应用场景介绍

文章目录

  • 概述
  • String
    • 介绍
    • 应用场景
  • Hash
    • 介绍
    • 应用场景
  • List
    • 介绍
    • 应用场景
  • Set
    • 介绍
    • 应用场景
  • ZSet
    • 介绍
    • 应用场景
  • BitMaps
    • 介绍
    • 应用场景
  • Hyperloglog
  • Geo
  • Streams
  • 应用场景总结

概述

Redis一共有几种数据类型?(注意是数据类型不是数据结构)

一共是八种,String、Hash、Set、List、Zset、Hyperloglog、Geo、Streams


String

介绍

最基本也是最常用的数据类型就是String。get和set命令就是String的操作命令,Redis的字符串被叫做二进制安全的字符串(Binary-safe strings)。

String可以存储三种类型,INT(整数)、float(单精度浮点数)、string(字符串)。


应用场景

缓存

String类型,这是最常用的,可以缓存一些热点数据,比如首页新闻,可以显著提升热点数据的访问速度,同时减轻DB压力

分布式数据共享

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

例如:分布式Session

<dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId>
</dependency>

分布式锁

参考 :https://blog.csdn.net/qq_31960623/article/details/116500690


全局ID

INT类型,INCRBY,利用原子性

incrby userid 1000

(分表分库的场景,一次性拿一段)


计数器

INT类型,INCR方法

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


限流

INT类型,INCR方法

以访问者的IP和其他信息作为key,访问一次增加一次计数,超过次数则返回false


Hash

介绍

现在有一张teacher表


假设我们还是通过String类型存储的话,存储的时候就要把 Teacher 实体类进行序列化,然后作为 value 值存储进去;修改的时候,也需要把 value 先取出来进行反序列化,比如把年龄更改为21岁,然后再序列化,再存进去,十分的繁琐,增加开销。

我们需要单独获取、修改一个值,这时我们可以通过key分层的方式来实现,如下表


但是这样 key 会很多,key 也很长,占用空间,有没有更好的办法,这时候就用到我们的 Hash 类型,如下两张表所示:



这样也便于集中管理,划分的粒度不同,可以按照实际场景,key 的过期时间,灵活度考虑选取哪一种存储方式

Hash用来存储多个无序的键值对,最大存储数量2^32-1(40亿左右)。

优点:

  • 把所有相关的值聚集到一个Key中,节省内存空间
  • 只使用一个Key,减少Key冲突
  • 当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU的消耗

缺点:

  • Field不能单独设置过期时间
  • 需要考虑数据量分布的问题(field非常多的时候,无法分布到多个节点)

应用场景

String可以做的事情,Hash都可以做。再补充一个场景,购物车:

key:用户id;field:商品id;value:商品数量

+1:hincr

-1:hdecr

删除:hincrby key field -1

全选:hgetall

商品数:hlen


List

介绍

存储有序的字符串(从左到右),元素可以重复,最大存储数量2^32-1(40亿左右)。

下面通过画图来演示一下入队列,出队列


应用场景

列表

例如用户的消息列表、网站的公告列表、活动列表、博客的文章列表、评论列表等,通过 LRANGE 取出一页,按顺序显示。


队列/栈

List还可以当做分布式环境的队列/栈使用。

队列:先进先出,rpush 和 blpop

栈:先进后出,rpush 和 brpop

这里介绍两个阻塞的弹出操作:blpop/brpop,可以设置超时时间(单位:秒)。

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

Set

介绍

Set 存储 String 类型的无序集合,最大存储数量 2^32-1(40亿左右)

如下图所示:


应用场景

抽奖

随机获取元素:spop myset

点赞、签到、打卡


我们以微博举例子,假设这条微博的ID是t1001,用户ID是u6001,

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

点赞了这条微博:sadd dianzan:t1001 u6001

取消点赞:srem dianzan:t1001 u6001

是否点赞:sismember dianzan:t1001 u6001

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

点赞数:scard dianzan:t1001

比关系型数据库简单了许多


商品标签

用 tags:i8001 来维护商品所有的标签


sadd tags:i8001 画面清晰细腻

sadd tags:i8001 真彩清晰显示屏

sadd tags:i8001 流畅至极


商品筛选


华为P40上线了,支持民族品牌,加到各个标签中去。

sadd brand:huawei p40

sadd os:android p40

sadd screensize:6.0-6.24 p40

买的时候筛选,牌子是华为,操作系统是安卓,屏幕大小在6.0-6.24之间的,取交集:
sinter brand:huawei os:android screensize:6.0-6.24


ZSet

介绍

sorted set 存储有序的元素。每个元素都有个 score,按照 score 从小到大排序。score 相同时,按照 key 的ASCII码排序。


应用场景

排行榜

今天是2021年6月14号,建一个 key 为 hotSearch:20210614 的 zset。
2021央视端午晚会这条新闻的id是n1234,每点击一下:zincrby hotSearch:20210614 1 n1234
获取热搜排行榜前十条:zrevrange hotSearch:20210614 0 10 withscores


BitMaps

介绍

BitMaps是在字符串类型上定义的位操作,一个字节由8个二进制位组成。如下图所示:

m的ASCII码是109,对应的二进制数据是0110 1101


应用场景

BITOP AND destkey key [key ...],对一个或多个key求逻辑并,并将结果保存到 destkey。
BITOP OR destkey key [key ...],对一个或多个key求逻辑或,并将结果保存到 destkey。
BITOP XOR destkey key [key ...],对一个或多个key求逻辑异或,并将结果保存到 destkey。
BITOP NOT destkey key,对给定key求逻辑非,并将结果保存到 destkey。

连续七天在线用户

setbit firstday 0 1 //设置第一天uid是0的用户登录
setbit firstday 1 0 //设置第一天uid是1的用户未登录
setbit firstday 2 1 //设置第一天uid是2的用户登录
...
setbit secondday 0 0 //设置第二天uid是0的用户未登录
setbit secondday 1 1 //设置第二天uid是1的用户登录
setbit secondday 2 1 //设置第二天uid是2的用户登录
... //以此类推

那么在算连续七天在线用户就是

BITOP AND 7_both_online_users firstday secondday thirdday fourthday
fifthday sixthday seventhday

还可以应用访问统计、在线用户统计等等。


Hyperloglog

Hyperloglog 提供了一种不太精确的基数统计方法,用来统计一个集合中不重复的元素个数,比如统计网站的UV,或者应用的日活、月活,存在一定的误差。

在 Redis 中实现的 Hyperloglog,只需要12k内存就能统计2^64个数据。

    public static void main(String[] args) {Jedis jedis = new Jedis("39.103.144.86", 6379);float size = 100000;for (int i = 0; i < size; i++) {jedis.pfadd("hll", "hll-" + i);}long total = jedis.pfcount("hll");System.out.println(String.format("统计个数: %s", total));System.out.println(String.format("正确率: %s", (total / size)));System.out.println(String.format("误差率: %s", 1 - (total / size)));jedis.close();}

Geo

现在有这样一个需求,获取半径1公里以内的门店,那么我们就要把门店的经纬度存起来,如果存在数据库的话,一个字段存经度,一个字段存维度,计算距离比较复杂。现在我们通过 Redis 的 Geo 存储十分方便。

# 存经纬度
geoadd location 121.445 31.213 shanghai
# 取经纬度
geopos location shanghai

可以增加地址位置信息、获取地址位置信息、计算两个位置的距离、获取指定范围内的地理位置集合等等。

    public static void main(String[] args) {Jedis jedis = new Jedis("39.103.144.86", 6379);Map<String, GeoCoordinate> geoMap = new HashMap<>();GeoCoordinate coordinate = new GeoCoordinate(121.445, 31.213);geoMap.put("shanghai", coordinate);jedis.geoadd("positions", geoMap);System.out.println(jedis.geopos("positions", "shanghai"));jedis.close();}

Streams

5.0推出的数据类型。支持多播的可持久化的消息队列,用于实现发布订阅功能,借鉴了Kafka的设计。


应用场景总结

缓存—提升热点数据的访问速度
共享数据—数据的存储和共享的问题
全局ID—分布式全局ID的生成方案(分库分表)
分布式锁—进程间共享数据的原子操作保证
在线用户统计和计数
队列、栈—跨进程的队列/栈
消息队列—异步解耦的消息机制
服务注册与发现—RPC通信机制的服务协调中心(Dubbo支持Redis)
购物车
新浪用户消息时间线
抽奖逻辑(礼物、转发)
点赞、签到、打卡
商品标签
用户(商品)关注(推荐)模型
电商产品筛选
排行榜

Redis八种数据类型及应用场景介绍相关推荐

  1. 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景

    作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...

  2. Redis五种数据类型及应用场景

    Redis五种数据类型及应用场景 MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样 ...

  3. redis五种数据类型的使用场景

    string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  4. redis五种数据类型的应用场景_Redis五种不同的数据类型

    一.redis集群测试环境搭建 参考文章:https://www.jianshu.com/p/0a2f8f80983a redis-cli -c -h 10.96.87.129 -p 7001注意:- ...

  5. Redis五种数据类型的应用场景

    redis可以用作数据库.缓存和消息中间件. 一.String(字符串)类型 String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类 常用使用场景: 1.缓存结构体信息 2 ...

  6. redis五种数据类型及使用场景

    Redis 数据类型 转载自https://blog.csdn.net/zzu_seu/article/details/106323114 五种类型与类比java的模型 string --> S ...

  7. redis五种数据类型已经使用场景

    String redis可以从链表的两端进行插入(pubsh)和弹出(pop)元素,充当队列或者栈 就是一个从左边存进去,一个从右边取出来,就是队列(一般不用做队列,因为不保证消息一定会消费) Lis ...

  8. Redis五种数据类型介绍

    概述 Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合.本文详细介绍这五种数据类型的使用方法.本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方 ...

  9. Redis的数据类型以及每种数据类型的使用场景

    人就是很奇怪的动物,很简单的问题往往大家都容易忽略,当我们在使用分布式缓存Redis的时候,一个最简单的问题往往被人忽略,Redis的数据类型以及每种数据类型的使用场景是什么? 是不是觉得这个问题很基 ...

最新文章

  1. 如何在ppt下面加入讲解内容_学术展示系列:学术PPT教程(下)内容 讲解
  2. java 类交互图_Java与UML交互图
  3. 雅虎与软银构和:拟出售雅虎日本35%股份
  4. 图论--二分图最大匹配(匈牙利算法)--模板
  5. php之快速入门学习-9(switch)
  6. 大数据思维是企业互联网化的思维内核
  7. 比国内贵3000元!小米11 Ultra将于5月11日登陆欧洲市场
  8. Gridview模板中提供的删除功能
  9. 比尔盖茨:十条“金口玉言”-- 世界不会在意你的自尊
  10. Spark读Hive分区表报错:Caused by: org.apache.hadoop.mapred.InvalidInputException: Input path does not exist
  11. 那个抗血栓机器人_美国DJO抗血栓压力袜
  12. IT名企面试:微软笔试题
  13. 计算机专业暑期三下乡活动方案,暑期三下乡活动方案
  14. LeetCode知识点总结 - 1179
  15. 二氯甲烷废气处理吸附工艺
  16. 简洁新颖风格Emlog模板程序源码
  17. 详谈外部H5页面跳转微信一键关注微信公众号的方案
  18. labuladong 公众号的使用方法
  19. 【TVM源码学习笔记】2.1 onnx算子转换
  20. c# .net core 微信、支付宝H5支付链接获取,支付回调方法,退款方法小计

热门文章

  1. 自己写的.Net(C#)代码×××
  2. C# 用Attribute实现AOP事务
  3. 阿里巴巴合伙人闻佳:创新背后的文化与组织
  4. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.4. 额外特性
  5. 二叉树的各种操作(转)
  6. 求助下 Ubuntu 15.10(64 位)下安装 pyspider 下的问题 - V2EX
  7. 《Oracle DBA工作笔记》第一章
  8. CentOS6.5与XP双系统安装
  9. Quartz的定时任务实现
  10. mysql 大数据量插入遇到瓶颈 可行性方案探究