Redis(七):Redis基础入门

news2025/1/9 1:44:26

Redis基础入门

    • Redis用途
    • Redis优缺点
    • docker运行Redis
    • Redis常用命令
      • String命令
      • Hash命令
      • List命令
      • Set命令
      • ZSet命令
      • 全局命令
    • Redis事务
    • Redis持久化机制
      • RDB
      • AOF
      • RDB+AOF(默认)
    • Redis内存淘汰机制
    • Redis对过期Key的处理

Redis用途

Redis是一种开源的NoSQL内存数据库,用于高性能的数据存储和访问。Redis支持多种数据类型,包括字符串、哈希、列表、集合和有序集合,并且支持分布式存储和操作。Redis的特点包括快速、高可用和易扩展等,适用于各种应用场景。

用途:缓存、消息队列、分布式锁、计数器、数据库、分布式缓存、实时统计、推荐系统、热点数据存储、地理位置存储、时序数据存储等

Redis优缺点

  • 优点:
    • 快速:Redis使用内存存储数据,读写速度非常快。
    • 多种数据类型:Redis支持多种数据结构,可以适应不同的应用场景。
    • 丰富的特性:Redis支持事务、Lua脚本、发布订阅模式等高级特性。
    • 可扩展性:Redis可以通过主从复制、哨兵模式和集群模式等方式实现高可用和横向扩展。
  • 缺点:
    • 内存限制:由于Redis使用内存存储数据,因此受到内存容量的限制。
    • 持久化问题:Redis默认不会将数据持久化到硬盘,需要使用持久化机制来解决数据丢失问题。
    • 单线程模型:Redis采用单线程模型,虽然可以通过多实例和多线程方式解决并发问题,但是并发能力相对较弱。

docker运行Redis

$ docker run -d -p 6379:6379 --name="local-redis" redis --requirepass 123456

Redis常用命令

String命令

相当于Map<?, ?>

-- $ set key value
set age 18

-- $ setnx key value
-- 如果key存在,value不存在,则赋值
-- 如果key存在,value存在,则不做处理
-- 如果key不存在,则添加key-value
setnx name Tom

-- $ setex key seconds value 设置key-value在seconds秒后失效value变为null
setex name 10 Lee

-- $ ttl key 查看key存活时间
ttl name

-- $ del key
del name

-- $ get key
get age

-- $ incr key 自加1
incr age

-- $ decr key 自减1
decr age

-- $ incrby key increment 将key对应的value自增increment
incrby age 10

-- $ mset k1 v1 k2 v2 k3 v3 ... 批量添加key-value
mset name Tom age 18 sex 1

-- $ mget k1 k2 k3 ... 批量获取key的value
mget name age sex

-- $ append key value 在key对应的value值上拼接value
append name ,World

-- $ setrange key offset value 从offset索引处开始逐字符串替换key所对应的value值
setrange name 6 Lee

Hash命令

相当于Map<?, Map<?, ?>>

-- $ hset key field value 将field-value放到Redis中,键为key
hset user name Lee

hget user name

-- $ hexists key field 判断key中的field是否存在
hexists user age

hdel user name

hincrby user age 10

-- $ hlen key 返回key中field的数量
hlen user

-- $ hkeys key 获取key下所有的field值
hkeys user

-- $ hvals key 获取key下所有的value值
hvals user

-- $ hgetall key 获取key下所有的field-value值
hgetall user

List命令

相当于Map<?, List>

-- $ rpush key value 从右开始向key中添加value值
rpush name Lee
rpush name Tom

-- $ lpush key value 从左开始向key中添加value值
lpush name zhangsan

-- $ lrange key start stop 从左开始遍历key所对应的value值
lrange name 0 2

-- $ lpop key 删除key中最左侧的value并返回删除的value
lpop name

-- $ rpop key 删除key中最右侧的value并返回删除的value
rpop name

-- $ llen key 获取key所对应的value长度
llen name

-- $ linsert key before pivot value 操作key对应的value队列,在pivot值之前插入value值
linsert name before Lee Hello

-- $ linsert key after pivot value 操作key对应的value队列,在pivot值之后插入value值
linsert name after Lee World

-- $ lset key index value 操作key对应的value队列,修改索引为index的value值
lset name 2 Hello,World

-- $ lrem key count value 操作key对应的value队列,删除count个值为value的元素
lrem name 3 Tom

-- $ ltrim key start stop 操作key对应的value队列,截取start到stop内的元素作为value值
ltrim name 2 4

