Redis初入门

Nosql:Not-Only SQL(泛指非关系型数据库),作为关系型数据库的补充

作用:应对基于海量用户和海量数据前提下的数据处理问题

redis:C语言开发的一个开源的高性能键值对数据库

特征:

1、数据之间没有必然的关联关系

2、内部采用单线程机制工作

3、高性能

4、多数据类型支持(string、list、hash、set、sorted_set)

5、支持持久化(可以进行数据灾难恢复)

redis应用:

1、为热点数据加速查询(热点商品、热点新闻等)

2、任务队列(秒杀、抢购、购票排队等)

3、即时信息查询(各类排行榜、网站访问统计等)

4、时效性信息控制(验证码控制)

5、分布式数据共享(分布式集群架构中的session共享)

6、消息队列

7、分布式锁

数据类型相关命令:

string:字符串

命令说明
set [key] [value]添加、修改数据
get [key]获取数据
del [key]删除数据
mset [key1] [value1] [key2] [value2] ...添加、修改多个数据
mget [key1] [key2] ...获取多个数据
strlen [key]获取数据字符个数(字符串长度)
append [key] [value]追加信息到原信息尾部(如果原来信息存在就追加,否则新建)
incr [key]数据自增1
incrby [key] [increment]数据增加指定整数范围
incrbyfloat [key] [increment]数据增加指定小数范围
decr [key]数据自减1
decrby [key] [increment]数据减去自定范围整数
setex [key] [seconds] [value]设置数据具有制定的生命周期(秒)
psetex [key] [milliseconds] [value]设置数据具有制定的生命周期(毫秒)

hash:哈希表结构

命令说明
hset [key] [field] [vaule]添加、修改数据
hget [key] [field]获取数据
hgetall [key]获取全部数据
hdel [key] [field1] [field2] ...删除数据
hlen [key]获取哈希表中字段的数量
hexists [key] [field]哈希表中是否存在该字段(返回存在的个数)
hkeys [key]获取哈希表中所有字段名
hvals [key]获取哈希表中所有字段值
hincrby [key] [field] [increment]设置指定字段的数值数据增加指定范围的值(整数)
hincrbyfloat [key] [field] [increment]设置指定字段的数值数据增加指定范围的值(小数)
hsetnx [key] [field] [value]存在字段不更新,不存在新增

list:有序的双向链表

命令说明
lpush [key] [value1] [value2] ...添加、修改数据(左)
rpush [key] [value1] [value2] ...添加、修改数据(右)
lrange [key] [start] [stop]从左边获取数据,start(从0)开始,stop(-1代表倒1位置)结束
lindex [key] [index]从左边读取index位置的数据,index从0开始
llen [key]获取数据个数
lpop [key]从左边获取一个数据并移除
rpop [key]从右边获取一个数据并移除
blpop [key1] [key2] ... [timeout]规定时间内从左边获取并移除数据,timeout秒级
brpop [key1] [key2] ... [timeout]规定时间内从右边获取并移除数据,timeout秒级
lrem [key] [count] [value]从左移除指定数据,count移除个数,value移除的数据

set:数据不重复

命令说明
sadd [key] [member1] [member2] ...添加数据
smembers [key]获取全部数据
srem [key] [member1] [member2] ...删除数据
scard [key]获取集合数据总量
sismember [key] [member]判断集合中是否包含指定数据,返回个数
srandmember [key] [count]随机从集合中抽取count个数据,原集合不变
spop [key]随机获取集合中的某个数据,并移出集合
sinter [key1] [key2]求两个集合的交集
sunion [key1] [key2]求两个集合的并集
sdiff [key1] [key2]求两个集合的差集,有顺序的,key1 - key2的差集
sinterstore [key3] [key1] [key2]求(key1,key2)两个集合的交集,并存储到key3中
sunionstore [key3] [key1] [key2]求(key1,key2)两个集合的并集,并存储到key3中
sdiffstore [key3] [key1] [key2]求(key1,key2)两个集合的差集,并存储到key3中
smove [source] [destination] [member]把数据member从集合source移动到集合destination中

sorted_set:有序的set集合

