Redis相关命令详解

news2024/9/20 10:40:43

目录

一、认识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 val

2、# 获取 key 的 value
GET key

3、# 执行原子加一的操作
INCR key

4、# 执行原子加一个整数的操作
INCRBY key increment

5、# 执行原子减一的操作
DECR key

6、# 执行原子减一个整数的操作
DECRBY key decrement

7、# 如果key不存在,这种情况下等同SET命令。 当key存在时,什么也不做
# set Not eXist ok 这个命令是否执行了 0,1 是不是操作结果是不是成功
SETNX key value

8、# 删除 key val 键值对
DEL key

9、# 设置或者清空key的value(字符串)在offset处的bit值。 setbit embstr raw int
# 动态字符串 能够节约内存
SETBIT key offset value

10、# 返回key对应的string在offset处的bit值
GETBIT key offset

11、# 统计字符串被设置为1的bit数.
BITCOUNT key

下面举一些例子:

1、SET teacher King

2、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 + LPOP

RPUSH + RPOP

队列的使用

LPUSH + RPOP

RPUSH + LPOP

阻塞队列的使用

LPUSH + BRPOP

RPUSH + 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)
        continue
    value = 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.coloradmin.cn/o/2125708.html

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

相关文章

“禁塑行动·我先行”广州绿葆网络发展有限公司与辽宁省慈善联合总会共谱环保新篇章

2024年9月9日&#xff0c;在国家大力推进生态文明建设、全面实施禁塑令政策的大背景下&#xff0c;农工同心公益基金“禁塑行动我先行”公益捐赠辽宁省启动仪式在辽宁省成功举办。此次活动由辽宁省慈善联合总会、农工党辽宁省委会主办&#xff0c;辽宁省慈善联合总会农工同心公…

MUR2060CT-ASEMI快恢复二极管MUR2060CT

编辑&#xff1a;ll MUR2060CT-ASEMI快恢复二极管MUR2060CT 型号&#xff1a;MUR2060CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220AB 安装方式&#xff1a;插件 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#…

噪声的消除

开关电源的干扰一般是几十K到几百K&#xff1a; 【电源噪声查不出来&#xff1f;不用上板子&#xff0c;滤波器仿真就能搞定】https://www.bilibili.com/video/BV12v411r798?vd_source3cc3c07b09206097d0d8b0aefdf07958 村田消除噪声的仿真软件&#xff1a; SimSurfing - 村…

Kafka原理剖析之「Topic创建」

一、前言 Kafka提供了高性能的读写&#xff0c;而这些读写操作均是操作在Topic上的&#xff0c;Topic的创建就尤为关键&#xff0c;其中涉及分区分配策略、状态流转等&#xff0c;而Topic的新建语句非常简单 bash kafka-topics.sh \ --bootstrap-server localhost:9092 \ // …

QT设置闹钟超时播报

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QTime> #include<QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic…

mysql 之 information_schema

information_schema 是 MySQL 中的一个特殊数据库&#xff0c;它提供了关于 MySQL 服务器中所有数据库、表、列、索引、存储过程、函数、触发器等对象的元数据信息。information_schema 是一个只读数据库&#xff0c;主要用于查询数据库的结构信息&#xff0c;而不是存储用户数…

【Unity踩坑】创建新项目后提示编译错误要进入安全模式

在创建了新项目后&#xff08;比如URP&#xff0c;AR&#xff0c;VR&#xff09;&#xff0c;首次打开时提示有编译错误&#xff0c;要进入安全模式。 脚本是项目模板自带的&#xff0c;不会有问题。这时需要先选择进入安全模式&#xff0c;然后关闭项目&#xff0c;重新打开就…

C++之函数进阶

函数默认参数 注意事项&#xff1a; 1. 如果从某个位置开始&#xff0c;有了默认参数&#xff0c;那么从这个位置往后&#xff0c;都必须有默认参数 2. 函数声明和函数定义只能有一个进行默认参数设置 函数占位参数 函数重载 函数名相同void fun()&#xff0c;功能实现不同 提高…

