Redis相关命令详解

目录

一、认识Redis

二、string

1、重要知识 

2、基础命令 

3、Key值的设置 

三、list

1、重要知识 

2、存储结构 

3、基础命令

 4、list的应用场景

四、hash

1、重要知识

2、基础命令

五、set

1、重要知识

2、基础命令

3、具体应用

六、zset

1、重要知识

2、基础命令

3、具体应用


一、认识Redis

Redis是Remote Dictionary Service 的简称;也是远程字典服务;Redis 是内存数据库,KV 数据库,数据结构数据库; 其中包含的数据类型包括:

string(字符串):是一个安全的二进制字符串。

list(双端队列,链表):有序(插入有序)。

hash(散列表):对顺序不关注,field是唯一的

set(无序集合):对顺序不关注,里面的值都是唯一的

zset(有序集合):对顺序是关注的,里面的值是唯一的,根据member来确定唯一,根据score来确定有序。

redis是一个内存数据库:到底是运行速度快,还是要存储效率高?当数据量少的时候,存储效率高为主。当数据量看多的时候,运行速度快。

二、string

1、重要知识 

        string作为字符数组,该字符串是动态字符串row,当字符串长度小于1M时,加倍扩容;超过1M每次只多扩容1M,字符串最大长度为512M。

        字符串长度小于等于 20 且能转成整数,则使用 int 存储; 字符串长度小于等于 44,则使用 embstr 存储; 字符串长度大于 44,则使用 raw 存储;

注意:redis字符串是二进制安全字符串,可以存储图片,二进制协议等二进制数据。

2、基础命令 

1、# 设置 key 的 value 值
SET key val2、# 获取 key 的 value
GET key3、# 执行原子加一的操作
INCR key4、# 执行原子加一个整数的操作
INCRBY key increment5、# 执行原子减一的操作
DECR key6、# 执行原子减一个整数的操作
DECRBY key decrement7、# 如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做
# set Not eXist ok 这个命令是否执行了 0,1 是不是操作结果是不是成功
SETNX key value8、# 删除 key val 键值对
DEL key9、# 设置或者清空key的value(字符串)在offset处的bit值。 setbit embstr raw int
# 动态字符串 能够节约内存
SETBIT key offset value10、# 返回key对应的string在offset处的bit值
GETBIT key offset11、# 统计字符串被设置为1的bit数.
BITCOUNT key

下面举一些例子:

1、SET teacher King2、GET teacher       这里会返回:King//下面是统计阅读量,增加统计量,减少阅读量
3、incr reads 
incrby reads 100   decr reads 
decrby reads 100//当不存在的时候就会创建成功,当存在的时候就会创建失败
4、SETNX name xqp 

 当然这些操作中还有一些更加有用的操作,比如:分布式锁,位运算。

//分布式锁
setnx lock 1 # 不存在才能设置 定义加锁行为 占用锁
setnx lock uuid # expire 30 过期# 枷锁
set lock uuid nx ex 30  # 释放锁
del lock
if (get(lock) == uuid)
del(lock);//位运算,这里的bit就是位图,我们的poll也是位图机制
# 月签到功能 10001 用户id 202106 2021年6月份的签到 6月份的第1天
setbit sign:10001:202106 1 1# 计算 2021年6月份 的签到情况
bitcount sign:10001:202106# 获取 2021年6月份 第二天的签到情况 1 已签到 0 没有签到
getbit sign:10001:202106 2

3、Key值的设置 

当我们进行设置Key的时候,可以考虑一下怎么来设置的更加有用。在这个Key中添加更多的有用字段,相当于我们将他进行分组一样。比如这个Key:role:10001 我们可以看作是role的第10001行,当然还可以更细:role:10001:activity:10001 这样我们就可以分出很多类的Key。

三、list

1、重要知识 

双向链表实现,列表首尾操作(删除和增加)时间复杂度 O(1) ;查找中间元素时间复杂度为 O(n) ;

列表中数据是否压缩的依据: 1. 元素长度小于 48,不压缩; 2. 元素压缩前后长度差不超过 8,不压缩;

2、存储结构 

