系列文章目录

真正说透Redis五种数据结构
Redis持久化之RDB+AOF+混合持久化实战演练
Redis高可用之主从架构


文章目录

  • 系列文章目录
  • 前言
  • 一、5种基本数据结构
  • 二、字符串String
    • 2.1、常用操作
    • 2.2、应用场景
      • 2.2.1、单值缓存(最常用)
      • 2.2.2、对象缓存
      • 2.2.3、分布式锁
      • 2.2.4、计数器
  • 三、哈希hash
    • 3.1、常用操作
    • 3.2、应用场景
      • 3.2.1、对象缓存
      • 3.2.2、 电商购物车
  • 四、列表list
    • 4.1、常用操作
    • 4.2、应用场景
      • 4.2.1 微博和微信公号消息
  • 五、 集合set
    • 5.1 常用操作
    • 5.2 应用场景
      • 5.2.1 抽奖
      • 5.2.2 微博点赞,收藏,标签
      • 5.2.3 微博微信关注模型
      • 5.2.4 购物网站商品筛选
  • 六、有序集合sorted set
    • 6.1 常用操作
    • 6.2 应用场景
      • 6.2.1 微博热搜榜
  • 总结

前言

Redis作为缓存数据库,目前在市场上占有很大的使用率,大部分人在工作中都使用到其string格式的存储,对于剩下的数据结构却很少使用到,Redis 基本数据结构包含:字符串(string)、 散列(hash)、 列表(list)、 集合(set)、 有序集合(sorted set)五种。这五种数据结构在我们工作中不同的场景中经常使用到,面试过程中经常被问到,因此熟练掌握这5种基本数据结构的使用和应用场景是Redis知识最基础也是最重要的部分


一、5种基本数据结构

二、字符串String

2.1、常用操作

SET  key  value          //存入字符串键值对
MSET  key  value [key value ...]    //批量存储字符串键值对
SETNX  key  value       //存入一个不存在的字符串键值对
GET  key            //获取一个字符串键值
MGET  key  [key ...]        //批量获取字符串键值
DEL  key  [key ...]         //删除一个键
EXPIRE  key  seconds        //设置一个键的过期时间(秒)
INCR  key           //将key中储存的数字值加1
DECR  key           //将key中储存的数字值减1
INCRBY  key  increment      //将key所储存的值加上increment
DECRBY  key  decrement  //将key所储存的值减去decrement

2.2、应用场景

2.2.1、单值缓存(最常用)

2.2.2、对象缓存

将对象转为json存储

SET  user:1  value(json格式数据)

将对象的每个字段作为可以存储

MSET  user:1:name  zhuge   user:1:balance  1888

2.2.3、分布式锁

SETNX  product:10001  true       //返回1代表获取锁成功
SETNX  product:10001  true      //返回0代表获取锁失败
。。。执行业务操作
DEL  product:10001          //执行完业务释放锁SET product:10001 true  ex  10  nx //设置过期时间防止程序意外终止导致死锁


2.2.4、计数器

文章的阅读量、点赞量


分布式系统全局序列号,每个系统如果每次使用序号就从redis获取,影响性能,所以每个系统每次可以批量申请N个序号供当前系统使用,使用完毕后再继续获取,可以提升性能

三、哈希hash

3.1、常用操作

HSET  key  field  value          //存储一个哈希表key的键值
HSETNX  key  field  value       //存储一个不存在的哈希表key的键值
HMSET  key  field  value [field value ...]  //在一个哈希表key中存储多个键值对
HGET  key  field                //获取哈希表key对应的field键值
HMGET  key  field  [field ...]      //批量获取哈希表key中多个field键值
HDEL  key  field  [field ...]       //删除哈希表key中的field键值
HLEN  key               //返回哈希表key中field的数量
HGETALL  key                //返回哈希表key中所有的键值HINCRBY  key  field  increment      //为哈希表key中field键的值加上增量increment

3.2、应用场景

3.2.1、对象缓存


3.2.2、 电商购物车

以用户id为key, 商品id为field,商品数量为value,添加购物车操作

HSET cart:1  10001 2   //用户1:商品10001  数量2
HSET cart:1  10002 1   //用户1:商品10002  数量1
HINCRBY cart:1 10001 1 //用户1:商品10001 数量+1
HINCRBY cart:1 10001 -2 //用户1:商品10001 数量-2
HLEN cart:1  //获取用户1购物车商品数量
HGETALL cart:1  //获取用户1购物车商品以及数量
hdel cart:1 10001  //删除用户1的10001商品


