Redis专题学习(一)Redis核心数据结构实战与高性能原理剖析

news2024/11/25 15:43:17

redis是key-value的存储格式,

key是string类型的,

value可以有五种基本的数据结构:string、hash、list、set、zset

来看看 这5中基本数据类型的基本使用和应用

一.字符串string

string是最常见和最基本的数据结构

基本使用:

(一).字符串常用的操作:

set key value  // 存入字符串键值对

mset key value [key value ...]  // 批量存入字符串键值对

get key //获取一个字符串的键值

mget key [key ... ]  //批量获取字符串的键值

setnx key value  // 存入一个不存在的字符串键值对  很重要很重要 用于分布式锁 存入成功返回1 失败返回0

del key [key...] 删除一个(多个)键

expire key senconds  //设置一个键的过期时间   单位为秒

也可以综合性的写法:set strkey 2222 ex 20 nx  // 当strkey 键不存在的时候,设置键为strkey 值为222的string键值对,过期时间是20s  

(二).原子加减

incr key   //将key中存储的数值加1 

decr key  //将key中存储的数值减1 

ps:如果key对应的值不是数值,那么进行incr和decr会报错

 incrby key   increment  //将key中存储的数值加increment   

decrby key decrement //将key中存储的数值减decrement 

(三).应用

1.单值缓存

   set key value

   get key

2.对象缓存

    1)mset user:1:username enjoy  user:1:passwd 123

          mget user:1:username user:1:passwd

    2)set user:1 json字符串    注意:json字符串不要过长,过长会引起大key问题

3.分布式锁

   setnx product:1001 true // 返回1是获取锁成功  

   setnx product:1001 true // 返回0是获取锁失败

   ...//一些逻辑操作

  del product:1001 //删除锁

  或者直接使用 set product:1001 true ex 30 nx 这种综合性的写法 防止意外中止导致的死锁

4.计数器

   计算文章的阅读量:incr article:1001:readCount 

                                   get article:1001:readCount 

5.Web集群session共享

6.分布式系统全局序列号

    incrby orderId 10000

二.哈希Hash 

(一).哈希常用的操作:

 hset key field value   //设置哈希表key的一个键值

 hmset key field value [field value ...]   //设置哈希表key的多个键值

 hget key field //获得哈希表key的键值

 hmget key field [field ...]  //获得哈希表key的多个键值

 hsetnx key field value //存储一个不存在的哈希表key的键值

 hdel key field [field1... ]//删除哈希表key中的field键值

 hlen key //返回哈希表key中field的数量

 hgetall key  //返回哈希表key中所有的键值

 hincrby key field increment  //为哈希表key中field键的值加上增量increment

ps:Hash的缺点:过期功能不能用在field上,只能用在key上

                           集群架构下不适合大规模使用

如果一个对象的字段太多,可能会引起大key问题(又是大key问题)                           

(二).哈希应用:

1对象缓存 2电商购物车

电商购物车:

a 添加商品:hset cart:1001 10086 1  (cart:1001是键 1001指的是userID 10086指的是商品的id 1是商品数量)

 b 增加商品数量:hincrby cart:1001  10086 2 //购物车中商品10086的数量加2

c 删除商品:hdel cart:1001  10086 

d 商品总数:hlen cart:1001

e 全部商品:hgetall cart:1001

 ps:如果忘了命令,也可以使用help @hash来查看对应的命令,如下:

 三.列表List

(一).列表常用的操作:

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指定

BLPOP  key  [key ...]  timeout  //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待  timeout秒,如果timeout=0,一直阻塞等待

BRPOP  key  [key ...]  timeout   //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待  timeout秒,如果timeout=0,一直阻塞等待(注意:timeout   不是说默认就为0了,得需要显式的写出来)

 (二).列表的应用:

   1 .当我们在分布式架构中无法实现共享的一个数据结构(栈,队列,阻塞队列)的时候  ,就可以用redis中的list

栈stack:lpush+lpop(先进后出)

队列(queue):lpush + rpop (先进先出)

阻塞队列(BlockingQueue):lpush + brpop (先进先出)

2.微信朋友圈、公众号等的消息流(有时间线的消息流):查看最近的消息