typedef struct quicklistNode {struct quicklistNode *prev;struct quicklistNode *next;unsigned char *zl;unsigned int sz;                     /* ziplist size in bytes */unsigned int count : 16;             /* count of items in ziplist */unsigned int encoding : 2;           /* RAW==1 or LZF==2 */unsigned int container : 2;          /* NONE==1 or ZIPLIST==2 */unsigned int recompress : 1;         /* was this node previous compressed? */unsigned int attempted_compress : 1; /* node can't compress; too small*/unsigned int extra : 10;             /* more bits to steal for future usage */
} quicklistNode;typedef struct quicklist {quicklistNode *head;quicklistNode *tail;unsigned long count;                  /* total count of all entries in allziplists */unsigned long len;                    /* number of quicklistNodes */int fill : QL_FILL_BITS;              /* fill factor for individualnodes */unsigned int compress : QL_COMP_BITS; /* depth of end nodes not tocompress;0=off */unsigned int bookmark_count: QL_BM_BITS;quicklistBookmark bookmarks[];
} quicklist;

3、基础命令

# 从队列的左侧入队一个或多个元素
LPUSH key value [value ...]# 从队列的左侧弹出一个元素
LPOP key# 从队列的右侧入队一个或多个元素
RPUSH key value [value ...]# 从队列的右侧弹出一个元素
RPOP key# 返回从队列的 start 和 end 之间的元素 0, 1 2 负索引
LRANGE key start end# 从存于 key 的列表里移除前 count 次出现的值为 value 的元素
# list 没有去重功能 hash set zset这三个有去重功能
LREM key count value# 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出任何元素的时候阻塞连接
BRPOP key timeout         # 超时时间 + 延时队列

 下面举一些例子:

//lpush
lpush teacher king mark darren//lpop 
lpop teacher    //返回darren//rpush 
rpush teacher darren //rpop
rpop teacher   //返回darren//lrange
lrang teacher 0 -1    //到-1是为了将全部进行列出//lrem
rpush zimu a b c a b c   //插入这六个字母
lrem zimu 2 a     //将a删除两次 ,剩下bcbc了
lrem zimu -1 c    //从后面开始删除一个c  剩下bcb//brpop,当teacher这个key中的值全部是空的时候
brpop teacher     //这里会被阻塞,然后我们开启另一个客户端
rpush teacher king    //当这里进行添加了之后,那么第一个客户端会提取出这个来,并返回阻塞时间//当然我们也可以添加超时时间,当阻塞的时间太长就返回

 4、list的应用场景

我们可以通过使用list不同的操作可以实现不同的数据结构,其中就实现了三种:栈,队列,阻塞队列。

栈的使用

LPUSH + LPOPRPUSH + RPOP

队列的使用

LPUSH + RPOPRPUSH + LPOP

阻塞队列的使用

LPUSH + BRPOPRPUSH + BLPOP

四、hash

1、重要知识

散列表,在很多高级语言当中包含这种数据结构;c++ 中的unordered_map 通过 key 快速索引 value;

2、基础命令

# 获取 key 对应 hash 中的 field 对应的值
HGET key field# 设置 key 对应 hash 中的 field 对应的值
HSET key field value# 设置多个hash键值对
HMSET key field1 value1 field2 value2 ... fieldn valuen# 获取多个field的值
HMGET key field1 field2 ... fieldn# 给 key 对应 hash 中的 field 对应的值加一个整数值
HINCRBY key field increment# 获取 key 对应的 hash 有多少个键值对
HLEN key# 删除 key 对应的 hash 的键值对,该键为field
HDEL key field

举栗子:

# 使用哈希表进行存储
hmset hash:10001 name mark age 18 sex male# 与 string 比较
set hash:10001 '{["name"]:"mark",["sex"]:"male",["age"]:18}'# 假设现在修改 mark的年龄为19岁
# hash:
hset hash:10001 age 19# string:
get hash:10001# 将得到的字符串调用json解密,取出字段,修改 age 值
# 再调用json加密
set hash:10001 '{["name"]:"mark",["sex"]:"male",["age"]:19}'# 将用户id作为 key
# 商品id作为 field
# 商品数量作为 value
# 注意:这些物品是按照我们添加顺序来显示的;
# 添加商品:
hmset MyCart:10001 40001 1 cost 5099 desc "戴尔笔记本14-3400"
lpush MyItem:10001 40001# 增加数量:
hincrby MyCart:10001 40001 1
hincrby MyCart:10001 40001 -1 // 减少数量1# 显示所有物品数量:
hlen MyCart:10001# 删除商品:
hdel MyCart:10001 40001
lrem MyItem:10001 1 40001# 获取所有物品:
lrange MyItem:10001# 40001 40002 40003
hget MyCart:10001 40001
hget MyCart:10001 40002
hget MyCart:10001 40003

