Redis相关命令详解与原理(一)

目录

Redis是什么?

Redis 的特点和功能

Redis工作模式 

与MySQL的区别 

安装编译和启动

 redis的value类型编码

string类型

基础命令

应用

1.对象存储

2.累加器

3.分布式锁

4.位运算

list类型

基础命令

应用

1.栈(先进后出 FILO)

2.队列(先进先出 FIFO)

3.阻塞队列(blocking queue)

4.异步消息队列

5.获取固定窗口记录

hash类型

基础命令

存储结构

应用

1.存储对象

set类型

基础命令

存储结构

应用

1.抽奖

2.共同关注

3.推荐好友

zset类型

基础命令

存储结构

应用

1.百度热榜


Redis是什么?

        Redis 是Remote Dictionary Server(Redis) 的缩写,是一个使用 C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型的Key-Value数据库,并提供多种语言的API。

       它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库,可以用作数据库、缓存、消息中间件、分布式锁等。

Redis 的特点和功能

  • 性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS(每秒查询量)。
  • 单进程单线程,是线程安全的,采用 IO 多路复用机制。
  • 丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
  • 支持数据持久化。
  • 可以将内存中数据保存在磁盘中,重启时加载。
  • 主从复制,哨兵,高可用。
  • 可以用作分布式锁。
  • 可以作为消息中间件使用,支持发布订阅

Redis工作模式 

        Redis 基于 客户端-服务器模型

客户端发送请求(如 GET、SET)
→ Redis 处理请求(在内存中)
→ Redis 立即返回响应(低延迟)

与MySQL的区别 

RedisMySQL
数据类型支持字符串、哈希、列表、集合、有序集合等丰富数据类型主要有整型、浮点型、字符型、日期时间型等
存储方式主要是内存(读写速度快,适合缓存)磁盘(速度相对较慢,适合存储)
使用场景缓存、排行榜、消息队列持久化存储、复杂查询
支持事务基础事务支持 完整事务机制(ACID)
数据持久化提供RDB和AOF等,但并非实时持久化实时持久化

安装编译和启动

git clone https://gitee.com/mirrors/redis.git -b 6.2cd redismakemake testmake install# 默认安装在 /usr/local/bin# redis-server 是服务端程序
# redis-cli 是客户端程序mkdir redis-data# 把redis文件夹下 redis.conf 拷贝到 redis-data# 修改 redis.conf# requirepass 修改密码 123456# daemonize yescd redis-dataredis-server redis.conf# 通过 redis-cli 访问 redis-serverredis-cli -h 127.0.0.1 -a 123456

 redis的value类型编码

        Redis 会根据 数据的类型 + 内容大小 + 特性 来动态的选择最优的编码方式,即省内存又加快速度。

string类型
编码方式长度规定
int字符串长度小于等于 20 且能转成整数
embstr字符串长度小于等于 44
raw字符串长度大于 44
基础命令
命令    功能说明
SET key value设置键的值
GET key获取键的值
SETEX key seconds value设置键并指定过期时间
INCR key/ DECR key 数值型累加 / 累减
INCRBY key n/ DECRBY key n按指定数值增减
APPEND key value 追加内容到原字符串
STRLEN key获取字符串长度
GETRANGE key start end获取指定范围的子串
SETRANGE key offset value替换子串
应用
1.对象存储
SET role:10001 '{["name"]:"kk",["sex"]:"male",["age"]:30}'SET role:10002 '{["name"]:"mm",["sex"]:"male",["age"]:30}'# 极少修改,对象属性字段很少改变的时候
GET role:10001
2.累加器
#统计阅读数  累计加1
incr reads
# 累计加100
incrby reads 100
3.分布式锁
# 加锁   加锁 和 解析  redis 实现是 非公平锁     ectd zk  用来实现公平锁
# 阻塞等待   阻塞连接的方式
# 介绍简单的原理: 事务
setnx lock 1   # 不存在才能设置 定义加锁行为  占用锁  
setnx lock uuid  # expire 30 过期
set lock uuid nx ex 30# 释放锁
del lockif (get(lock) == uuid)del(lock);
4.位运算
# 猜测一下 string 是用的 int 类型 还是 string 类型
# 月签到功能 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