命令说明
zadd [key] [score1] [member1] [score1] [member1] ...添加(多个)数据,按照score排序
zrange [key] [start] [stop] [withscores]获取数据(升序),withscores会展示score值,start、stop为索引
zrevrange [key] [start] [stop] [withscores]获取数据(降序)
zrem [key] [member1] [member2] ...删除(多个)数据
zrangebyscore [key] [min] [max] [withscores] [limit]按条件升序获取,min < score值 < max,limit限制条数
zrevrangebyscore [key] [max] [min] [withscores] [limit]按条件降序获取
zremrangebyrank [key] [start] [stop]根据索引范围删除
zremrangebyscore [key] [min] [max]根据score值范围删除
zcard [key]获取集合数据总量
zcount [key] [min] [max]获取指定的score值范围中的数据条数
zinterstore [destination] [keynumber] [key1] [key2] ...集合交集,keynumber为要操作的集合个数
zunionstore [destination] [keynumber] [key1] [key2] ...集合并集,keynumber为要操作的集合个数
zrank [key] [member]获取指定数据的索引(升序)
zrevrank [key] [member]获取指定数据的索引(降序)
zscore [key] [member]获取指定数据的score值
zincrby [key] [increment] [member]给指定的member数据的score值增加increment

key通用操作:

命令说明
del [key]删除指定key
exists [key]获取key是否存在
type [key]获取key的类型
expire [key] [second]为指定key设置有效期,秒级
pexpire [key] [milliseconds]为指定key设置有效期,毫秒级
ttl [key]获取key的有效时间(秒),返回-2说明key不存在,返回-1说明key存在
pttl [key]获取key的有效时间(毫秒)
persist [key]切换key从时效性转换为永久性
rename [key] [newkey]为key改名,newkey如果已存在会覆盖原先的值
renamenx为key改名,newkey如果已存在不会改名
sort排序

key查询模式规则:

keys pattern

db基本操作:

命令说明
select [index]切换数据库(0-16)
ping返回pong说明数据库是连通的
quit退出
move [key] [dbindex]数据移动
dbsize当前库中key的总量
flushdb清除当前库的数据
flushall清除所有库的数据

redis持久化:

1、rdb:以快照的形式记录数据

save:保存命令

bgsave:后台保存,会开启子进程进行数据保存

save [second] [count]:自动保存,在second(秒)时间内,改变count次

2、aof:记录历史命令,后台会重写

重写的作用:

​ 1)、降低磁盘占用量,提高磁盘利用率

​ 2)、提高持久化效率,降低持久化写时间,提高IO性能

​ 3)、降低数据恢复用时,提高数据恢复效率

重写规则:

1、已超时的数据不再写入

2、忽略无效指令,只保留最终数据的写入命令

3、对同一数据的多条写命令合并为一条命令(list,set,hash,zset指令一次性最多写入64个元素)

bgrewriteaof:手动重写

redis事务:

multi:开启事务(设定事务的开启位置,此命令执行后,后续的所有命令均加入到该事务中)

exec:执行事务(设定事务的结束位置,同时执行事务。与multi成对使用)

discard:取消事务(终止当前事务,发生在multi之后)

redis监控锁:

watch [key1] [key2] ... :对key添加监视锁,在执行exec前如果key发生变化,终止事务执行

unwatch:取消对所有key的监视

redis:分布式锁(公共锁):

setnx lock-[key] value:设置公共锁

del lock-[key]:释放锁

expire lock-[key] [second]:为锁key添加时间限定,到时不释放,自动释放锁(秒)

pexpire lock-[key] [milliseconds]:为锁key添加时间限定,到时不释放,自动释放锁(毫秒)

redis删除策略:

1、定时删除:用时间换空间

​ 好:节约内存,无占用

​ 坏:不分时段占用CPU资源,频度高

2、惰性删除:访问某个key时,判断该key是否过期,过期则清除

​ 好:延时执行,CPU利用率高

​ 坏:内存占用严重

3、定期删除:每隔一定的时间,扫描一定数量的key,并清除其中过期的key。

redis同时使用惰性删除和定期删除这两种过期策略

redis逐出策略:

相关配置

maxmemory:最大可使用内存

maxmemory-samples:每次选取待删除的数据个数

哨兵模式:

定义:监控主从结构中各个redis服务器工作过程,当master出现故障时,通过投票机制选出新的master,并将所有的slave连接到新的master

工作原理:

1、监控master和各个slave

2、各个哨兵之间互通信息

3、当一个哨兵发现master出现故障,会通知其他哨兵复核,超出一半的哨兵发现master故障,会投票选出一个哨兵进行故障处理,选出一台slave作为新master,通知其他slave连接到新的master