-- $ lindex key index 操作key对应的value队列,获取index索引下value的值
lindex name 2

Set命令

相当于Map<?, Set>

-- $ sadd key members[...] 向key中添加多个member元素
sadd name a b c
sadd name1 Tom Lee ZhangSan XiaoMing
sadd name2 XiaoLiu Tom Lee XiXi

-- $ smembers key 遍历key集合中的所有元素
smembers name

-- $ srem key members[...] 删除key集合中的多个member元素
srem name a b d

-- $ spop key count 随机删除key集合中的count个元素,并返回删除的元素
spop name 3

-- $ sdiff key1 key2 返回key2集合中没有的key1集合中的元素(差集) ZhangSan XiaoMing
sdiff name1 name2

-- $ sdiffstore key key1 key2 将key2集合中没有的key1集合中的元素放到key集合中
sdiffstore name name1 name2

-- $ sinter key1 key2 返回key1 key2集合的交集
sinter name1 name2

-- $ sinterstore key key1 key2 将key1 key2集合的交集放到key集合中
sinterstore name name1 name2

-- $ sunion key1 key2 返回key1 key2集合的并集
sunion name1 name2

-- $ sunionstore key key1 key2 将key1 key2集合的并集放到key集合中
sunionstore name name1 name2

-- $ srandmember key count 随机获取key集合中的count个元素
srandmember name 3

-- $ sismember key member 判断member元素是否在key集合中
sismember name Tom

-- $ smove key1 key2 member 将key1集合中的member元素移动到key2集合中
smove name1 name2 XiaoMing

ZSet命令

相当于带有排序的Map<?, Set>

-- $ zadd key score member score member ... 按score排序将member元素添加到key集合中
zadd name 1 熊大 3 张三 5 王五 7 孙七 9 吴九 2 熊二 4 李四 6 赵六 8 周八 0 郑十

zadd name 1 熊大
zadd name 3 张三
zadd name 5 王五
zadd name 7 孙七
zadd name 9 吴九
zadd name 2 熊二
zadd name 4 李四
zadd name 6 赵六
zadd name 8 周八
zadd name 0 郑十

-- $ zincrby key increment member 将key集合中的member元素排名分数增加increment
zincrby name 10 郑十

-- $ zcard key 返回key集合中元素个数
zcard name

-- $ zrank key member 返回key集合中member元素的正序排名
zrank name 周八

-- $ zrevrank key member 返回key集合中member元素的倒序排名
zrevrank name 周八

-- $ zscore key member 返回key集合中member元素的分数
zscore name 郑十

-- $ zrange key start stop [withscores] 返回key集合中start到stop的元素并进行升序,withscores显示分数
zrange name 0 9 withscores
zrange name 0 -1 withscores

-- $ zrevrange key start stop [withscores] 返回key集合中start到stop的元素并进行倒序,withscores显示分数
zrevrange name 3 8 withscores

-- $ zrangebyscore key min max [withscores] 返回[min, max]分数范围内key集合中的元素(正序)
zrangebyscore name 3 7 withscores

-- $ zrevrangebyscore key max min [withscores] 返回[min, max]分数范围内key集合中的元素(倒序)
zrevrangebyscore name 7 2 withscores

-- $ zrem key member 删除key集合中的member元素
zrem name 郑十

-- $ zremrangebyscore key min max 删除[min, max]分数范围内key集合中的元素
zremrangebyscore name 3 7

-- $ zremrangebyrank key start stop 删除[start, stop]排名范围内key集合中的元素
zremrangebyrank name 3 7

-- $ zcount key min max 返回key集合中分数在[min, max]范围内的元素个数
zcount name 3 7

全局命令

-- 查看Redis中的key
keys *
keys *a*

-- 判断key是否存在
exists name

-- 为key添加过期时间
expire name 10

-- 取消key过期时间
persist name

-- 切换数据库,默认为0
select 2

-- 将key移动到指定数据库
move name 0

-- 随意返回一个key
randomkey

-- 修改name1为name0
rename name1 name0

-- 打印信息
echo Hi,Lee

-- 查看key个数
dbsize

-- 查看redis信息
info

-- 查看所有redis配置信息
config get *

-- 清空当前数据库
flushdb

-- 清空所有数据库
flushall

Redis事务

在这里插入图片描述

-- 开始事务
multi
-- 命令入队
sadd name "Tom" "Lee" "ZhangSan" "XiaoMing"
smembers name
-- 执行事务
exec