五、set

1、重要知识

集合;用来存储唯一性字段,不要求有序; 存储不需要有序,操作(交并差集的时候排序)?

2、基础命令

# 添加一个或多个指定的member元素到集合的 key中
SADD key member [member ...]# 计算集合元素个数
SCARD key# SMEMBERS key
SMEMBERS key# 返回成员 member 是否是存储的集合 key的成员
SISMEMBER key member# 随机返回key集合中的一个或者多个元素,不删除这些元素
SRANDMEMBER key [count]# 从存储在key的集合中移除并返回一个或多个随机元素
SPOP key [count]# 返回一个集合与给定集合的差集的元素
SDIFF key [key ...]# 返回指定所有的集合的成员的交集
SINTER key [key ...]# 返回给定的多个集合的并集中的所有成员
SUNION key [key ...]

3、具体应用

抽奖

# 添加抽奖用户
sadd Award:1 10001 10002 10003 10004 10005 10006
sadd Award:1 10009# 查看所有抽奖用户
smembers Award:1# 抽取多名幸运用户
srandmember Award:1 10# 如果抽取一等奖1名,二等奖2名,三等奖3名,该如何操作?
//当然是通过SPOP进行随机返回并且进行删除操作

共同关注

sadd follow:A mark king darren mole vico
sadd follow:C mark king darren
sinter follow:A follow:C

推荐好友

sadd follow:A mark king darren mole vico
sadd follow:C mark king darren
# C可能认识的人:
sdiff follow:A follow:C

六、zset

1、重要知识

有序集合;用来实现排行榜;它是一个有序唯一;

2、基础命令

# 添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]# 从键为key有序集合中删除 member 的键值对
ZREM key member [member ...]# 返回有序集key中,成员member的score值
ZSCORE key member# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member# 返回key的有序集元素个数
ZCARD key# 返回有序集key中成员member的排名
ZRANK key member# 返回存储在有序集合key中的指定范围的元素 order by id limit 1,100
ZRANGE key start stop [WITHSCORES]# 返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]

3、具体应用

热搜榜:对于经常看到的热搜这些是怎么实现的呢?

# 点击新闻:
zincrby hot:20230612 1 10001
zincrby hot:20230612 1 10002
zincrby hot:20230612 1 10003
zincrby hot:20230612 1 10004
zincrby hot:20230612 1 10005
zincrby hot:20230612 1 10006
zincrby hot:20230612 1 10007
zincrby hot:20230612 1 10008
zincrby hot:20230612 1 10009
zincrby hot:20230612 1 10010# 获取排行榜:
zrevrange hot:20230612 0 9 withscores

时队列:将消息序列化成一个字符串作为 zset 的 member;这个消息的到期处理时间作为 score,然后用 多个线程轮询 zset 获取到期的任务进行处理。也就是将第二个参数作为超时时间。

def delay(msg):msg.id = str(uuid.uuid4()) #保证 member 唯一value = json.dumps(msg)retry_ts = time.time() + 5 # 5s后重试redis.zadd("delay-queue", retry_ts, value)# 使用连接池
def loop():while True:values = redis.zrangebyscore("delay-queue", 0, time.time(), start=0,num=1)if not values:time.sleep(1)continuevalue = values[0]success = redis.zrem("delay-queue", value)if success:msg = json.loads(value)handle_msg(msg)# 缺点:loop 是多线程竞争,两个线程都从zrangebyscore获取到数据,但是zrem一个成功一个失败,
# 优化:为了避免多余的操作,可以使用lua脚本原子执行这两个命令
# 解决:漏斗限流

分布式定时器:生产者将定时任务 hash 到不同的 redis 实体中,为每一个 redis 实体分配一个 dispatcher 进程, 用来定时获取 redis 中超时事件并发布到不同的消费者中;

时间窗口限流:系统限定用户的某个行为在指定的时间范围内(动态)只能发生 N 次。