缓存预热:系统启动前,提前将相关的缓存数据直接加载到缓存系统,避免在用户请求的时候,直接查询数据库,再将数据进行缓存的问题。让用户直接查询事先被预热的缓存数据。

缓存雪崩:一段时间内,大量的缓存数据过期,请求直接访问数据库,导致数据库服务器造成大量压力。

解决:

1、热点数据使用永久key

2、为key设置不同的有效期

缓存击穿:单个key数据过期瞬间,数据访问量较大,大量对数据库访问,导致对数据库服务器造成压力。

解决:

1、热点数据使用永久key

2、为key设置不同的有效期

缓存穿透:大量访问不存在的数据,对数据库服务器造成压力。

解决:

1、返回结果为null也进行缓存,有效时间短

2、采用布隆过滤器

布隆过滤器:二进制数组,key经过多个hash函数得出的值就是数组的索引,索引对应位置的值会设置为1。新的key经过同样步骤得出索引值,如果对应位置的值不全是1,说明这个key不存在,直接过滤掉。

问题:存在误判。不同的值hash后可能结果一致,会导致不存在的key判断为存在。

如何保证redis和数据库数据一致性
1、先更新数据库,再删除redis(下次读取时重新加载)
2、更新redis,同步更新数据库(两步操作在同一个事务中)
3、更新redis,发送消息同步到数据库(redis挂了,未同步数据容易丢失)
4、更新数据库,Canal监听Binglog,通过MQ更新redis
5、延迟双删,更新数据库前后删除redis(第二次删除延迟500ms)
6、分布式锁,加锁,更新数据库和删除缓存,释放锁

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

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

相关文章

【原神 × 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密!

【原神 二叉树】角色天赋树、任务分支和圣遗物强化路径的算法秘密! 作者:星之辰 标签:#原神 #二叉树 #天赋树 #任务分支 #圣遗物强化 #算法科普 发布时间:2025年6月 总字数:6000+ 一、引子:提瓦特大陆的“树型奥秘” 你是否曾留意过《原神》角色面板的天赋树? 升级技能…

C++信息学竞赛中常用函数的一般用法

在C 信息学竞赛中&#xff0c;有许多常用函数能大幅提升编程效率。下面为你介绍一些常见函数及其一般用法&#xff1a; 一、比较函数 1、max()//求出a&#xff0c;b的较大值 int a10,b5,c;cmax(a,b);//得出的结果就是c等于10. 2、min()//求出a&#xff0c;b的较小值 int a1…

Linux【3】-----系统框架概述

系统架构 文件系统 linux一定需要挂载操作系统 一切皆文件 三个文件 引导文件 uboot.bin内核镜像 zImage文件系统镜像 system.img 设备树文件&#xff08;属于内核&#xff09; 应用程序编程 arm中通过软中断实现 各程序的构成 文件I/O 5种I/O模型 阻塞非阻塞信号多…

Tensorrt python api 10.11.0笔记

关于Tensorrt的python api文档阅读翻译加总结 文档源地址 Overview Getting started with TensorRT Installation(安装) 安装可参考:官方地址 Samples 关于样例的内容可参考:样例地址 Operator Documentation 有关更多信息&#xff08;包括示例&#xff09;&#xff0…

电镀机的阳极是什么材质?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;点击加入&#xff09;里的学员问&#xff1a;电镀的阳极有什么讲究&#xff1f;什么是可溶性阳极和非可溶性阳极&#xff1f; 什么是可溶性阳极与非可溶性阳极&#xff1f; 可溶性阳极 阳极本身就是…

前段三剑客之JavaScript-02

目录 简介 核心 函数 字符串对象 事件 运算符和控制语句 DOM 正则表达式 BOM JSON 简介 JavaScript由JavaScript语法&#xff0c;DOM和BOM组成 JS中提供了一些输入输出语句&#xff1a; alert(); //浏览器弹出警示框 console.log(); //控制台打印 prompt(); //浏览器…

Qiskit:量子计算模拟器

参考文献&#xff1a; IBM Qiskit 官网Qiskit DocumentationQiskit Benchpress packageQiskit Algorithms package量子计算&#xff1a;基本概念常见的几类矩阵&#xff08;正交矩阵、酉矩阵、正规矩阵等&#xff09;Qiskit 安装指南-博客园使用Python实现量子电路模拟&#x…

【Elasticsearch】Elasticsearch 核心技术(二):映射