list类型

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

        列表中数据是否压缩的依据:

  •         元素长度小于 48,不压缩;
  •         元素压缩前后长度差不超过 8,不压缩;
基础命令
命令功能说明
LPUSH key value从左侧插入
RPUSH key value从右侧插入
LPOP key弹出左边第一个元素
RPOP key弹出右边第一个元素
LRANGE key start stop获取指定范围内的元素
LLEN key获取列表长度
LREM key count value删除指定值的元素(count 为次数)
LTRIM key start stop截取指定范围,保留该范围
LSET key index value设置索引位置的值
LINDEX key index获取指定索引的元素
BLPOP key [key2...] timeout阻塞式左弹出
BRPOP key [key2...] timeout阻塞式右弹出
应用
1.栈(先进后出 FILO)
LPUSH + LPOP
# 或者
RPUSH + LPOP
2.队列(先进先出 FIFO)
LPUSH + RPOP
# 或者
RPUSH + LPOP
3.阻塞队列(blocking queue)
LPUSH + BRPOP
# 或者
RPUSH + BLPOP
4.异步消息队列
#结合生产/消费模型,通过 List 实现轻量级消息队列,支持异步处理和消费速度差异
# 生产者写入日志消息
RPUSH logs:system "log1"
RPUSH logs:system "log2"# 消费者阻塞式读取
BLPOP logs:system 0
5.获取固定窗口记录
#每次登录都插入新记录,只保留前 N 条,模拟滑动窗口效果
LPUSH login:user:1001 "2025-04-15T10:00"
LTRIM login:user:1001 0 4    # 保留最近5条

hash类型

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

基础命令
命令功能说明
HSET key field value设置哈希表字段的值
HGET key fileld 获取哈希表字段的值
HDEL key field删除一个或多个字段
HEXISTS key field判断哈希表中所有字段和值
HGETALL key获取哈希表中所有字段和值
HKEYS key获取所有字段名
HVALS key获取所有字段值
HMSET key field value1 field value2批量设置字段值
HMGET key field1 field2 ...批量获取字段值
HLEN key获取字段数量
HINCRBY key field increment整数值自增
HINCRBYFLOAT key field increment浮点数值自增
存储结构

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

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

应用
1.存储对象
#一个 key 代表一个对象,多个 field 对应字段名,模拟关系型数据库中一行记录
HSET user:1001 name "Alice"
HSET user:1001 age "24"
HSET user:1001 email "alice@example.com"
HGETALL user:1001

set类型

        集合;用来存储唯一性字段,不要求有序

基础命令
命令功能说明
SADD key member [member ...]添加一个或多个元素到集合中
SREM key member [member ...]移除一个或多个元素
SISMEMBER key member判断元素是否存在
SCARD key获取集合元素数量
SMEMBERS key返回集合中所有元素
SRANDMEMBER key [count]随机返回一个或多个元素
SPOP key [count]随即弹出元素
SMOVE source destination member将元素从一个集合移动到另一个集合
SDIFF key1 key2

返回 key1 有但 key2 没有的元素

SINTER key1 key2返回 key1 和 key2 的交集
SUNION key1 key2返回两个集合的并集
存储结构
  •      元素都为整数且节点数量小于等于 512(set-max-intset-entries),则使用整数数组存储;
  •      元素当中有一个不是整数或者节点数量大于 512,则使用字典存储;
应用
1.抽奖
# 添加抽奖用户sadd Award:1 10001 10002 10003 10004 10005 10006sadd Award:1 10009# 查看所有抽奖用户smembers Award:1# 抽取多名幸运用户srandmember Award:1 10
2.共同关注
 sadd follow:A mark king darren mole vicosadd follow:C mark king darrensinter follow:A follow:C
