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.应用场景

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

游戏排行看分数,单一的

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考系列(系统架构师)- 2010年系统架构师软考案例分析考点

试题一 软件系统架构选择 【问题1】&#xff08;7分&#xff09; 在实际的软件项目开发中&#xff0c;采用恰当的架构风格是项目成功的保证。请用200字以内的文字说明什么是软件架构风格&#xff0c;并对主程序-子程序和管道-过滤器这两种架构风格的特点进行描述。 软件架构风…

MySQL——九、SQL编程

MySQL 一、触发器1、触发器简介2、创建触发器3、一些常见示例 二、存储过程1、什么是存储过程或者函数2、优点3、存储过程创建与调用 三、存储函数1、存储函数创建和调用2、修改存储函数3、删除存储函数 四、游标1、声明游标2、打开游标3、使用游标4、关闭游标游标案例 一、触发…

linux-vsftp虚拟多用户

目录 1.安装vsftp 2.安装DB工具&#xff0c;能转化普通文件为vsftpd识别数据库加密文件 3.创建登录虚拟用户的名单 4.加密文件 6.需要修改vsftpd的配置文件 7.修改vsftp的配置文件&#xff0c;加载支持虚拟用户模式 8.针对不同用户开启不同权限 9.重启服务 10.测试 安…

Winsows QT5.15安装教程——组件务必要选上Sources

文章目录 1 下载地址2 开始安装2.1 选择一个磁盘空间大的位置安装QT&#xff0c;安装完可能会占用30G以上的空间2.2 选择组件2.3 接下来进入傻瓜式安装 3 QT 组件一览3.1 “Preview”分类下的开发组件3.1.1 编译器模块。3.1.2 “Qt ”分类下的开发组件 1 下载地址 https://www…

pytorch 笔记:KLDivLoss

1 介绍 对于具有相同形状的张量 ypred​ 和 ytrue&#xff08;ypred​ 是输入&#xff0c;ytrue​ 是目标&#xff09;&#xff0c;定义逐点KL散度为&#xff1a; 为了在计算时避免下溢问题&#xff0c;此KLDivLoss期望输入在对数空间中。如果log_targetTrue&#xff0c;则目标…

【Linux】Linux+Nginx部署项目

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.单体项目的部署 0.我们需要将要进行部…

Notepad++安装插件和配置快捷键

Notepad是一款轻量级、开源的文件编辑工具&#xff0c;可以编辑、浏览文本文件、二进制文件、.cpp、.java、*.cs等文件。Notepad每隔1个月&#xff0c;就有一个新版本&#xff0c;其官网是&#xff1a; https://github.com/notepad-plus-plus/notepad-plus-plus。这里介绍其插件…

10分钟了解JWT令牌 (JSON Web)

10分钟了解JSON Web令牌&#xff08;JWT&#xff09; JSON Web Token&#xff08;JWT&#xff09;是目前最流行的跨域身份验证解决方案。今天给大家介绍JWT的原理和用法。 1.跨域身份验证 Internet服务无法与用户身份验证分开。一般过程如下。 1.用户向服务器发送用户名和密码。…

C++系列之list的模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; list的节点类 template struct list_Node { public: list_Node* _prev; list_…

构建自动化测试环境:使用Docker和Selenium!

随着软件开发的日益复杂和迭代速度的加快&#xff0c;自动化测试被越来越广泛地应用于软件开发流程中。它能够提高测试效率、减少测试成本&#xff0c;并保证软件质量的稳定性。在构建自动化测试环境方面&#xff0c;Docker 和 Selenium 是两个非常有用的工具。下面将介绍如何使…

JDK21下载和安装

说明 本文介绍 JDK21&#xff08;Oracle版&#xff09;的下载和安装。 下载 Oracle官网JDK21下载页面 根据操作系统的类型&#xff0c;下载相应的版本。本文下载的是Windows64位的安装版。 下载页面示例 安装包示例 安装 双击安装包&#xff0c;开始安装。 把路径改为自定…

Linux操作系统的基础IO

目录 系统文件IOopen函数0 & 1 & 2文件描述符的分配规则重定向输入重定向输出重定向追加重定向dup2 FILE 文件系统inode 软硬链接软链接硬链接 动态库和静态库动静态库的命名方式静态库制作一个库使用库 动态库制作一个库使用库 系统文件IO open函数 int open(const …

高等数学前置知识——二次函数

文章目录 二次函数1.1 二次函数1.2 二次函数的图像1.2.1 a > 0 时1.2.2 a < 0 时1.2.3 二次函数的平移1.2.4 普通二次型函数图像总结 1.3 其他形式的二次函数1.3.1 顶点式1.3.2 交点式 1.4 二次函数与直线的交点 二次函数 1.1 二次函数 二次函数的定义&#xff1a;y a…

C#的DataGridView数据控件(直接访问SQL vs 通过EF实体模型访问SQL)

目录 一、在DataGridView控件中显示数据 1.直接编程访问SQL &#xff08;1&#xff09;源码 &#xff08;2&#xff09;生成效果 2.通过EF实体模型访问SQL &#xff08;1&#xff09;源码 &#xff08;2&#xff09;生成效果 二、获取DataGridView控件中的当前单元格 …

1024 云上见 · 上云挑战(ChatGPT搭建)

【玩转1024】使用函数计算X通义千问搭建AI助手&#xff0c;参与1024小说创作大赛 【使用函数计算X通义千问搭建AI助手&#xff0c;参与小说创作大赛】&#xff1a;本活动基于函数计算X 通义千问快速部署 AI 个人助手应用&#xff0c;用户可以根据需要选择不同角色的AI助手开启…

刀具磨损状态识别(Python代码,MSCNN_LSTM_Attention模型,初期磨损、正常磨损和急剧磨损分类,解压缩直接运行)

1.运行效果&#xff1a;刀具磨损状态识别&#xff08;Python代码&#xff0c;MSCNN_LSTM_Attention模型&#xff0c;初期磨损、正常磨损和急剧磨损&#xff09;_哔哩哔哩_bilibili 环境库&#xff1a; NumPy 版本: 1.19.4 Pandas 版本: 0.23.4 Matplotlib 版本: 2.2.3 Keras …

【C语言】【goto语句】复习捡拾~

goto语句可以在同一个函数内跳转到设定好的位置&#xff1a; #include<stdio.h> int main() {printf("hello world\n");goto next;printf("hehe"); next:printf("leap here\n");return 0; }goto 语句如果使⽤的不当&#xff0c;就会导致在…

构建外卖小程序:技术要点和实际代码

1. 前端开发 前端开发涉及用户界面设计和用户交互。HTML、CSS 和 JavaScript 是构建外卖小程序界面的主要技术。 <!-- HTML 结构示例 --> <header><h1>外卖小程序</h1><!-- 其他导航元素 --> </header> <main><!-- 菜单显示 -…

vm_flutter

附件地址 https://buuoj.cn/match/matches/195/challenges#vm_flutter 可以在buu下载到。 flutter我也不会&#xff0c;只是这个题目加密算法全部在java层&#xff0c;其实就是一个异或和相加。 反编译 package k;import java.util.Stack;/* loaded from: classes.dex */ pu…

【Linux】部署单机项目以及前后端分离项目

Linux部署单机项目&#xff1a; 优点&#xff1a; 简化了系统管理&#xff1a;由于所有服务都在同一台机器上运行&#xff0c;因此可以简化系统管理和维护。 提高了性能&#xff1a;由于没有网络延迟和其他因素的影响&#xff0c;所以可以提高系统的性能。 缺点&#xff1a; 容…