Redis -- 基础知识3 数据类型及指令

FLUSHALL:清空所有键值对操作(最好别搞,删库要被绳之以法的)

1.string类型

1.介绍

1.redis的字符串,直接按照二进制进行存储,所以可以存储任何数据,取出时不需要转码

2.redis的string类型,限制大小最大为512M,因为为单线程模型为了操作短平快

2.操作

1.set与get

set key value [ex seconds | px iseconds] [NX | XX]:添加string类型的键值对

1.一个语句可追加多条操作,而且合并的操作是原子性的

2.NX:如果key存在,则不设置,不存在则设置 ; XX:key存在更新设置,不存在不设置

3.如果key存在,则覆盖value,并且ttl也会失效

get key:获取key,只支持string类型的操作,如果不是会报错

2.mset与mget

操作多组键值对,减少了网络传输次数,增加效率

mset key value [key value...]:多次添加,但不是不要加太多,会使得redis阻塞

mget key [key]:一次性查找多次

3.setnx/setex/psetex

setnx: set同时设置nx选项,如果key存在,则不设置,不存在则设置

setex: 添加键值对并且设置超时时间

psetex:添加键值对并且设置毫秒级超时时间

4.incr/incrby/decr/decrby/incrbyfloat

value类型为int类型才能操作,并且数不能超过范围.操作的时间复杂度都是O(1),多客户端一起发送也不会出现线程安全问题

incr key: value+1 (64位),如果key不存在,当作当作value为0的键值对

incrby key n: value+n,n为正负数都可以

decr key: value-1

decrby key n: value-n,n为正负数都可以

incrbyfloat key n: value +/- 小数

5.append/getrange/setrange/strlen

append key value: 追加字符串,如果key没有则功能等于set.返回值的长度是字节

编码字节大小由shell设置,utf-8的汉字字节为3字节.get汉字不会返回汉字,会返回编码.需要在启动客户端时加上 --raw 的选项,客户端就会尝试翻译

getrange key start end: 获取字符串的一部分,区间范围为[start,end].负数表示倒数第几个.切分汉字可能会出现问题

setrange key offset value: 将offset位置的数据开始替换成value.替换结束返回新字符串的长度.如果当前替换的是汉字,那么可能会出现问题

strlen key:获取到字符串的长度,单位为字节

3.string编码方式

int: 8字节的长整型

embstr: 小于等于39字节的字符串

raw: 大于39字节的字符串

小数存储为一个字符串,而不是int类型.所以进行加减运行会进行转换

4.应用场景

1.作为缓存

应用服务器访问数据时,先查redis中是否存在,如果有直接返回给服务器;如果没有则在MySQL中寻找,并且将数据存一份到redis中.其功能就是把缓存用于存储热点数据,不过热点数据选择的策略是人为定义的.随时间推移key会越来越多,那么我们需要可以设置超时时间.当然redis在内存不足时,提供了淘汰机制.

2.计数

例如统计视频的观看次数.如果统计TopK的数据不太可以,使用MySQL更好

3.共享会话(session)

每一个服务器都在redis中维护同一份session,只要每个请求过来,每一个服务器都能对该请求进行处理与响应

2.hash类型

key field value形式,key对应一整个hash表

1.命令

1.hset/hget/hexists

hset key field value [field value...]:针对key跟上若干field与value的键值对.返回值为键值对的个数,value的类型为字符串

hget key field: key找到hash表,通过field找到value

hexists key field: 判断hash表中是否存在field

2.hdel

hdel key field[key field...]: 删除的是field,而不是key.返回删除的字段个数

3.hkeys/hvals

hkeys key: 查看所有field字段.找到hash,遍历hash的所有field.该操作有一定风险,与keys *差不多的错误

hvals key: 获取key中的所有value

4.hgetall/hmget

hgetall key: 查看所有field和对应的value,不推荐使用

hmget key field [field...]: 查看指定多个field的value

hscan key:渐进式遍历.敲一次遍历一部分

5.hlen/hsetnx/hincrby/hincrbyfloat

hlen key: hash的filed-value键值对个数,时间复杂度为O(1)

hsetnx key field value: 不存在则设置,存在则失败

hincrby key field n: hash的value也可当成整数,加减正负都行

hincrbyfloat key field n: hash的value也可当成浮点数,加减正负都行

2.hash编码方式

ziplist:压缩链表,适用于元素个数少,每个value的长度比较短

hashtable:hash表

3.应用

作为缓存:存储结构化的数据,类似于数据库的表结构.

1.hash类型是稀疏的,而关系型数据库是完全结构化的

2.关系型数据库可做复杂性查询,而redis不可以

3.list类型

类似于双端队列(deque),链表中的元素允许重复,下标从0开始

1.命令

