Redis1——基本命令及原理

文章目录

  • Redis1——基本命令及原理
    • 1. Redis原理
      • 1.1 特点
      • 1.2 数据类型及其存储方式
        • 1.2.1 **string** 字符串
        • 1.2.2 **list** 列表
        • 1.2.3 **hash** 哈希表
        • 1.2.4 **set** 集合
        • 1.2.5 **zset** 有序集合
    • 2. 基本命令及应用场景:
      • 2.1 Redis应用场景
      • 2.2 string——sds动态字符串
      • 2.3 list——双向循环链表
      • 2.4 hash——散列表
      • 2.5 set——无序集合
      • 2.6 zset——有序集合
    • 2. 如何设计kv
      • 2.1 如何设计key
    • 学习参考

Redis1——基本命令及原理

1. Redis原理

Redis是Remote Dictionary Service的简称,及远程字典服务。Redis是一个基于内存的存储键值对的非关系型数据库。

1.1 特点

  • 没有显式地创建和和删除数据结构地语句,当添加元素地时候自动创建,当删除元素时,如果集合为空,则自动删除数据结构。
  • 数据量少的时候,以存储效率高为主(ziplist),数据量大的时候以查询效率高为主(skiplist,dict)

1.2 数据类型及其存储方式

主要是指value指的数据结构:

1.2.1 string 字符串

存储结构:如果字符串可以表示为整数,且范围在64位二进制以内,则存储为整数,否则使用sds存储。

sds是一个能够动态扩容的内存安全的数组结构,当字符串长度不超过512M时使用它来存储。

如果字符串长度小于44字节,使用embstr编码(压缩编码),将redis对象结构与SDS分配在连续的内存中,减少内存碎片。

否则采用raw编码(普通编码),将redis对象结构与SDS分开存储,因此需要更多的内存分配和释放操作。

注意:redis的string是一个安全的二进制字符串。二进制指可以不存储为字符编码,安全是指保存了字符串的长度信息。

1.2.2 list 列表

存储结构:当节点总数小于等于512或者元素长度都不超过64字节时采用ziplist压缩列表。否则采用quicklist双向循环链表。

注意:保证插入有序。

1.2.3 hash 哈希表

存储结构:节点数量大于512(hash-max-ziplist-entries)或所有字符串长度大于64(hash-max-ziplist-value),则使用dict实现。

节点数量小于等于512且有一个字符串长度小于64,则使用ziplist实现。

注意:保存的元素为键值对,能够去重。

1.2.4 set 集合

存储结构:元素都为整数且元素数量小于等于512(set-max-intset-entries),则使用整数数组存储。否则使用dict。

注意:保存的元素为值,能够去重。

1.2.5 zset 有序集合

存储结构:节点数量大于128或者有一个字符串长度大于64,则使用跳表skiplist,否则使用压缩列表ziplist。

2. 基本命令及应用场景:

2.1 Redis应用场景

用于各种需要高效的临时存储和访问数据的场景。例如用作缓存中间件:缓存热点数据;用户标识信息等。

2.2 string——sds动态字符串

扩容策略:当长度小于1M时,加倍扩容;超过1M每次只扩容1M;字符串最大为512M。

存储内容:既可以存储字符串,也可以存储其它二进制数据,例如二进制协议数据protobuf等。

基本操作

# 赋值与查询
SET key val
SETNX key val	# 如果不存在才赋值
GET key
# 增加
INCR key	# 累加1
INCRBY key increment
# 减少
DECR key
DECRBY key decrement
# 删除各种类型的kv对
DEL key
# 查看值得数据类型
TYPE key

应用

作为位图使用

# 将其作为二进制数据,位图
SETBIT key offset value
BITCOUNT key start end
GETBIT key offset

对象存储

SET key '{"name":["li", "lou", "la"], "age": [21, 33, 12]}'

累加器

incr num
incrby num 100

分布式锁

# 获取锁
SET lock_key uuid NX EX 10

释放锁:lua脚本,保证原子性

if redis.call("GET", lock_key) == uuid then-- 成功释放return redis.call("DEL", KEYS[1])
else return 0
end

2.3 list——双向循环链表

列表首尾操作时间复杂度为O(1),中间元素操作时间复杂度为O(n)。

基本操作

LPUSH key e1 e2 ... en # 插入左侧
LPOP key [count] # 弹出左侧
RPUSH key e1 e2 ... en # 掺入右侧
RPOP key [count]
# 查询
LRANGE key start end
# 删除
LREM key count element
# 阻塞弹出,如果列表为空就等待
BRPOP k1 k2 ... kn timout
# 裁剪数据,只保留特定范围的数据
ltrim key start end