比如用户1001关注了大V车哥说车、小林Coding的公众号

当车哥说车发了一个,消息的id是21

lpush msg:1001 21

当车哥说车发了一个消息,消息的id是22

lpush msg:1001 22

那么用户在查看公众号的时候:

lrange msg:1001 0 2

 四.集合Set

(一).集合常用的操作:

    sadd key member [members...]   //往集合key中添加元素

    smembers key  //查看集合key中的所有元素

    srem key member [member ...]    //删除集合key中的元素

    scard key //查看集合key中的元素个数

   sismember key member //查看member是不是集合key中的元素,不是返回0 ,是则返回1

 srandmember key [count]  //从集合key中返回count(count默认 为1)个元素,元素并不从集合中删除

 spop key  [count] //从集合key中返回count(count默认 为1)个元素,元素从集合中删除

应用:

  1.微信小程序抽奖:

  点击“参加抽奖”  sadd act:1001 userId_01

  查看参加抽奖的人 : smembers act:1001 

  进行抽奖(3个人可以抽到奖品):spop act:1001 3 或者srandmember act:1001 3

 2.微信的点赞收藏

  点赞:sadd like:{消息ID} userId

  取消点赞: srem like:{消息ID} userId

  查看用户是否点过赞: sismember like:{消息ID} userId

  获取点赞列表 :smembers like:{消息ID}

  获取点赞用户数:scard like:{消息ID}

(二)Set运算操作

SINTER  key  [key ...]   //交集运算

SINTERSTORE  destination  key  [key ..]  //将交集结果存入新集合destination中

SUNION  key  [key ..]   //并集运算

SUNIONSTORE  destination  key  [key ...]  //将并集结果存入新集合destination中

SDIFF  key  [key ...]   //差集运算

SDIFFSTORE  destination  key  [key ...]  //将差集结果存入新集合destination中

说明:

SINTER set1 set2 set3 -> { c }  交集

SUNION set1 set2 set3 -> { a,b,c,d,e } 并集

SDIFF set1 set2 set3 -> { a } 差集:以set1为主,相当于set1减去set2和set3的并集

 应用:微博微信的关注模型、集合操作电商平台筛选商品等等

比如我关注了甄嬛,安陵容,浣碧

MeSet:{zhenhuan,anlingrong, huanbi}

皇上关注的人:皇后,华妃,甄嬛

HuangshangSet:{huanghou,huafei,zhenhuan}

当我进入了皇上的主页的时候:

会显示:

我和皇上的共同关注:sinter MeSet HuangshangSet ->{zhenhuan}

我关注的人也关注他(皇上):sismember zhenhuanSet Huangshang

                                                  sismember anlingrongSet Huangshang

                                                  sismember huanbiSet Huangshang

我可能认识的人(简单的关注推荐):sdiff HuangshangSet  MeSet 

 五.有序集合ZSet

可以使用help@sorted_set帮助来查看该命令的使用