# 指定用户 user_id 的某个行为 action 在特定时间内 period 只允许发生该行为做大次数max_count
local function is_action_allowed(red, userid, action, period, max_count)local key = tab_concat({"hist", userid, action}, ":")local now = zv.time()red:init_pipeline()-- 记录行为red:zadd(key, now, now)-- 移除时间窗口之前的行为记录,剩下的都是时间窗口内的记录red:zremrangebyscore(key, 0, now - period *100)-- 获取时间窗口内的行为数量red:zcard(key)-- 设置过期时间,避免冷用户持续占用内存 时间窗口的长度+1秒red:expire(key, period + 1)local res = red:commit_pipeline()return res[3] <= max_count
end# 维护一次时间窗口,将窗口外的记录全部清理掉,只保留窗口内的记录;
# 缺点:记录了所有时间窗口内的数据,如果这个量很大,不适合做这样的限流;漏斗限流
# 注意:如果用 key + expire 操作也能实现,但是实现的是熔断限流,这里是时间窗口限流的功能;

本片的redis讲解完毕啦!0voice · GitHub

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

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

相关文章

【保姆级教程】如何创建一个vitepress项目?

文章目录 安装前的准备工作项目安装创建文件初始化文件安装依赖遇到了 missing peer deps 警告&#xff1f;命令行设置向导 完成 安装前的准备工作 Node.js 18 及以上版本。通过命令行界面 (CLI) 访问 VitePress 的终端。支持 Markdown 语法的编辑器。推荐 VSCode 及其官方 Vu…

gpt plus获取指南

随着AI技术的发展&#xff0c;越来越多的人开始依赖GPT来提高工作效率。市场上有多个平台提供GPT服务&#xff0c;如何选择最适合自己的&#xff1f;本文将详细对比两个热门平台&#xff1a;「银河」和「环球」&#xff0c;帮助你快速决策。 环球链接 银河链接 结论先行&#…

Windows10 如何配置python IDE

Windows10 如何配置python IDE 前言Python直接安装&#xff08;快速上手&#xff09;Step1.找到网址Step2.选择版本&#xff08;非常重要&#xff09;Step3. 安装过程Step4. python测试 Anaconda安装&#xff08;推荐&#xff0c;集成了Spyder和Pycharm的安装&#xff09;Step1…

【人工智能】枢纽:数据驱动洞察引领未来智能系统

目录 第一部分&#xff1a;人工智能概述 1.1 人工智能的定义 1.2 人工智能的历史发展 1.3 未来发展趋势 第二部分&#xff1a;机器学习 2.1 机器学习的概念 2.2 监督学习的算法与应用 2.2.1 线性回归&#xff08;Linear Regression&#xff09; 2.2.2 决策树&#xff…

Bonree ONE 3.0 助力企业加速驶入“全域可观测”新时代

发展新质生产力是我国目前推动高质量发展的内在要求和重要着力点。在这一背景下&#xff0c;基于信息技术及关键生产要素数据&#xff0c;推进企业数智化转型&#xff0c;成为形成新质生产力的关键路径。当前&#xff0c;随着企业业务的不断扩展和复杂化&#xff0c;企业对数据…

服务网关工作原理,如何获取用户真实IP?

文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器&#xff08;案例&#xff1a;获取用户真实IP地址&#xff09; (★) 补充1&#xff1a;不同类型的客户端如何设…

[产品管理-3]:NPDP新产品开发 - 1 - 愿景、使命、价值观,看似很虚,实际上指明正确的方向; 战略、方案、方法,指明正确的方法。

目录 前言&#xff1a;用正确的方法做正确的事 做正确的事&#xff1a;&#xff08;愿景、使命、价值观&#xff09; 用正确的方法&#xff1a;&#xff08;战略、方案、方法&#xff09; 总结 一、什么是战略 1.1 概述 1.2 企业战略的分层 1.3 什么是组织&#xff0c;…

Nginx之日志切割,正反代理,HTTPS配置

1 nginx日志切割 1.1 日志配置 在./configure --prefixpath指定的path中切换进去&#xff0c;找到log文件夹&#xff0c;进去后找到都是对应的日志文件 其中的nginx.pid是当前nginx的进程号&#xff0c;当使用ps -ef | grep nginx获得就是这个nginx.pid的值 在nginx.conf中…

瑞芯微RK3566鸿蒙开发板OpenHarmony标准系统应用兼容性测试指导

本文OpenHarmony标准系统应用兼容性测试指导&#xff0c;适用鸿蒙系统软件开发测试的新手入门学习课程。设备为触觉智能的瑞芯微RK3566开发板&#xff0c;型号Purple Pi OH。是Laval官方社区主荐的一款鸿蒙开发主板。支持Openharmony、安卓Android、Linux的Debian、Ubuntu系统。…

【Flutter】Flutter安装和配置(mac)