优点
1)同类数据归类整合储存,方便数据管理
2)相比string操作消耗内存与cpu更小
3)相比string储存更节省空间
缺点
过期功能不能使用在field上,只能用在key上
Redis集群架构下不适合大规模使用(key相同的经过hash后只会落在其中一台机器上

四、列表list

4.1、常用操作

LPUSH  key  value [value ...]        //将一个或多个值value插入到key列表的表头(最左边)
RPUSH  key  value [value ...]       //将一个或多个值value插入到key列表的表尾(最右边)
LPOP  key           //移除并返回key列表的头元素
RPOP  key           //移除并返回key列表的尾元素
LRANGE  key  start  stop        //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
LINSERT key  BEFORE|AFTER pivot element  // 在元素element前后插入pivot
LREM key count element  //根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素 count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT
//count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
//count = 0 : 移除表中所有与 VALUE 相等的值。
BLPOP  key  [key ...]  timeout  //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout  //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待 timeout秒,如果timeout=0,一直阻塞等待

4.2、应用场景

Stack(栈FILO) = LPUSH + LPOP
Queue(队列FIFO)= LPUSH + RPOP
Blocking MQ(阻塞队列)= LPUSH + BRPOP

4.2.1 微博和微信公号消息


如上图公众号:我订阅了阿里云云栖号(id10001)、新华网(id10002)、infoQ(id10003)等
1、首先在msg:1列表中增加10001、10002、10003 ,以及各个用户对应的消息

LPUSH sub:1 10001 10002 10003LPUSH msg:10001 1 2 3
LPUSH msg:10002 4 5 6
LPUSH msg:10003 8 9

2、此时10002发送一条消息 id : 11 ,首先在我订阅的集合中移除10002,然后在最前面加入10002,然后在msg中加入11

LREM sub:1 0 10002
LPUSH sub:1 10002
LPUSH msg:10002 11

五、 集合set

5.1 常用操作

SADD  key  member  [member ...]          //往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM  key  member  [member ...]         //从集合key中删除元素
SMEMBERS  key                   //获取集合key中所有元素
SCARD  key                  //获取集合key的元素个数
SISMEMBER  key  member          //判断member元素是否存在于集合key中
SRANDMEMBER  key  [count]           //从集合key中选出count个元素,元素不从key中删除
SPOP  key  [count]              //从集合key中选出count个元素,元素从key中删除SINTER  key  [key ...]              //交集运算
SINTERSTORE  destination  key  [key ..]     //将交集结果存入新集合destination中
SUNION  key  [key ..]               //并集运算
SUNIONSTORE  destination  key  [key ...]        //将并集结果存入新集合destination中
SDIFF  key  [key ...]               //差集运算
SDIFFSTORE  destination  key  [key ...]     //将差集结果存入新集合destination中

5.2 应用场景

5.2.1 抽奖

  1. 参与抽奖
SADD luck:1001 100001 //将用户100001 加入商品1001 的参与池子中
  1. 查看参与抽奖所有用户
SMEMBERS luck:1001
  1. 抽取1名中奖者
SPOP luck:1001 1

5.2.2 微博点赞,收藏,标签

  • 点赞
SADD like:1 1001
  • 取消点赞
SREM like:1 1001
  • 检查用户是否点过赞
SISMEMBER  like:1 1001

5.2.3 微博微信关注模型

刘昊然关注:张杰、刘涛、王宝强

SADD follow:lhr zj lt wbq

张杰关注:刘昊然、刘涛、王宝强、王泷正、谢娜、胡歌

SADD follow:zj  lhr lt wbq wlz xl hg

刘涛关注:刘昊然、张杰、陈奕迅、许嵩

SADD follow:lt  lhr zj cyx xs

模型1:共同关注
刘昊然和张杰关注的人

SINTER follow:lhr follow:zj


模型2:我关注的人中也有关注
刘昊然关注的人也在关注胡歌

SISMEMBER follow:zj hg
SISMEMBER follow:lt hg
SISMEMBER follow:wbq hg

模型2:可能感兴趣的人
刘昊然访问张杰主页,会推荐感兴趣的人,张杰关注的人去且不在刘昊然关注中可以推荐

SDIFF follow:zj  follow:lhr


5.2.4 购物网站商品筛选

SADD  brand:huawei  P30  //华为品牌集合中  p30
SADD  brand:xiaomi  mi-6X //小米品牌集合中  mi-6X
SADD  brand:iPhone iphone8 //苹果品牌集合中  iphone8
SADD os:android  P30  mi-6X  //安卓系统集合中  P30  mi-6X
SADD cpu:brand:intel  P30  mi-6X //cpu 英特尔集合中  P30  mi-6X
SADD ram:8G  P30  mi-6X  iphone8 //8G内存集合中 P30  mi-6X  iphone8

查找内存为8G,英特尔CPU和安卓系统的手机:

SINTER  os:android  cpu:brand:intel  ram:8G

六、有序集合sorted set

6.1 常用操作

ZADD key score member [[score member]…]  //往有序集合key中加入带分值元素
ZREM key member [member …]      //从有序集合key中删除元素
ZSCORE key member           //返回有序集合key中元素member的分值
ZINCRBY key increment member        //为有序集合key中元素member的分值加上increment
ZCARD key               //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES]  //正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]   //倒序获取有序集合key从start下标到stop下标的元素ZUNIONSTORE destkey numkeys key [key ...]    //并集计算
ZINTERSTORE destkey numkeys key [key …] //交集计算

6.2 应用场景

6.2.1 微博热搜榜

以每天热搜新闻为一个集合,当天当一个用户点击一个话题后,分值+1
点击新闻

ZINCRBY hotnews:20220201 1 dawmll //2022-02-01 点击冬奥我们来了+1
ZINCRBY hotnews:20220201 1 gtljp //2022-02-01 点击高亭宇金牌+1
  • 展示当日排行前十
ZREVRANGE hotnews:20220201 0 10 WITHSCORES [WITHSCORES]
  • 2日搜索榜单计算
ZUNIONSTORE newhots 2 hotnews:20220201 hotnews:20220202 //将2个几个中的相同的值的分数相加,将结果放到newhots 中

  • 展示2日排行前十
ZREVRANGE newhots 0 10 //从上面统计的新的集合中取出前10


总结

通过本文,大家对Redis五种数据结构有了更多的了解,包括在实际场景中的使用,希望能帮助大家解决实际工作中的问题,后续也会更新Redis架构相关的文章。 如有帮助,感谢关注

真正说透Redis五种数据结构相关推荐

  1. Redis五种数据结构

    对redis来说,所有的key(键)都是字符串,所谓的5种数据结构是指针对value而言 1.Redis五种数据结构如下: 数据结构类型 说明 使用场景 常用方法 其他链接 String字符串类型 1 ...

  2. Redis五种数据结构应用场景

    文章目录 前言 二.字符串String 2.1.常用操作 2.2.应用场景 2.2.1.单值缓存(最常用) 2.2.2.对象缓存 2.2.3.分布式锁 2.2.4.计数器 三.哈希hash 3.1.常 ...

  3. 字符动图_图解redis五种数据结构底层实现(动图哦)

    redis有五种基本数据结构:字符串.hash.set.zset.list.但是你知道构成这五种结构的底层数据结构是怎样的吗?今天我们来花费五分钟的时间了解一下.(目前redis版本为3.0.6) 动 ...

  4. 硬核资源!Redis 五种数据结构以及三种高级数据结构解析(详解)

    上一篇分享的是<深入理解JVM>,这篇给大家分享<Redis 五种数据结构以及三种高级数据结构解析>. 前言 在 Redis 最重要最基础就属 它丰富的数据结构了,Redis ...

  5. Redis五种数据结构及其使用场景

    Redis五种数据结构及其使用场景 先有个概念,redis 数据库其实就是一个大的 map,它容纳了所有的 key, key 都是 string 类型,而 value 则有 string, list, ...

  6. 图解redis五种数据结构底层实现

    redis有五种基本数据结构:字符串.hash.set.zset.list.但是你知道构成这五种结构的底层数据结构是怎样的吗?今天我们来花费五分钟的时间了解一下.(目前redis版本为3.0.6) 动 ...

  7. 万字长文的Redis五种数据结构详解(理论+实战),建议收藏。

    本文脑图 前言 Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. 关于Redis的文章之前也写过三篇,阅读量和读者的反映都还 ...

  8. Redis五种数据结构详解

    Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. Redis的五种数据结构包括以下五种: String:字符串类型 List ...

  9. 浅谈Redis五种数据结构的底层原理

    概念 Redis作为一个开源的用C编写的非关系型数据库,基于优秀的CRUD效率,常用于软件系统的缓存,其本身提供了以下五种数据格式: string:字符串 list:列表 hash:散列表 set:无 ...

最新文章

  1. 3、python中的字符串
  2. java 之 异常
  3. 深入理解JVM(6)——类加载器
  4. 聊聊编程那些破事-0.Prehistory
  5. BootStrap学习(1)
  6. redis 的线程模型
  7. 【记录】帮同学做的一个函数拟合
  8. GX Works2 安装详细过程
  9. 人均瑞数系列,瑞数 4 代 JS 逆向分析
  10. 工信部官宣:5G商用牌照即将发放!
  11. 天然气压缩因子计算软件_为什么测量天然气选择气体涡轮流量计?
  12. art-高光贴图制作
  13. 自动化运维的5大好处
  14. 老旧小区改造浪潮下的智慧安防市场发展机遇
  15. 杂谈技术·油猴脚本的功能实现
  16. Unity相机设置CullingMask
  17. 【Python基础】第八篇 | 容器之列表的使用
  18. butter滤波器是iir吗_学习随笔之IIR滤波器与FIR滤波器
  19. 1、ABPZero系列教程之拼多多卖家工具 前言
  20. 我了解到的新知识之----遇到路由器DNS被篡改我该怎么办?

热门文章

  1. 【领域泛化论文阅读】Generalizing to Unseen Domains: A Survey on Domain Generalization
  2. python tushare日线行情、每日指标、财务指标数据合并
  3. 第十四章 使用SQL Shell界面(一)
  4. Windows找不到文件无法卸载怎么解决?
  5. 镂空文字、类歌词进度显示文字
  6. Office2016登录的账户名和microsoft账户名不照应的解决方法
  7. 记录一次糟心的appium启动篇
  8. shell------免交互
  9. Mac通过aapt获取apk文件的基本信息
  10. Android 仿通话来电界面