127.0.0.1:6379> help @sorted_set
 
 BZPOPMAX key [key ...] timeout
  summary: Remove and return the member with the highest score from one or more sorted sets, or block until one is available
  since: 5.0.0

  BZPOPMIN key [key ...] timeout
  summary: Remove and return the member with the lowest score from one or more sorted sets, or block until one is available
  since: 5.0.0

  ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
  summary: Add one or more members to a sorted set, or update its score if it already exists
  since: 1.2.0

  ZCARD key
  summary: Get the number of members in a sorted set
  since: 1.2.0

  ZCOUNT key min max
  summary: Count the members in a sorted set with scores within the given values
  since: 2.0.0

  ZDIFF numkeys key [key ...] [WITHSCORES]
  summary: Subtract multiple sorted sets
  since: 6.2.0

  ZDIFFSTORE destination numkeys key [key ...]
  summary: Subtract multiple sorted sets and store the resulting sorted set in a new key
  since: 6.2.0

  ZINCRBY key increment member
  summary: Increment the score of a member in a sorted set
  since: 1.2.0

  ZINTER numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
  summary: Intersect multiple sorted sets
  since: 6.2.0

  ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  summary: Intersect multiple sorted sets and store the resulting sorted set in a new key
  since: 2.0.0

  ZLEXCOUNT key min max
  summary: Count the number of members in a sorted set between a given lexicographical range
  since: 2.8.9

  ZMSCORE key member [member ...]
  summary: Get the score associated with the given members in a sorted set
  since: 6.2.0

  ZPOPMAX key [count]
  summary: Remove and return members with the highest scores in a sorted set
  since: 5.0.0

  ZPOPMIN key [count]
  summary: Remove and return members with the lowest scores in a sorted set
  since: 5.0.0

  ZRANDMEMBER key [count [WITHSCORES]]
  summary: Get one or multiple random elements from a sorted set
  since: 6.2.0

  ZRANGE key min max [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
  summary: Return a range of members in a sorted set
  since: 1.2.0

  ZRANGEBYLEX key min max [LIMIT offset count]
  summary: Return a range of members in a sorted set, by lexicographical range
  since: 2.8.9

  ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
  summary: Return a range of members in a sorted set, by score
  since: 1.0.5

  ZRANGESTORE dst src min max [BYSCORE|BYLEX] [REV] [LIMIT offset count]
  summary: Store a range of members from sorted set into another key
  since: 6.2.0

  ZRANK key member
  summary: Determine the index of a member in a sorted set
  since: 2.0.0

  ZREM key member [member ...]
  summary: Remove one or more members from a sorted set
  since: 1.2.0

  ZREMRANGEBYLEX key min max
  summary: Remove all members in a sorted set between the given lexicographical range
  since: 2.8.9

  ZREMRANGEBYRANK key start stop
  summary: Remove all members in a sorted set within the given indexes
  since: 2.0.0

  ZREMRANGEBYSCORE key min max
  summary: Remove all members in a sorted set within the given scores
  since: 1.2.0

  ZREVRANGE key start stop [WITHSCORES]
  summary: Return a range of members in a sorted set, by index, with scores ordered from high to low
  since: 1.2.0

  ZREVRANGEBYLEX key max min [LIMIT offset count]
  summary: Return a range of members in a sorted set, by lexicographical range, ordered from higher to lower strings.
  since: 2.8.9

  ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
  summary: Return a range of members in a sorted set, by score, with scores ordered from high to low
  since: 2.2.0

  ZREVRANK key member
  summary: Determine the index of a member in a sorted set, with scores ordered from high to low
  since: 2.0.0

  ZSCAN key cursor [MATCH pattern] [COUNT count]
  summary: Incrementally iterate sorted sets elements and associated scores
  since: 2.8.0

  ZSCORE key member
  summary: Get the score associated with the given member in a sorted set
  since: 1.2.0

  ZUNION numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
  summary: Add multiple sorted sets
  since: 6.2.0

  ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
  summary: Add multiple sorted sets and store the resulting sorted set in a new key
  since: 2.0.0

常用:

zadd key score member [score member ...] 

ZRANGE key 0 -1 WITHSCORES //显示所有成员及其 score 值

zincrby key increment member //为有序集 key 的成员 member 的 score 值加上增量 increment 

         

 应用1:我在抖音直播间中参数抽奖,我和主播互动多或者我点赞点的多或者给直播间刷礼物较多都会有更大的中奖概率,用set的话就不能实现这样的功能,但是zset可以

   点击参加抽奖活动 zadd  act:{直播间号} 0 userId 

   和主播互动一次:zincrby act:{直播间号} 1 userId 

  给主播刷礼物:zincrby act:{直播间号} 10 userId 

  当到了时间抽奖的时候用:zpopmax act:{直播间号} 1

应用2:排行榜

--------------------高性能原理剖析---------------------

一. redis为什么这么快?

1.redis是基于内存的操作,如果把redis做了强持久化的话,性能会大大下降。

2.redis采用了IO多路复用的方式。

3.单线程,省去了上下文切换的时间。

4.底层的丰富高效的数据存储结构。

    说说底层的数据存储:底层是全局哈希表

      key是string类型的,但是value值的类型是很多的。

      为什么有些+1就可以,有些字符+1就报错呢?

     type key

     object encoding key 

      两个命令是查看底层的存储数据类型

      

ps:redis是单线程的吗?不是的,单线程仅仅指的是读取网络IO与执行redis命令的线程是单线程的。

可以用redis下的src中的redis-benchmark进行压测

 

 代表我的这台机器的redis的get的qps是33898.30/s

二.查看最大的连接数 maxclients 默认是10000

这个数值可以在redis.conf中修改

三.redis中的一些高阶命令:

keys * 

keys * 是扫描全库的,如果redis中key很多,那么这个命令会很慢的

如果keys*执行需要几秒钟的话,那么后面排队的命令都需要进行阻塞,这样是不可以的,尽量少用或者不用  有个命令叫做scan,这个时候就派上用场了,刚开始的时候cursor需要是0

 

 count 3 这个代表的是大概返回是3条数据,不一定是3条数据,像上图中返回的是四条数据

第二次扫描的cursor应该是上一次返回的数值,直到返回的游标是0,那么就相当于所有的遍历都结束了。

但是scan并非完美,可能扫描的过程中有增删改,就会导致有些数据少查或者是多查,实际开发中一定要考虑到对应的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode 501. 二叉搜索树中的众数

2023.7.10 这道题我的思路是适用于任意二叉树的思路&#xff1a; 先用任意一个遍历方法将节点保存至map<int,int>中&#xff0c;key为节点值&#xff0c;value为频率。由于map没有对value&#xff08;频率&#xff09;排序的方法&#xff0c;所以将map的键值对转移至vec…

TCP协议三次握手的抓包模拟

三次握手(Three-way Handshake)&#xff0c;是指建立一个 TCP 连接时&#xff0c;需要客户端和服务器总共发送3个包。 第一次握手([SYN], Seq x) 客户端发送一个SYN标记的包&#xff0c;Seq初始序列号x&#xff0c;发送完成后客户端进入SYN_SEND状态。 第二次握手([SYN,ACK]…

一个面试知识点: CreateThread() 与 _beginthread() 的区别

如题: 像现在有c11, 加上不写原生winApi 很久没有用这俩玩意了, 真的忘记了, 被问到这个的时候, 我还清晰记得之前在WPS里的时候专门了解这个 CreateThread的简单用法贴下面了 c win32API 【CreateThread】创建线程 其实就简单的记住 1._beginthread 底层还是 调用的 Creat…

calltree的安装与使用

目录 0 calltree 和 graphviz的关系 1 graphviz的安装很简单 : 2 有难的是calltree的安装,需要改一下代码. Doxygen的使用 参考 这个人的笔记都挺好的, 没事多看看 0 calltree 和 graphviz的关系 要想绘制函数调用图的话,需要用到2个工具, calltree 和 graphviz. calltr…

【记录】Yolov5官网下载避坑记录

写在前面&#xff1a;刚开始接触Yolov5时&#xff0c;对一些基础的概念很模糊&#xff0c;在官网下载也不知道该下载什么版本好。后续更是遇到了一些奇奇怪怪的坑。在此记录一下最初的研究过程&#xff0c;顺带填一下yolov5避坑专栏后面的坑。 目录 一、Yolov5误区 二、官网…

UVM中sequence机制-数据产生及传递机制

一 基础知识 参考 UVM——sequence机制(数据激励的产生、配置方式)_uvm激励_SD.ZHAI的博客-CSDN博客https://blog.csdn.net/weixin_46022434/article/details/105600081 1.1 sequence执行流程 1.2 sequence的启动方式 1.3 sequence数据产生--body()

TortoiseGit 入门指南03:将修改提交到版本库

你现在应该已经有了一个仓库&#xff0c;在工作过程中会对项目做一些修改&#xff0c;比如添加代码、修复错误等等&#xff0c;你将不定时的将这些更改 提交&#xff08;commit&#xff09;到代码仓库。 术语 提交 是将 暂存区 内容放入 版本库 。这个过程涉及到 Git 的一些基…

如何对你的代码进行内存消耗分析

对象生命周期 下面两种创建对象的语句有什么不同呢? 对于 Object myObject;,该对象被创建在栈上,它的特点就是脱离作用域后会自动销毁。而对于 new Object(),它会在堆上动态创建一个对象,它的特点就是即使脱离作用域,该对象也会一直存在,除非你手动释放(delete)它,否…

Layui 简单介绍及入门

目录 一.Layui &#xff08;国产品牌&#xff09; 1.1 Layui是什么 二.比较layui和easyui&#xff0c;bootstrap的区别 2.1 layui和bootstrap的对比 2.2 layui和easyui对比 三.Layui入门 四.案例 一.Layui &#xff08;国产品牌&#xff09; 1.1 Layui是什么 用我的话来…

峟思科普:水库坝体的裂缝防治措施有哪些

水库大坝的建设与施工是一项庞大的系统工程&#xff0c;它包括设计、施工、监理等各个环节。而裂缝问题是整个工程中最常见的问题之一&#xff0c;大坝工程中出现裂缝是一件很严重的事&#xff0c;不仅影响大坝的使用寿命&#xff0c;而且严重影响水库工程的整体效益。坝体裂缝…

让GPT来聊聊目前软件测试行业的就业形式

最近两个月一直处于忙碌状态&#xff1a;跳槽、转行、学习新的编程语言&#xff08;Python Golang&#xff09;、赶工期、面试招人……也正是这一些列的经历&#xff0c;对目前的就业形势和软件从业人员的发展有了一些新的观察和思考&#xff0c;在这篇文章分享给大家。 整体…

亚马逊云科技143项安全标准与合规性认证,帮助企业满足安全合规要求

在亚马逊云科技&#xff0c;为满足客户不断变化的需求&#xff0c;亚马逊云科技持续创新与迭代&#xff0c;设计的服务能帮助客户满足最严格的安全和合规性要求。针对安全相关工作&#xff0c;亚马逊云科技服务团队与Amazon Security Guardians云守护者项目密切配合&#xff0c…

Jira Tempo :如何创建 Dynamic Dropdown 类型的 Work Attributes?

官方示例&#xff1a; Jira Tempo 可以创建以下类型的工作属性&#xff08;Work Attributes&#xff09;: 其中&#xff0c;Dynamic Dropdown 支持外部接口&#xff0c;可以自己提供一个接口连接&#xff0c;如下&#xff1a; 官方示例中&#xff0c;给了一个 php 版本的示例…

UVM学习笔记--寄存器模型 Register Model

1.寄存器模型( Register model )简介 UVM的寄存器模型是一组高级抽象的类&#xff0c;用来对DUT中具有地址映射的寄存器和存储器进行建模。它非常贴切的反映DUT中寄存器的各种特性&#xff0c;可以产生激励作用于DUT并进行寄存器功能检查。通过UVM的寄存器模型&#xf…

通信算法之176: 基于Matlab的OFDM通信系统关键基带算法设计6-流程

一. 接收算法流程 粗同步&#xff08;分组检测&#xff09; 载波同步&#xff08;精细频偏估计&#xff09; 精同步&#xff08;OFDM起始&#xff0c;符号同步&#xff09; 1.4 信道估计&#xff08;长序列&#xff09; 1.5 信道均衡&#xff08;所有数据OFDM符号&#xff…

(黑客)自学路线

一、什么是网络安全&#xff08;黑客&#xff09; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领…

基于SpringBoot+vue的准妈妈孕期交流平台设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【工业机器人】用于轨迹规划和执行器分析的机械手和移动机器人模型(MatlabSimulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32——使用cubemx和keil点亮第一个灯

一、环境 cubemx安装和搭建见博文 链接: STM32CubeMX安装 keil安装见软件安装管家&#xff0c;注意要是MDK版 二、cubemx操作 1.打开cubemx 2.选择ACCESS TO MCU SLCTOR,创建一个新的工程。 3.选择合适的芯片型号 具体的开发板芯片型号根据自己的板子来。我的是STMF429IG 4…

AT32F435/F437 QSPI驱动华邦/恒烁 NAND FLASH(W25N01G/ZB35Q01A)

好记性不如烂笔头&#xff0c;既然不够聪明&#xff0c;就乖乖的做笔记&#xff0c;温故而知新。 本文档用于本人对知识点的梳理和记录 目录 一、前言 二、器件分析 三、代码分析 四、结语 一、前言 (ST生态)雅特力AT32F435/F437 QSPI驱动NAND FLASH(W25N01G/ZB35Q01A) SPI驱…