Elasticsearch 核心技术&#xff08;二&#xff09;&#xff1a;映射 1.什么是映射&#xff08;Mapping&#xff09;1.1 元字段&#xff08;Meta-Fields&#xff09;1.2 数据类型 vs 映射类型1.2.1 数据类型1.2.2 映射类型 2.实际运用案例案例 1&#xff1a;电商产品索引映射案…

serv00 ssh登录保活脚本-邮件通知版

适用于自己有服务器情况&#xff0c;ssh定时登录到serv00&#xff0c;并在登录成功后发送邮件通知 msmtp 和 mutt安装 需要安装msmtp 和 mutt这两个邮件客户端并配置&#xff0c;参考如下文章前几步是讲配置这俩客户端的&#xff0c;很简单&#xff0c;不再赘述 用Shell脚本实…

前端 Electron 桌面应用学习笔记

前端 Electron 桌面应用学习笔记 介绍Electron是什么?为什么选择Electron?创建你的第一个桌面应用程序启动项目运行结果截图打开调试面板方法生命周期函数常用配置配置窗口标题配置小图标隐藏菜单栏关闭调试面板是否可以使用Node.js隐藏 Electron 标题、小图标和菜单栏获取窗…

LeetCode - 94. 二叉树的中序遍历

题目 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 什么是中序遍历 二叉树的中序遍历是按照"左-根-右"的顺序访问二叉树中的所有节点。 具体过程&#xff1a; 先遍历左子树&#xff08;递归&#xff09;然后访问根节点最后遍历右子树&#xff…

PyTorch——搭建小实战和Sequential的使用(7)

import torch from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linearclass TY(nn.Module):def __init__(self):"""初始化TY卷积神经网络模型模型结构&#xff1a;3层卷积池化&#xff0c;2层全连接设计目标&#xff1a;处理32x32像素的…

C#、VB.net——如何设置窗体应用程序的外边框不可拉伸

以Visual studio 2015为例&#xff0c;具体操作如下&#xff1a; 1、将窗体的“FormBorderStyle”属性值修改为“FixedSingle”&#xff1a; 2、点击“格式”——“锁定控件”&#xff1a; 这样生成的程序边框即可固定住&#xff0c;无法拉伸。

深入了解NIO的优化实现原理

网络 I/O 模型优化 网络通信中&#xff0c;最底层的就是内核中的网络 I/O 模型了。随着技术的发展&#xff0c;操作系统内核的网络模型衍生出了五种 I/O 模型&#xff0c;《UNIX 网络编程》一书将这五种 I/O 模型分为阻塞式 I/O、非阻塞式 I/O、I/O 复用、信号驱动式 I/O 和异步…

【前端】vue3性能优化方案

以下是Vue 3性能优化的系统性方案&#xff0c;结合核心优化策略与实用技巧&#xff0c;覆盖渲染、响应式、加载、代码等多个维度&#xff1a; ⚙️ 一、渲染优化 精准控制渲染范围 v-if vs v-show&#xff1a; v-if&#xff1a;条件为假时销毁DOM&#xff0c;适合低频切换场景&…

在MATLAB中使用自定义的ROS2消息

简明结论&#xff1a; 无论ROS2节点和MATLAB运行在哪&#xff0c;MATLAB本机都必须拥有自定义消息源码并本地用ros2genmsg生成&#xff0c;才能在Simulink里订阅这些消息。只要你想让MATLAB或Simulink能识别自定义消息&#xff0c;必须把消息包源码(.msg等)拷到本机指定目录&a…

spring重试机制

数据库死锁处理与重试机制实现指南 1. 业务场景 1.1 问题现象 高并发批量数据处理时频繁出现数据库死锁主要发生在"先删除历史数据&#xff0c;再重新计算"的业务流程中原有逐条处理方式&#xff1a;list.forEach(item -> { delete(); calculate(); }) 1.2 死…

QEMU源码全解析 —— 块设备虚拟化(24)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(23) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! QEMU写入一个文件的完整过程 前边用了十来篇文章的篇幅,解析了QEMU启动过程中的存储…

java中static学习笔记

较重要知识点 static修饰的变量是共享的在类加载时创建可以不通过实例来访问静态方法只能访问静态的成员和方法&#xff1b;而非静态的可以访问静态的和非静态的。静态方法一般用在通用的方法&#xff0c;这样方便调用&#xff0c;不然一个通用的方法每一次调用都要创建实例&a…

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…