当前位置: 首页 > backend >正文

Redis相关命令详解与原理

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.xdnf.cn/news/4438.html

相关文章:

  • 【Agent】使用 Python 结合 OpenAI 的 API 实现一个支持 Function Call 的程序,修改本机的 txt 文件
  • 如何检查 Watchtower 是否正常工作及更新未生效的排查方法【日常排错】
  • 探寻程序开发的个人密码
  • excel 批量导出图片并指定命名
  • Excel点击单元格内容消失
  • 龙虎榜——20250507
  • LVGL -meter的应用
  • phpstudy升级新版apache
  • 如何在金仓数据库KingbaseES中新建一个数据库?新建一个表?给表添加一个字段?
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】8.1 基础图表绘制(折线图/柱状图/散点图)
  • 把本地的文件拷贝到wsl的文件夹下或者 wsl读取本地的文件
  • 使用node.js创建一个简单的服务器
  • WD5040L、 7V 至 37V 的宽输入电压,输出电压范围为 3.3V 至 36V,6A输出、保护功能强,电源管理利器!
  • Redis的缓存穿透、缓存击穿和缓存雪崩
  • ai说什么是注解,并以angular ts为例
  • Go——项目实战
  • 【强化学习】强化学习算法 - 多臂老虎机问题
  • 精益数据分析(47/126):深挖UGC商业模式的关键要点与指标
  • 多模态大语言模型arxiv论文略读(六十二)
  • uniapp自定义底部导航栏h5有效果小程序无效的解决方案
  • 鞅与停时 - 一种特别的概率论问题
  • 讲解什么是快充诱骗协议芯片及它的工作原理和应用场景
  • 构建生命大模型,开拓教育新境界——启智书院举办十二周年庆典暨教育新生态跨界共拓峰会
  • 【存储管理—动态不等长存储资源分配算法】
  • 可执行文件格式(ELF格式)以及进程地址空间第二讲【Linux操作系统】
  • 【django.db.utils.OperationalError: unable to open database file】
  • Redis-黑马点评
  • 固件测试:mac串口工具推荐
  • 第1章 算法设计基础
  • draw.io流程图使用笔记