Redis持久化机制

持久化是指将数据写入持久存储,例如固态硬盘(SSD)

RDB

以指定的时间间隔执行数据集的时间点快照

  • 手动触发方式

    • save 同步阻塞主进程,只有等save完后成,才能进行新操作
    • bgsave fork的子进程,非阻塞,等执行完后会通知主进程,然后关闭子进程
  • 自动触发方式

    • save m nm秒内数据集存在n次修改时自动触发bgsave命令
      在这里插入图片描述
  • 优点

    • RDB是Redis数据的一个非常紧凑的单文件时间点表示。RDB文件非常适合备份。
      • 例如,您可能希望在最近的24小时内每小时归档一次RDB文件,并在30天内每天保存一个RDB快照。这使您能够在发生灾难时轻松恢复不同版本的数据集。
    • RDB非常适合灾难恢复,它是一个紧凑的文件,可以传输到远程数据中心或AmazonS3(可能是加密的)。
    • RDB最大限度地提高了Redis的性能,因为Redis父进程要想持久化,唯一需要做的工作就是派生一个子进程来完成其余的工作。父进程永远不会执行磁盘I/O或类似操作。
    • 与AOF相比,RDB允许使用大数据集更快地重新启动。
    • 在副本上,RDB支持重新启动和故障切换后的部分重新同步。
  • 缺点

    • 如果您需要在Redis停止工作(例如停电后)的情况下将数据丢失的可能性降至最低,那么RDB就不好了。您可以在生成RDB的位置配置不同的存储点(例如,在对数据集进行至少五分钟和100次写入之后,您可以拥有多个存储点)。然而,您通常每五分钟或更长时间创建一个RDB快照,因此,如果Redis在没有正确关闭的情况下停止工作,您应该做好丢失最近几分钟数据的准备。
    • RDB经常需要fork(),以便使用子进程在磁盘上持久化。如果数据集很大,fork()可能会很耗时,并且可能导致Redis在数据集很大且CPU性能不好的情况下停止为客户端服务几毫秒甚至一秒钟。AOF也需要fork(),但频率较低,并且您可以调整重写日志的频率,而不需要在耐久性方面进行任何权衡。

AOF

记录服务器接收到的每个写入操作,然后,可以在服务器启动时再次重播这些操作,从而重建原始数据集,使用与Redis协议本身相同的格式记录命令

在这里插入图片描述

  • appendonly

    • no 关闭AOF
    • yes 开启AOF
  • appendfsync

    • always 收到命令就立即写入到磁盘中,效率最慢,但能保证完全的持久化
    • everysec 每秒写入磁盘一次,在性能和持久化方面做了很好的折中
    • no 完全依赖os,一般同步周期为30秒
  • 优点

    • 使用 AOF Redis 更加耐用:您可以有不同的 fsync 策略:根本不进行 fsync、每秒进行 fsync、每次查询时进行 fsync。 采用每秒fsync的默认策略,写入性能仍然很棒。 fsync 是使用后台线程执行的,当没有 fsync 正在进行时,主线程将努力执行写入,因此您只能丢失一秒钟的写入。
    • AOF 日志是仅追加日志,因此不会出现查找问题,并且在断电时也不会出现损坏问题。 即使由于某种原因(磁盘已满或其他原因)日志以半写命令结束,redis-check-aof 工具也能够轻松修复它。
    • 当 AOF 太大时,Redis 能够在后台自动重写 AOF。 重写是完全安全的,因为当 Redis 继续追加到旧文件时,会使用创建当前数据集所需的最少操作集生成一个全新的文件,一旦第二个文件准备就绪,Redis 就会切换这两个文件并开始追加到 新的那一个。
    • AOF 以一种易于理解和解析的格式依次包含所有操作的日志。 您甚至可以轻松导出 AOF 文件。 例如,即使您不小心使用 FLUSHALL 命令刷新了所有内容,只要在此期间没有执行日志重写,您仍然可以通过停止服务器、删除最新命令并重新启动 Redis 来保存数据集 再次。
  • 缺点

    • 对于相同的数据集,AOF 文件通常比等效的 RDB 文件大。
    • AOF 可能比 RDB 慢,具体取决于确切的 fsync 策略。 一般来说,将 fsync 设置为每秒一次的性能仍然非常高,并且禁用 fsync 后,即使在高负载下,它也应该与 RDB 一样快。 即使在巨大的写入负载的情况下,RDB仍然能够对最大延迟提供更多的保证。