1.lpush/lrange/lpushx/rpush

lpush key value [value...] :头插,返回值为list的长度

lrange key start end :查看[start,end]的区间,越界会返回能得到的所有数据

lpushx key value [value...] :key存在才头插

rpush key value [value...] :尾插,返回值为list的长度

2.lpop/rpop

lpop key :头删,返回删除元素值,或者返回空

rpop key :尾删,返回删除元素值,或者返回空

3.lindex/linsert/llen

lindex key index:给定下标,返回对应元素,时间复杂度为O(N)

linsert key <befor | after> pivot value :按顺序找pivot基准值,在其前面或者后面插入value元素,返回元素个数,时间复杂度为O(N)

llen key :获取list的元素个数

4.lrem

lrem key count element :count>0,删除element开始从左往右删除count次 ; count<0,删除element开始从右往左删除count次 ; count=0,删除所有的element

5.ltrim/lset

ltrim key start stop: 保留[start,stop]间元素

lset key index element: 修改任何位置的元素

6.阻塞式命令

阻塞:一旦list数据为空就会阻塞

blpop和brpop如果在list数据为空就会产生阻塞,直到list中有数据为止,当然可以设置阻塞时间,一旦超时就不再等待.返回一个二元组,哪个key取出哪个数据

blpop key [key...] timeout :一旦多个key存在一个数据,那么就会执行

brpop key [key...] timeout

2.list编码方式

ziplist: 压缩链表,节省空间,适用于元素个数少

linkedlist: 真实链表,适用于元素个数多

quicklist: redis5之后使用现在的结构,结合了ziplistlinkedlist,整体是链表,但是每一个元素是压缩链表

3.应用场景

1.list作为数组,存储多个元素

2.消息队列(生产者消费者模型),轮询模型

4.set类型

1.命令

1.sadd/smembers

sadd key member [member...]: 添加set的元素,返回添加成功的元素

smembers key :key中所有的元素

sismember key member :测试某一个member是否存在

2.spop/srandmember

spop key count: 随机删除count个元素

srandmember key count:随机获得count个元素

在源码中,针对spop与srandmember就采取了生成随机数的操作

3.smove/srem

smove key1 key2 member:从key1中删除member再加到key2中

srem key member [member...]: 删除指定元素,返回删除的个数

4.集合间操作

1.交集:

sinter key [key..]: 获取交集,时间复杂度为O(n*m)

sinterstore des key [key..]: 算好交集存到des中

2.并集:

sunion: 求并集,时间复杂度为O(n)

sunionstore des key [key..]: 求并集存到des中

3.差集:

sdiff key [key...]: 第一个key为参考,时间复杂度为O(n)

sdiffstore des key [key..]: 求差集存到des中

2.set编码方式

intset:整数集合,节省空间的特定优化,元素均为整数,元素个数不多的情况下使用

hashtable:哈希表

3.应用场景

1.保存特征形成标签,并且方便计算交集,找到两个集合的公共标签

2.使用set计算用户之间的共同好友

3.使用set统计UV,去重.(pv:page view用户每次访问都会产生一个pv;uv:user view一个用户产生一个uv)

5.zset

1.命令

1.zadd

zadd key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]: key中添加一个含score的member,返回值为新增的元素个数(不显示修改).时间复杂度为O(logN),主要因为跳表.修改后顺序会自动变换

不加[NX | XX]:不存在member就添加新的member,存在就更新member

NX:存在时不设置,没有member更新member

XC:更新存在的member

LT:只更新存在的元素,更新元素比要被更新的小才更新

GT:只更新存在的元素,更新元素比要被更新的大才更新

CH:返回值进行描述,原本返回添加的元素个数,加入CH则也会返回被修改的元素个数

INCR:对现有member能加减操作

特别的:score可以为浮点数,zset的排序默认为升序方式排列

2.zcard/zcount

zcard key:获取元素个数(member数量).时间复杂度为O(1)