应用

栈(先进后出)

LPUSH + LPOP
# 或者
RPUSH + RPOP

队列(先进先出)

LPUSH + RPOP
# 或者
RPUSH + LPOP

阻塞队列

LPUSH + BRPOP
# 或者
RPUSH + BLPOP

异步消息队列

# 同队列操作,只是在不同的系统之间

获取固定窗口的数据记录

# 获取最近50条记录
LTRIM key 0 49

2.4 hash——散列表

数据类型为散列表,保存多个键值对,可以方便修改某个字段的值。

基本命令

# 赋值与查询
hset key f1 v1 f2 v2 ... fn vn
hmset key f1 v1 f2 v2 ... fn vn
hgetall key
hget key field# 递增
hincrby key field increment
# 查看键值对个数
hlen key
# 删除
hdel key field

应用

通常将hash与其它数据结构组合,完成业务功能


2.5 set——无序集合

基本命令

# 添加元素
SADD key m1 m2 ... mn
# 查看集合所有元素
SMEMBERS key
# 查询元素个数
SCARD key# 查询集合中是否存在某个元素
SISMEMBER key member
# 从集合中随机返回一个或多个元素,但不删除
SRANDMEMBER key [count]
# 从集合中随机删除一个或多个元素
SPOP key [count]# 做差集
SDIFF key [key ...]
# 做交集
SINTER key [key ...]
# 做并集
SUNION key [key ...]

应用

抽奖

srandmember key 10

共同关注的人

sinter key1 key2

推荐好友

sdiff john tom # 将john的好友推荐给tom

2.6 zset——有序集合

基础命令

# 插入元素
ZADD key [NX|XX] [CH] [INCR] s1 m1 s2 m2 ... sn mn
# 删除元素
ZREM key m1 m2 ... mn
ZREMRANGEBYSCORE key min max
# 返回score
ZSCORE key member
# 修改score
ZINCRBY key increment member
# 返回元素个数
ZCARD key
# 返回排名
ZRANK key member
# 返回排名范围的member,默认时从小到大排序
ZRANGE key start stop [WITHSCORES]
# 逆序返回
ZREVRANGE key start stop [WITHSOCRES]

应用

排行榜

ZINCRBY players 13 adam
# 返回分数最大前10位player
ZREVRANGE players 0 9 withscores

延时队列

使用zset保存消息,其score为到期时间,这样可以轮询zset将到期的消息取出处理。

def delay(msg):msg.id = str(uuid.uuid4())value = json.dumps(msg)retry_ts = time.time() + 5redis.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)

分布式定时器

image-20241126192125666

生产者将定时任务利用hash分配到不同的redis中,每个redis有一个dispather进程,不断从中获取到期的定时任务并发布到不同的消费者中。

时间窗口限流

限定用户的某个行为在指定的可动态变化的时间范围内最多发生N次

local function is_action_allowed(res, 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)-- 设置过期时间red:expire(key, period + 1)local res = red:commit_pipeline()return res[3] <= max_count
end

2. 如何设计kv

2.1 如何设计key

对于单个功能的单个key,使用有意义的名字

SET name lee

对于相同功能的多个key,使用有意义的字段并用冒号分隔。

SETBIT sign:lee:202410 12 1

学习参考

学习更多相关知识请参考零声 github。

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

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

相关文章

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

python学opencv|读取图像

【1】引言 前序学习了使用matplotlib模块进行画图&#xff0c;今天开始我们逐步尝试探索使用opencv来处理图片。 【2】学习资源 官网的学习链接如下&#xff1a; OpenCV: Getting Started with Images 不过读起来是英文版&#xff0c;可能略有难度&#xff0c;所以另推荐一…

数据结构 ——— 归并排序算法的实现

目录 归并排序的思想 归并排序算法的实现 归并排序的思想 将已经有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序后&#xff0c;再使子序列段间有序 若将两个有序表合并成一个有序表&#xff0c;称为二路归并 归并排序步骤示意图&#x…

Springboot项目搭建(6)-前端登录跳转与Pinia实用

1.添加响应错误拦截 文件地址&#xff1a;src\utils\request.js import axios from axios import { ElMessage } from element-plus const baseURL /api const instance axios.create({baseURL}) //添加拦截器 instance.interceptors.response.use(result>{&#x1f447…

多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测

多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现TCN-LSTM时间卷积神经网络结合长短期记忆神经网络多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现…

C++网络编程:select IO多路复用及TCP服务器开发