3.推荐好友
 sadd follow:A mark king darren mole vicosadd follow:C mark king darren# C可能认识的人:sdiff follow:A follow:C

zset类型

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

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

        节点数量大于 128 或者有一个字符串长度大于 64,则使用跳表(skiplist);

         节点数量小于等于 128(zset-max-ziplist-entries)且所有字符串长度小于等于 64(zset-max ziplist-value),则使用 ziplist 存储;

  •         数据少的时候,节省空间; $O(n)$
  •         数量多的时候,访问性能;$O(1)$ or $O(log_{2}{n})$
应用
1.百度热榜

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

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

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

相关文章

Starrocks 的 ShortCircuit短路径

背景 本文基于 Starrocks 3.3.5 本文主要来探索一下Starrocks在FE端怎么实现 短路径,从而加速点查查询速度。 在用户层级需要设置 enable_short_circuit 为true 分析 数据流: 直接到StatementPlanner.createQueryPlan方法: ... OptExpres…

Oracle非归档模式遇到文件损坏怎么办?

昨天夜里基地夜班的兄弟,打电话说有个报表库连不上了,赶紧起来连上VPN查看一下,看到实例宕机了,先赶紧startup起来。 1.查看报错信息 环境介绍:Redhat 6.9 Oracle 11.2.0.4 No Archive Mode 查看alert log 关键报…

关于一些平时操作系统或者软件的步骤转载

关于一些平时操作系统或者软件的步骤转载 关于python环境搭建 关于Ubuntu 1. 双系统之Ubuntu快速卸载 2. VMware安装Ubuntu虚拟机实现COpenCV代码在虚拟机下运行教程 3. ubuntu 下 opencv的安装以及配置(亲测有效) 4. Ubuntu将c编译成.so文件并测试 5…

hz2新建Keyword页面

新建一个single-keywords.php即可,需要筛选项再建taxonomy-knowledge-category.php 参考:https://www.tkwlkj.com/customize-wordpress-category-pages.html WordPress中使用了ACF创建了自定义产品分类products,现在想实现自定义产品分类下的…

VRRP协议-IP地址冗余配置

有两个服务器172.16.42.1和172.16.42.121,通过VRRP协议使两台设备共用一个虚拟地址172.16.42.100,当 172.16.42.1 可用时,它会作为主路由器使用虚拟 IP 地址;当它不可用时,172.16.42.121 会接管虚拟 IP 地址&#xff0…

21、DeepSeekMath论文笔记(GRPO)

DeepSeekMath论文笔记 0、研究背景与目标1、GRPO结构GRPO结构PPO知识点**1. PPO的网络模型结构****2. GAE(广义优势估计)原理****1. 优势函数的定义**2.GAE(广义优势估计) 2、关键技术与方法3、核心实验结果4、结论与未来方向关键…

卡尔曼滤波算法(C语言)

此处感谢华南虎和互联网的众多大佬的无偿分享。 入门常识 先简单了解以下概念:叠加性,齐次性。 用大白话讲,叠加性:多个输入对输出有影响。齐次性:输入放大多少倍,输出也跟着放大多少倍 卡尔曼滤波符合这…

SolidWork-2023 鼠標工程

地址 https://github.com/MartinxMax/SW2023-Project/tree/main/mouse 鼠標

vue 组件函数式调用实战:以身份验证弹窗为例

通常我们在 Vue 中使用组件&#xff0c;是像这样在模板中写标签&#xff1a; <MyComponent :prop"value" event"handleEvent" />而函数式调用&#xff0c;则是让我们像调用一个普通 JavaScript 函数一样来使用这个组件&#xff0c;例如&#xff1a;…

Vite Proxy配置详解:从入门到实战应用