1、准备工作 升级Macos系统为最新系统安装最新的Xcode电脑上面需要安装brew https://brew.sh/安装chrome浏览器&#xff08;开发web用&#xff09; 2.、下载flutter https://docs.flutter.dev/release/archive?tabmacos 大家网页后&#xff0c;选择对应的版本【Tips&#x…

【STM32 HAL库】IIC通信与CubeMX配置

【STM32 HAL库】IIC通信与CubeMX配置 前言理论IIC总线时序图IIC写数据IIC读数据 应用CubeMX配置应用示例AHT20初始化初始化函数读取说明读取函数 前言 本文为笔者学习 IIC 通信的总结&#xff0c;基于keysking的视频内容&#xff0c;如有错误&#xff0c;欢迎指正 理论 IIC总…

[网络]从零开始的计算机网络基础知识讲解

一、本次教程的目的 本次教程我只会带大叫了解网络的基础知识&#xff0c;了解网络请求的基本原理&#xff0c;为后面文章中可能会用到网络知识做铺垫。本次我们只会接触到网络相关的应用层&#xff0c;并不涉及协议的具体实现和数据转发的规则。也就是说&#xff0c;这篇教程是…

第四届长城杯部分wp

还是太菜了&#xff0c;要经常练了 1.BrickGame 读源码可以看到时间的值是由js设定的&#xff0c;所以控制台将timeleft的时间改成999999 通过游戏就可以得到flag 2.SQLUP 一道文件上传的题目&#xff0c;在登陆页面我用admin和1登陆成功了&#xff0c;但是按照正常的应该是…

Android 语言国际化三步

1.罗列: 可以多罗列几个 不需要全部实现 res下创建这个文件:locale-config <locale-config xmlns:android"http://schemas.android.com/apk/res/android"><locale android:name"zh" /><locale android:name"en" /><lo…

Proteus仿真综合实例(1)

分享一些基于Proteus的仿真实例&#xff0c;供大家学习参考。 1、51单片机230个Proteus仿真实例 包含基于51单片机的230个仿真实例&#xff0c;涉及定时器、中断、LCD显示、DS18B20温度测量、DS1621温度测量、PWM生成等充足电路模型案例。 2、51交通灯 模拟实现基于51单片机…

Banana Pi BPI-SM9 AI 计算模组采用算能科技BM1688芯片方案设计

产品概述 香蕉派 Banana Pi BPI-SM9 16-ENC-A3 深度学习计算模组搭载算能科技高集成度处理器 BM1688&#xff0c;功耗低、算力强、接口丰富、兼容性好。支持INT4/INT8/FP16/BF16/FP32混合精度计算&#xff0c;可支持 16 路高清视频实时分析&#xff0c;灵活应对图像、语音、自…

灭火器目标检测数据集 3700张 灭火器 带标注 voc yolo

数据集名称&#xff1a; 灭火器目标检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;3700张标注类型&#xff1a;灭火器检测格式兼容性&#xff1a;支持VOC和YOLO标注格式 数据集内容&#xff1a; 该数据集旨在用于训练和评估计算机视觉模型&#xff0c;特别是针对灭…

7个最佳实践的潜在客户捕获登录页面案例

什么是线索捕获页面&#xff1f; 线索捕获页面是一个着陆页&#xff0c;它向潜在客户提供某种回报以换取他们的电子邮箱地址或其他信息。任何带表单的页面&#xff0c;包括电子书下载页面、演示请求页面或新闻通讯注册页面&#xff0c;都可以视为线索捕获页面。 与您网站上的…

九盾叉车U型区域警示灯,高效照明和安全警示

叉车运作的环境比较复杂&#xff0c;在方便人们物流运输的同时也存在着很大的安全隐患&#xff0c;特别是叉车碰撞人的事故发生率很高&#xff0c;那我们该怎么在减少成本的同时又能避免碰撞事故的发生呢&#xff1f; 九盾叉车U型区域警示灯&#xff0c;仅需一盏灯安装在叉车尾…

ElasticSearch的DSL查询④(DSL查询、RestClient的DSL查询)

目录 一、DSL查询 1.1 快熟入门 1.2 叶子查询 1.2.1 全文检索查询 1&#xff09;match查询 2&#xff09;multi_match查询 1.2.2 精确查询 1&#xff09;term查询 2&#xff09;range查询 3&#xff09;ids查询 1.3 复合查询 1.3.1 bool查询 1.3.2 算分函数查询 …