RDB+AOF(默认)

混合模式

在这里插入图片描述

Redis内存淘汰机制

LRULFUTTL随机淘汰

在这里插入图片描述

  • noeviction(默认):达到内存限制时不会保存新值。当数据库使用复制时,这适用于主数据库
  • allkeys-lru:保留最近使用的密钥,删除最近最少使用 (LRU) 的键
  • allkeys-lfu:保留常用的键,删除最不常用 (LFU) 的键
  • volatile-lru:删除最近最少使用的键,并将过期字段设置为 true
  • volatile-lfu:删除最不常用的键,并将过期字段设置为 true
  • allkeys-random:随机删除键,为新添加的数据腾出空间
  • volatile-random:随机删除过期字段设置为 true 的键
  • volatile-ttl:删除过期字段设置为 true 且剩余生存时间 (TTL) 值最短的密钥

Redis对过期Key的处理

Redis服务器使用的是 惰性删除定期删除 两种策略,通过配合使用这两种策略,可以很好的在 合理使用CPU避免内存浪费 之前取得平衡

  • 惰性删除:当访问key时,才判断是否过期,过期则删除(对CPU友好,但如果一个key长期不用,一直在内存中,会造成内存浪费)
  • 定时删除:设置键的过期时间的同时,创建一个定时器,当达到过期时间点时,立即执行key的删除操作(对CPU不友好,需要让CPU维护定时器)
  • 定期删除:隔一段时间,对数据进行一次检查,删除里面过期的key(至于删除多少过期key,检查多少数据,则由算法决定)

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

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

相关文章

【MySql】多版本并发控制MVCC前置知识——隐藏字段、undo日志与Read View

文章目录 3个记录隐藏列字段undo日志模拟 MVCCRead View 数据库并发的场景有三种&#xff1a; 读-读 &#xff1a;不存在任何问题&#xff0c;也不需要并发控制 读-写 &#xff1a;有线程安全问题&#xff0c;可能会造成事务隔离性问题&#xff0c;可能遇到脏读&#xff0c;幻读…

UOS系统下搭建qtcreator编译环境

文章目录 前言一、依赖包说明二、No valid kits found 问题现象三、No valid kits found 问题解决1.查找qt安装路径2.设置Qt Versions3.构建套件&#xff08;kit&#xff09;下选择Qt版本4.重新添加工程 前言 本文记录了在UOS系统下如何安装qtcreator以及涉及的依赖包安装&…

冷静期or跌落神坛:净水市场纠结,“易开得”们路在何方?

文丨琥珀消研社 作者丨余二 1986年11月1日&#xff0c;一场火灾拉开了世界三大水污染——莱茵河水污染的序幕。 是夜&#xff0c;位于瑞士巴塞尔市的桑多兹化学公司的一个化学品仓库发生火灾&#xff0c;装有约1250吨剧毒农药的钢罐爆炸&#xff0c;大火持续了4个多小时&…

SpringBoot 线上服务假死,CPU 内存正常,什么情况?

背景 开发小伙伴都知道线上服务挂掉&#xff0c;基本都是因为cpu或者内存不足&#xff0c;出现GC频繁OOM之类的情况。本篇文章区别以上的情况给小伙伴们带来不一样的服务挂掉。 还记得哔哩哔哩713事故中那场诡计多端的0吗&#xff1f; 图片 对就是这个0&#xff0c;和本次事…

团体程序设计天梯赛-练习集L2篇③

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的普通人。 &#x1f3c0;个人主页&#xff1a;陈童学哦CSDN &#x1f4a1;所属专栏&#xff1a;PTA &#x1f381;希望各…

【golang中的变量 全局/局部/4中声明】

目录 变量变量的分析1.变量的创建的四种形式1.1总结1.2第一种 var a int 声明1.3 第二种 var a string "XXXX" 初始化1.4第三种 var a "XXXX"1.5第四种 a : XXXX 2.一次性声明多个变量3.一次初始化多个变量3.1交换值 4.全局变量--局部变量5. 声明和初始化…

Kafka生产调优源码

一、Kafka硬件配置选择 1.1 场景说明 100 万日活&#xff0c;每人每天 100 条日志&#xff0c;每天总共的日志条数是 100 万 * 100 条 1 亿条。 1 亿/24 小时/60 分/60 秒 1150 条/每秒钟。 每条日志大小&#xff1a;0.5k - 2k&#xff08;取 1k&#xff09;。 1150 条/…