zcount key min max: score在max和min之间的member个数,(max (min这样写不包含两端.时间复杂度为O(logN).max和min可以是浮点数,可以使用inf正无穷大和-inf负无穷大

3.zrange/zrevrange/zrangebyscore

zrange key start end [withscores]:查看[start,end]下标之间的元素,withscores现实members的score.时间复杂度为O(log(N)+M),升序查询

zrevrange key start end [withscores]:降序查询

zrangebyscore key min max [withscores] :查询分数范围内的元素

4.zpopmax

zpopmax key [count] :删掉count个最大的score对应的元素.如果元素的score相同,那么此时删除按照member的大小顺序进行一个一个删除.

删除的是最大的数据,那么其实等于是尾删.其时间复杂度为O(logN)

5.bzpopmax/bzpopmin

bzpopmax key [key...] timeout :删除最大的数一次,zset为空时阻塞,阻塞超时时间为timeout,并且单位为秒,支持小数

bzpopmin key [key...] timeout:删除最小的数一次,zset为空时阻塞,阻塞超时时间为timeout,并且单位为秒,支持小数

时间复杂度都是O(logN),key有很多也是一次

6.zrank/zrevrank/zscore

zrank key member: 查看member对应的下标,member不存在返回空.以升序的顺序算的

zrevrank key member:以逆序的顺序算的

zscore key member:查询指定member的score,时间复杂度为O(1) - 查询优化了

7.zrem/zremrangebyrank/zremrangebyscore

zrem key member [member...]: 删除member元素,返回删除元素个数.时间复杂度为O(logN*M)

zremrangebyrank key start end:下标描述范围进行删除元素.时间复杂度为O(logN+M)

zremrangebyscore key start end:分数描述区间进行删除元素.时间复杂度为O(logN+M)

8.zincrby

zincrby key increment member:对member的score增加increment

9.有序集合间关系操作

zinter交集,zunion并集,zdiff差集 -- redis6.2之后支持的

zinterstore des numkeys key [key...] [WEIGHT weight [weight...]] [AGGREGATE <SUM | MIN | MAX>]:交集,存在指定key中

zunionstore des numkeys key [key...] [WEIGHT weight [weight...]] [AGGREGATE <SUM | MIN | MAX>]:并集,存在指定key中

numkeys:多少个key进行交集运算.之所以需要显示,是因为若干个keys之后还有可有可无的操作,需要进行区分

WEIGHT:乘以权重,操作的优先级标准.即对member求交集同时要计算score权重的占比.要算权重那WEIGHT必须写

AGGREGATE:总数合计.SUM为score的总和,MIN为score最小值,MAX为score的最大值

zinterstore的时间复杂度为O(N*K)+O(M*logM),N为最小zset个数,K为numkey,M最终个数.约等于O(M*logM)

zunionstor的时间复杂度为O(N)+O(M*logM),N为所有zset个数

2.zset的编码方式

1.ziplist:适用于元素个数少,单个元素体积小.节省内存空间

2.skiplist:适用于元素个数多,单个元素体积大.查询的时间复杂度为O(logN)

3.应用场景

关键场景:实时的排行榜,可以高效更新

游戏排行看分数,单一的

其他综合热度,需要进行权重计算

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32G030F6P6 芯片实验 (一)

STM32G030F6P6 芯片实验 (一) 淘宝搞了几片, 没试过 G系列, 试试感觉. 先搞片小系统版: 套 STM32F103C8T6小系统板格式. 原理图: (1) Ref 有点跳, 从 STM32F103C8T6 系统板改的, 没重编号. (2) Type-C 纯给电, 砍了 16pin的, 直接换 6pin的。 (3) 测试LED放 B2。 (4) 测试底…

uni-app中tab选项卡的实现效果 @click=“clickTab(‘sell‘)“事件可传参数

一、效果图 二、代码 <template><view><view class"choose-tab"><view class"choose-tab-item" :class"chooseTab 0 ? active : " data-choose"0" click"clickTab">选项1</view><view …

webpack 解决:TypeError: merge is not a function 的问题

1、问题描述&#xff1a; 其一、存在的问题为&#xff1a; TypeError: merge is not a function 中文为&#xff1a; 类型错误&#xff1a;merge 不是函数 其二、问题描述为&#xff1a; 想执行 npm run dev 命令&#xff0c;运行起项目时&#xff0c;控制台报错 TypeErro…

【深度学习】Transformer、GPT、BERT、Seq2Seq什么区别?

请看vcr&#xff1a;https://transformers.run/back/transformer/

SylixOS BSP开发(七)

实现系统调试信息打印接口 当系统出错时或者使用内核日志时会输出一些打印信息&#xff0c;这最终都是调用到bspLib.c中的bspDebugMsg 这个接口来实现的&#xff0c;所以我们在开发BSP时&#xff0c;第一个要做的工作就是实现这个接口。 一般的调试信息都是通过串口来输出的&am…

文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题

四、用go语言&#xff0c;对于一个含 n个结点的任意有根树&#xff0c;写出一个 O(n)时间的过程&#xff0c;输出其所有关键字该树以左孩子右兄弟表示法存储。 文心一言&#xff1a; 在计算机科学中&#xff0c;左孩子右兄弟表示法是一种用于表示树状结构的方法&#xff0c;其…

制作自己的前端组件库并上传到npm上

最近实现了自己的一个前端组件库demo&#xff0c;目前只上传了几个小组件。话不多说&#xff0c;上图&#xff1a; 我分了三个项目&#xff1a;yt-ui组件库、使用文档、demo。线上地址如下&#xff1a; [yt-ui组件库](mhfwork/yt-ui - npm) [组件库使用文档](介绍 | mhfwork/y…

【C++深入浅出】模版初识

目录 一. 前言 二. 泛型编程 三. 函数模版 3.1 函数模版的概念 3.2 函数模版的格式 3.3 函数模版的原理 3.4 函数模板的实例化 3.5 模板参数的匹配原则 四. 类模版 4.1 类模版的定义 4.2 类模版的实例化 一. 前言 本期我们要介绍的是C的又一大重要功能----模版。通…

相交链表-力扣

一、题目描述 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、题解 注意题目所说的相交&#xff0c;相交节点不只是数值上的相等&#xff0c;而是相交以后两条链变成一条链。 解决改题目&#xff0c;我们可以&#xff1a;…

当『后设学习』碰上『工程学思维』

只要我成为一个废物&#xff0c;就没人能够利用我&#xff01; 雷猴啊&#xff0c;我是一只临期程序猿。打过几年工&#xff0c;写过几行代码。但今天我不想聊代码&#xff0c;我们聊聊学习这件事。 技术年年更新&#xff0c;尤其是前端框架&#xff0c;很多时候觉得学习速度都…

一、灵动mm32单片机_开发环境的搭建(Keil)

1、安装Keil MDK。 略。 2、安装芯片对应的Pack包。 (1)这里以MM32F0130单片机为例。 (2)进入灵动微电子官网。上海灵动微电子股份有限公司 (3)点击“支持”→“KEILPacl”。 (3)点击下载Pack包。 (4)下载后&#xff0c;解压下载的压缩包&#xff0c;找到对应的Pack包&…

管理类联考——数学——汇总篇——知识点突破——数据分析——记忆

文章目录 考点记忆/考点汇总——按大纲 整体目录大纲法记忆宫殿法绘图记忆法 局部数字编码法对号不对号 归类记忆法重点记忆法歌决记忆法口诀&#xff1a;加法分类&#xff0c;类类相加&#xff1b;乘法分步&#xff0c;步步相乘。 谐音记忆法涂色 理解记忆法比较记忆法转图像记…

云服务器的先驱,亚马逊云科技海外云服务器领军者

随着第三次工业革命的发展&#xff0c;移动互联网技术带来的信息技术革命为我们的生活带来了极大的便捷。其中&#xff0c;不少优秀的云服务器产品发挥了不可低估的作用&#xff0c;你或许听说过亚马逊云科技、谷歌GCP、IBM Cloud等优秀的海外云服务器。那么云服务器有哪些&…

高级深入--day44

Scrapy 和 scrapy-redis的区别 Scrapy 是一个通用的爬虫框架&#xff0c;但是不支持分布式&#xff0c;Scrapy-redis是为了更方便地实现Scrapy分布式爬取&#xff0c;而提供了一些以redis为基础的组件(仅有组件)。 pip install scrapy-redis Scrapy-redis提供了下面四种组件&a…

C++之回调函数使用和不使用using、typedef、function定义总结(二百五十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【机器学习】sklearn特征值选取与处理

sklearn特征值选取与处理 文章目录 sklearn特征值选取与处理1. 调用数据集与数据集的划分2. 字典特征选取3. 英文文本特征值选取4. 中文特征值选取5. 中文分词文本特征抽取6. TfidfVectorizer特征抽取7. 归一化处理8. 标准化处理9. 过滤低方差特征10. 主成分分析11. 案例&#…

Ubuntu系统编译调试QGIS源码保姆级教程

在之前的文章中&#xff0c;我详细介绍了怎么在Windows下编译QGIS源码&#xff0c;也得到了不错的反馈。但是不足的是Windows下只能编译QGIS的Release模式和RelWithDebInfo模式&#xff0c;想要分析源码&#xff0c;“断点调试”肯定是少不了的&#xff0c;但是这两种模式虽然也…

【C++代码】爬楼梯,不同路径,整数拆分,不同搜索树,动态规划--代码随想录

动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推…

【Spring】IOC快速入门

文章目录 1. Spring简介2. IOC快速入门 1. Spring简介 Spring是一个开放源代码的Java SE/EE一站式轻量级开源框架&#xff0c;由Rod Johnson发起并创立。其核心是IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;&#xff0c;使得开发者可以将对…

OSPF复习

目录 一、OSPF基础&#xff08;开放式最短路径优先协议&#xff09; 1、技术背景&#xff08;RIP中存在的问题&#xff09; 2、OSPF协议特点 3、OSPF三张表 4、OSPF数据包(可抓包) 头部数据包内容&#xff1a; OSPF数据包&#xff08;五种&#xff09; (1)hello包 (2)…