Vite Proxy配置详解&#xff1a;从入门到实战应用 一、什么是Proxy代理&#xff1f; Proxy&#xff08;代理&#xff09;是开发中常用的解决跨域问题的方案。Vite内置了基于http-proxy的代理功能&#xff0c;可以轻松配置API请求转发。 二、基础配置 在vite.config.js中配置…

图像画质算法记录(前言)

一、背景介绍 本篇主要是对图像画质增强相关&#xff0c;进行简单整理和记录。 二、整体流程 整体效果主要受到两部分影响&#xff1a; 1、前端isp处理。 2、后端画质增强。 三、isp常规流程 可以参考&#xff1a;刘斯宁&#xff1a;Understanding ISP Pipeline 四、后端画质…

Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType)

Qt 中信号与槽&#xff08;signal-slot&#xff09;机制支持 多种连接方式&#xff08;ConnectionType&#xff09; Qt 中信号与槽&#xff08;signal-slot&#xff09;机制支持 多种连接方式&#xff08;ConnectionType&#xff09;&#xff0c;用于控制信号发出后如何调用槽…

卷积神经网络实战(4)代码详解

目录 一、导包 二、数据准备 1.数据集 2. 标准化转换(Normalize) 3.设置dataloader 三、定义模型 四、可视化计算图&#xff08;不重要&#xff09; 五、评估函数 六、Tensorboard 一、导包 import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib i…

深入解析进程地址空间:从虚拟到物理的奇妙之旅

深入解析进程地址空间&#xff1a;从虚拟到物理的奇妙之旅 前言 各位小伙伴&#xff0c;还记得我们之前探讨的 fork 函数吗&#xff1f;当它返回两次时&#xff0c;父子进程中同名变量却拥有不同值的现象&#xff0c;曾让我们惊叹于进程独立性与写时拷贝的精妙设计。但你是否…

opencv处理图像(二)

接下来进入到程序线程设计部分 我们主线程负责图形渲染等操作&#xff0c;OpenGL的限制&#xff0c;opencv技术对传入图像加以处理&#xff0c;输出预期图像给主线程 QThread 我之前也是在想给opencv开一个专门的线程&#xff0c;但经过了解有几个弊端&#xff0c;第一资源浪…

学习threejs,使用Physijs物理引擎

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…

ARCGIS PRO DSK 选择坐标系控件(CoordinateSystemsControl )的调用

在WPF窗体上使用 xml&#xff1a;加入空间命名引用 xmlns:mapping"clr-namespace:ArcGIS.Desktop.Mapping.Controls;assemblyArcGIS.Desktop.Mapping" 在控件区域加入&#xff1a; <mapping:CoordinateSystemsControl x:Name"CoordinateSystemsControl&q…

LangGraph(三)——添加记忆

目录 1. 创建MemorySaver检查指针2. 构建并编译Graph3. 与聊天机器人互动4. 问一个后续问题5. 检查State参考 1. 创建MemorySaver检查指针 创建MemorySaver检查指针&#xff1a; from langgraph.checkpoint.memory import MemorySavermemory MemorySaver()这是位于内存中的检…

深入理解Mysql

BufferPool和Changebuffer是如何加快读写速度的? BufferPool 在Mysql启动的时候 Mysql会申请连续的空间来存储BufferPool 每个页16kb 当控制块不足以存储信息的时候就会向后申请一个新的页 每个控制块都对应了一个缓存页 控制块占chunk的百分之5左右 LRU链表 Changebuffer …

Python核心编程深度解析:作用域、递归与匿名函数的工程实践

引言 Python作为现代编程语言的代表&#xff0c;其作用域管理、递归算法和匿名函数机制是构建高质量代码的核心要素。本文基于Python 3.11环境&#xff0c;结合工业级开发实践&#xff0c;深入探讨变量作用域的内在逻辑、递归算法的优化策略以及匿名函数的高效应用&#xff0c…