算法------排序算法------冒泡排序法

介绍 冒泡排序法又称交换排序法&#xff0c;原理是从第一个元素开始&#xff0c;比较相邻元素的大小&#xff0c;如大小顺序有误&#xff0c;则对调后再进行下一个元素的比较&#xff0c;一次扫描之后可以确保最后一个元素位于正确的位置。接下来进行的第二次扫描&#xff0c;…

SSMP整合案例(5) Spring Boot整合MyBatis-Plus实现条件查询

讲完条件查询 那么 我们整个数据层的代码就写完了 可以看到 我们之前的代码 查询语句都有一个 参数 QueryWrapper 这个就是查询条件 其实 我们可以直接这样写 QueryWrapper<book> Query new QueryWrapper<>(); bookDao.selectList(Query);QueryWrapper类需要手…

Spring加载后初始化的9种方式

本文来聊一下在spring中&#xff0c;当spring 容器启动后&#xff0c;我们有几种初始化操作的方式。 目录 Spring加载后初始化的几种方式 Component和Service加构造方法 ContextRefreshedEvent事件 代码如下&#xff1a; 输出结果&#xff1a; PostConstruct 注解 代码如…

基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)

一、骨骼动作识别 骨骼动作识别是视频理解领域的一项任务 1.1 视频数据的多种模态 RGB&#xff1a;使用最广&#xff0c;包含信息最多&#xff0c;从RGB可以得到Flow、Skeleton。但是处理需要较大的计算量 Flow&#xff1a;光流&#xff0c;主要包含运动信息&#xff0c;处理…

面向对象分析与设计 UML2.0 学习笔记

一、认识UML UML-Unified Modeling Language 统一建模语言&#xff0c;又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。 UML是在开发阶段&#xff0c;说明、可视化、构建和书写一个面向对象软件密集系统的制品的…

Hyper-V虚拟机在wifi环境下的外网连接配置

目录 什么是虚拟交换机管理器了解虚拟交换机中的三个概念通过无线网卡创建虚拟交换机遇到的问题wifi环境下虚拟机外网连接方法 前面我们已经安装好了Hyper-V虚拟机和liunx操作系统&#xff0c;但是我们没有给虚拟机配置网络&#xff0c;本来我以为是一件很简单的事情&#xff0…

【Spring Boot学习】怎么配置文件,配置文件有什么用

前言&#xff1a; &#x1f49e;&#x1f49e;今天我们依然是学习Spring Boot&#xff0c;这里我们会更加了解Spring Boot的知识&#xff0c;知道Spring Boot的配置文件是什么样子的。有什么用&#xff1f;怎么使用Spring Boot的配置文件。 &#x1f49e;&#x1f49e;路漫漫&a…

Apache James 同时开启25、587、465端口

前提&#xff1a; 可以参考如下两篇文章在window或者linux上&#xff0c;先部署好Apache James Apache James邮件服务器搭建&#xff08;linux&#xff09;_Steven-Russell的博客-CSDN博客 Apache James邮件服务器搭建&#xff08;windows&#xff09;_Steven-Russell的博客…

Qt6.2教程——6.QT常用控件QLineEdit

一&#xff0c;QLineEdit简介 QLineEdit是Qt库中的一个控件&#xff0c;它提供了一个单行的文本输入框。用户可以在这个输入框中输入和编辑文本。它可以设置占位符文本&#xff08;Placeholder Text&#xff09;&#xff0c;当QLineEdit为空的时候显示这个占位符文本。它还可以…

JDK8新特性之方法引用【 ::】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于方法引用的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.是什么 二.为什么要用 三.什么时候…

chrome录制保存网络请求

有时候&#xff0c;需要与同事共同查看网络请求&#xff0c;但是现场往往环境限制&#xff0c;导致无法访问环境。在这里推荐一种利用chrome保存网络请求的方法。 准备&#xff1a; 1. chrome浏览器&#xff08;最好版本号是62以上&#xff09; chrome浏览器越新越好(最新稳定…

rsarsa

数学很酷&#xff01;使用RSA算法对秘密消息进行解码&#xff0c;c&#xff0c;p&#xff0c;q&#xff0c;e是RSA算法的参数。 RSA算法还不太了解&#xff0c;经过这段时间的学习&#xff0c;得知 q和p是最开始选择的两个质数&#xff0c;主要是为了计算出钥匙n e是在1到φ(n)…