arxiv 首次投稿注意事项记录

文章目录 注册用教育邮箱&#xff0c;不用背书latex&#xff1a; 主tex和bib文件放在最外层&#xff0c;重命名为arxiv.tex和arxiv.bib &#xff08;没测试过不重命名会怎么样&#xff09;在overleaf右上方点submmit&#xff0c;选arxiv&#xff08;这样会自动生成一个bbl文件&…

基于HTML5的下拉刷新效果

基于HTML5的下拉刷新效果 效果示例图示例代码 效果示例图 示例代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport&quo…

储能系统:工商业绿色转型的“稳压器”与“利润加速器”

在当今工商业领域&#xff0c;随着生产规模的扩大与新能源应用的快速普及&#xff0c;负荷峰谷差日益成为制约企业可持续发展的瓶颈。新能源的间歇性与不稳定性&#xff0c;更是让电网电能质量波动加剧&#xff0c;成本持续攀升。然而&#xff0c;在这一挑战背后&#xff0c;蕴…

基于Java+ssm+jsp开发的相亲交友网站管理系统

项目简介 该项目是基于Javassmjsp开发的婚恋交友网站管理系统&#xff0c;这是一项为大学生课程设计作业而开发的项目。 该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java的婚恋交友管理系统项目&#xff0c;大学生…

源代码如何防泄漏?用对软件真的很重要!

在数字化时代&#xff0c;源代码的安全保护对企业来说至关重要。源代码泄露不仅会导致企业技术优势的丧失&#xff0c;还可能引发严重的经济损失和法律风险。因此&#xff0c;实现源代码防泄漏成为了企业信息安全战略中的重要一环。 深信达的SDC沙盒防泄密软件正是在这样的背景…

【leetcode_python】杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] 方案&#…

Facebook的虚拟现实功能简介:社交网络的新前沿

在科技飞速发展的今天&#xff0c;虚拟现实&#xff08;VR&#xff09;已经从科幻小说中的梦想变成了触手可及的现实。作为全球领先的社交平台&#xff0c;Facebook&#xff08;现已更名为Meta&#xff09;正大力推动虚拟现实技术的发展&#xff0c;以重新定义用户的社交体验。…

element表格合并列数据相同合并单元格

<!-- :span-method"objectSpanMethod"合并列 --><el-table stripe :data"morningdataList" style"width: 100%" :span-method"objectSpanMethod" ><el-table-column align"center" label"" :show…

企业数据资产目录建设方案(可编辑的46页PPT)

引言&#xff1a;在当今数据驱动的时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其有效管理和利用直接关系到企业的决策效率、业务创新能力和市场竞争力。数据资产目录建设方案旨在通过系统化的方法&#xff0c;对企业内部的数据资源进行全面的梳理、分类、编目…

vscode中前端项目文件格式化备份

文件->首选项->设置 点击图标后进入&#xff0c;并粘贴下面代码 {"files.associations": {"*.vue": "vue","*.wpy": "wxml","*.wxml": "html","*.wxss": "css","*.cjso…

耦合性例题

答案&#xff1a;D 知识点&#xff1a; 耦合类型 描述 非直接耦合 两个模块之间没有直接关系&#xff0c;它们之间的联系完全是通过主模块的控制和调用实现的 数据耦合 一组模块借助参数表传递简单数据 标记耦合 一组模块通过参数表传递记录信息&#xff08;数据结构&a…

数据名称:全球土地覆盖数据产品(GLASS-GLC)

数据详情 GLASS-GLC产品以1982&#xff5e;2015年的全球陆表特征参量数据集&#xff08;GLASS CDR&#xff09;为数据源&#xff0c;借助谷歌地球引擎&#xff08;Google Earth Engine&#xff09;平台进行开发&#xff0c;涵盖耕地、森林、草原、灌木、苔原、裸地和冰雪七大土…