C网络编程&#xff1a;使用select实现IO多路复用 一、什么是 IO 多路复用&#xff1f;二、IO多路复用器 select三、相关接口3.1、fd_set 结构体3.2、宏和函数 四、select 实现 TCP 服务器五、总结 一、什么是 IO 多路复用&#xff1f; 在网络编程中&#xff0c;最容易想到的并…

HDU Go Running(最小点覆盖 + 网络流优化)

题目大意&#xff1a;有一条无限长跑道&#xff0c;每个人可以规定自己跑步的方向&#xff0c;起点&#xff0c;跑步起止时间。每个人跑步的速度都是1m/s。最后从监控人员哪里得到了n个报告&#xff0c;每个报告给出了某人在某一时候所在的位置&#xff0c;问跑步的最少可能人数…

28.UE5实现对话系统

目录 1.对话结构的设计&#xff08;重点&#xff09; 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图&#xff0c;也就是下图中的…

Reachy 2,专为AI与机器人实验室打造的卓越开源双臂移动操作平台!

近期&#xff0c;花粉机器人&#xff08;POLLEN ROBOTICS&#xff09;隆重推出Reachy 2仿生机器人——下一代开源操作平台&#xff0c;为AI与机器人实验室带来理想的双臂移动操作科研平台&#xff01; Reachy 2的仿生性&#xff1a; 》拥有两个基于Maxon无刷电机的仿生7自由度…

python的openpyxl库设置表格样式:字体/边框/对齐/颜色等

学习目录 1. 安装和使用openpyxl库设置表格样式 2 设置字体font 3 设置边框 4 设置对齐方式 5 设置单元格数据格式 6 设置行高和列宽 7 填充单元格颜色 附录-关于颜色说明 本章节主要介绍如何使用openpyxl库设置表格中的一些样式&#xff0c;比如字体&#xff0c;边框…

Git旧文件覆盖引发思考

一天&#xff0c;我的同事过来找到我&#xff0c;和我讲&#xff1a;张叫兽&#xff0c;大事不好&#xff0c;我的文件被人覆盖了。git是真的不好用啊 git不好用&#xff1f;文件被覆盖&#xff1b;瞬间我似乎知道了什么&#xff0c;让我想到了某位男明星的语法&#xff1a;他…

QSqlTableModel的使用

实例功能 这边使用一个实例显示数据库 demodb 中 employee 数据表的内容&#xff0c;实现编辑、插入、删除的操作&#xff0c;实现数据的排序和记录过滤&#xff0c;还实现 BLOB 类型字段 Photo 中存储照片的显示、导入等操作&#xff0c;运行界面如下图&#xff1a; 在上图中…

什么是代理,nodenginx前端代理详解

一. 什么是代理&#xff1f; 代理就是通过一个特殊的网络服务去访问另一网络服务的一种间接访问方式。像我们不能直接访问国外的网站&#xff0c;只能使用VPN&#xff0c;就是使用了代理 二. 前端为什么要用代理&#xff1f; 首先明确以下两个概念 &#xff08;1&#xff09…

java脚手架系列16-AI大模型集成

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据&#xff0c;这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难&#xff0c;常常导致疏忽。以前&#xff0c;公司依靠 FUD 方法&#xff08;恐惧、不确定性和怀疑&#xff09;来识别潜在攻击。然而&#xff0c;将数据科学集成到网络安全中…

【算法day1】数组:双指针算法

题目引用 这里以 1、LeetCode704.二分查找 2、LeetCode27.移除元素 3、LeetCode977.有序数组的平方 这三道题举例来说明数组中双指针的妙用。 1、二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜…

open-instruct框架使用记录:只使用huggingface数据集的小部分进行训练,如何修改dataset_info.json文件

open-instruct框架 这篇笔记主要记录以下问题&#xff1a;只使用huggingface下载的数据集中的一小部分数据进行数据训练。而且我不想修改open-instruct的加载数据集的代码&#xff0c;以及脚本中的--dataset_mixer_list参数的指定等。下面是我的思路历程。 if args.dataset_na…

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后&#xff0c;后台无法启动jenkins服务&#xff0c;服务状态如下&#xff1a; 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…

DRM(数字权限管理技术)防截屏录屏----ffmpeg安装

提示&#xff1a;ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…

Unity版本使用情况统计(更新至2024年11月)

UWA发布&#xff5c;本期UWA发布的内容是第十五期Unity版本使用统计&#xff0c;统计周期为2024年5月至2024年11月&#xff0c;数据来源于UWA网站&#xff08;www.uwa4d.com&#xff09;性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势作为参考。 2024年5月 - 2024年…