框架高级课程系列之Redis6笔记

news2024/11/18 10:36:53

文章目录

  • 前言
  • NoSQL数据库简介
    • 技术发展
    • NoSQL数据库
    • NoSQL适用场景
    • NoSQL不适用场景
  • Redis概述安装
    • 配合关系型数据库做高速缓存
    • 多样的数据结构存储持久化数据
    • Redis 安装
    • 准备工作:下载安装最新版的gcc编译器
    • 启动 Redis方式
    • Redis 关闭方式
  • Redis介绍相关知识
  • 常用五大数据类型
    • Redis键(key)
    • Redis字符串(String)
  • Redis列表(List)
  • Redis集合(Set)
  • Redis哈希(Hash)
  • Redis有序集合Zset(sorted set)

前言

📋前言📋
💝博客:【无聊大侠hello word】💝
✍有一点思考,有一点想法,有一点理性!✍
✍本文由在下【无聊大侠hello word】原创,首发于CSDN✍

NoSQL数据库简介

技术发展

技术的分类

  • 1、解决功能性的问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN
  • 2、解决扩展性的问题:Struts、Spring、Spring MVC、Hibernate、Mybatis
  • 3、解决性能的问题:NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearch

NoSQL数据库

NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”,泛指非关系型的数据库

NoSQL不依赖业务逻辑方式存储,而以简单的key-vaue模式存储。因此大大的增加了
数据库的扩展能力。

  • 不遵循SQL标准
  • 不支持ACID(原子性、一致性、隔离性、持久性)
  • 远超于SQL的性能

NoSQL适用场景

  • 对数据高并发的读写
  • 海量数据的读写
  • 对数据高可扩展性的

NoSQL不适用场景

  • 需要事务支持
  • 基于sql的结构化查询存储,处理复杂的关系,需要即席查询。
  • (用不着sql的和用了sql也不行的情况,请考虑用NoSql)

Mem cache

在这里插入图片描述

Redis

在这里插入图片描述

MongoDB

在这里插入图片描述

Redis概述安装

  • Redis是一个开源key-value存储系统。
  • 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)
    list(链表)、set(集合,、zset(sorted set-有序集合)和hash(哈希类型)。
  • 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而日这些操作都是原子性的。
  • 在此基础上,Redis支持各种不同方式的排序
  • 与memcached一样,为了保证效率,数据都是缓存在内存
  • 区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记
    录文件。
    并且在此基础上实现了master-slave(主从)同步。

配合关系型数据库做高速缓存

  • 高频次,热门访问的数据,降低数据库IO
  • 分布式架构,做session共享:

多样的数据结构存储持久化数据

在这里插入图片描述

Redis 安装

Redis官方网站Redis中文官方网站
http://redis.iohttp://redis.cn

不用考虑在windows环境下对Redis的支持

在这里插入图片描述

准备工作:下载安装最新版的gcc编译器

安装C语言的编译环境

  • yum install centos-release-scl scl-utils-build
  • yum install -y devtoolset-8-toolchain
  • scl enable devtoolset-8 bash
  • 测试gcc版本

或直接安装 gcc
gcc–version

在这里插入图片描述

解压命令:tar -zxvf redis-6.0.6.tar.gz

cd redis-6.0.6

在redis-6.0.6目录下再次执行make命令(只是编译好)·

报错参考:安装 redis执行make命令报错struct redisServer’没有名为‘sentinel_mode’的成员

在这里插入图片描述

跳过make test继续执行:make install

在这里插入图片描述
安装目录:/usr/local/bin

查看默认安装目录:

在这里插入图片描述

  • redis-.benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
  • redis-.check-aof:修复有问题的AOF文件,rdb和aof后面讲
  • redis-check-dump:修复有问题的dump.rdb文件
  • redis-sentinel:Redis集群使用
  • redis-server:Redis服务器启动命令
  • redis-cli:客户端,操作入口

启动 Redis方式

前台启动(不推荐)

前台启动,命令行窗口不能关闭,否则服务器停止

在这里插入图片描述

Ctrl + C 关闭服务

后台启动(推荐)

备份redis.conf:

在这里插入图片描述

拷贝一份redis.conf到其他目录

cp redis.conf /etc/redis.conf:

在这里插入图片描述

后台启动设置daemonize no改成yes:

vi redis.conf
在这里插入图片描述
启动 Redis:

在这里插入图片描述

查看进程:

在这里插入图片描述

用客户端访问:redis-cli:

在这里插入图片描述

多个端口可以:redis-cli-p6379

测试验证:ping:

在这里插入图片描述

Redis 关闭方式

  • 单实例关闭:redis-.cli shutdown
  • 也可以进入终端后再关闭
  • 多实例关闭,指定端口关闭:redis-cli -p 6379 shutdown

Redis介绍相关知识

在这里插入图片描述
底层原理:Redis是单线程+多路IO复用技术

多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用
select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则
阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启
动线程执行(比如使用线程池)

串行 vs 多线程+锁(memcached) vs 单线程+多路IO复用(Redis)

常用五大数据类型

哪里去获得redis常见数据类型操作命令http://www.redis.cn/commands.html

Redis键(key)

常用命令:

  • keys* 查看当前库所有key(匹配:keys*1)
  • exists key 判断某个key是否存在
  • type key 查看你的key是什么类型
  • del key 删除指定的key数据
  • unlink key 根据value选择非阻塞删除
  • 仅将 keys 从keyspace元数据中删除,真正的删除会在后续异步操作。
  • expire key10 10秒钟:为给定的key设置过期时间
  • ttl key 查看还有多少秒过期,-1表示永不过期,-2表示已过期
  • select 命令切换数据库
  • dbsize 查看当前数据库的key的数量
  • flushdb 清空当前库
  • flushall 通杀全部库

示例:

在这里插入图片描述

Redis字符串(String)

简介:

  • String 是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value
  • String 类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
  • String 类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

常用命令:

set <key><value> 添加键值对

在这里插入图片描述

  • *NX: 当数据库中key不存在时,可以将key-vaue添加数据库
  • *XX: 当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥
  • *EX: key的超时秒数
  • *PX: key的超时毫秒数,与EX互斥

get<key>查询对应键值

append<key><value>将给定的<value>追加到原值的未尾

strlen<key>获得值的长度

setnx<key><value>只有在key不存在时设置key的值

incr<key>

  • 将key中储存的数字值增1
  • 只能对数字值操作,如果为空,新增值为1

decr<key>

  • 将key中储存的数字值减1
  • 只能对数字值操作,如果为空,新增值为-1

incrby / decrby<key><步长>将key中储存的数字值增减。自定义步长

mset<key1><value1><kye2><value2>......

  • 同时设置一个或多个key-value对

mget <key1><key2><key3>.....

  • 同时获取一个或多个value

msetnx <key1><value1><key2><value2>....

  • 同时设置一个或多个key-value对,当且仅当所有给定key都不存在

  • 原子性,有一个失败则都失败

getrange<key><起始位置><结束位置>

  • 获得值的范围,类似java中的substring,前包后包

setrange<key><起始位置><value>

  • <value>覆写<ky>所储存的字符串值,从<起始位置>开始(索引从0开始

setex <key><过期时间><value>

  • 设置键值的同时,设置过期时间,单位秒

getset <key><value>

  • 以新换旧,设置了新值同时获得旧值

数据结构:

String 的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

在这里插入图片描述

如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。

Redis列表(List)

简介:

单键多值

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

在这里插入图片描述

常用命令:

Ipush / rpush<key><value1><value:2><value3>......从左边 / 右边插入一个或多个值

lpop / rpop<key>从左边/右边吐出一个值。值在键在值光键亡

rpoplpush<key1><key2><key1>列表右边吐出一个值,插到<key2>列表左边

Irange <key><start><stop>

  • 按照索引下标获得元素(从左到右)
  • Irange mylist 0-1 0左边第一个,-1右边第一个,(0-1表示获取所有)
  • lindex <key><index>按照索引下标获得元素(从左到右)
  • Ilen<key> 获得列表长度

linsert<key>before<value>``<newvalue>在<value>的后面插入<newvalue>插入值

lrem<key><n><value> 从左边删除n个value(从左到右)

lset<key><index><value> 将列表key下标为index的值替换成value

数据结构:

List 的数据结构为快速链表quickList。

首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表

当数据量比较多的时候才会改成quicklist。

因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的是int类型的数据,结构上还需要两个额外的指针prev和next。

在这里插入图片描述
Redis 将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。

Redis集合(Set)

简介:

Redis set对外提供的功能与1ist类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

Redis 的Set是string类型的无序集合。它底层其实是一个value为nul的hash表,所以添加,删除,查找的复杂度都是O(1)

一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变

常用命令:

sadd <key><value1><value2>.....

  • 将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略

smembers <key>取出该集合的所有值

sismember<key><value>判断集合<key>是否为含有该<value>值,有1,没有0

scard<key>返回该集合的元素个数

srem<key><value1><value2>.....删除集合中的某个元素

spop<key>随机从该集合中吐出一个值

srandmember<key><n>随机从该集合中取出n个值。不会从集合中删除

smove<source><destination>value把集合中一个值从一个集合移动到另一个集合

sinter<keyl><key2>返回两个集合的交集元素

sunion<key1><key2>返回两个集合的并集元素

sdif<key1><key2>返回两个集合的差集元素(key1中的,不包含key2中的)

数据结构:

Set 数据结构是dict字典,字典是用哈希表实现的。

Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。

Redis哈希(Hash)

简介:

Redis hash是一个键值对集合。

Redis hash是一个string类型的fieldvalue的映射表,hash特别适合用于存储对象

类似Java里面的Map<String,Object>

用户ID为查找的key,存储的value用户对象包,含姓名,年龄,生日等信息,如果用普通的key/value结构来存储

主要有以下2种存储方式:

在这里插入图片描述
在这里插入图片描述

常用命令:

hset<key><field><value><key>集合中的<field>键赋值<value>

hget<key1><field><key1>集合<field>取出value

hmset<key1><field1><value1><field2><value2>..批量设置hash的值

hexists<key1><field>查看哈希表key中,给定域field是否存在

hkeys<key>列出该hash集合的所有field

hvals<key>列出该hash集合的所有value

hinerby<key><field><increment>为哈希表key中的域field的值加上增量 1 -1

hsetnx<key><field><value>将哈希表key中的域field的值设置为value,当且仅当域field不存在

数据结构:

Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。

Redis有序集合Zset(sorted set)

简介:

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。

不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了

因为元素是有序的,所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。

访问有序集合的中间元素也是非常快的因此你能够使用有序集合作为一个没有重复成员的智能列表。

常用命令:

zadd <key><score1><value1><score2><value2>..

  • 将一个或多个member元素及其score值加入到有序集key当中

zrange<key><start><stop>[WITHSCORES]

  • 返回有序集key中,下标在<start><stop>之间的元素
  • 带NITHSCORES,可以让分数一起和值返回到结果集

zrangebyscore key minmax [withscores] [limit offset count]

  • 返回有序集key中,所有score值介于min和max之间(包括等于min或max)的成员
  • 有序集成员按score值递增(从小到大)次序排列

zrevrangebyscore key maxmin [withscores][limit offset count]

  • 同上,改为从大到小排列

zincrby <key><increment><value>为元素的score加上增量

zrem<key><value>删除该集合下,指定值的元素

zcount<key><min><max>统计该集合,分数区间内的元素个数

zrank<key><value>返回该值在集合中的排名,从0开始

数据结构:

SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String,Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。

zset底层使用了两个数据结构:

(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。

(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

跳跃表(跳表):

1、简介:

有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。

2、实列:

对比有序链表和跳跃表,从链表中查询出51

在这里插入图片描述
在这里插入图片描述

先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!

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

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

相关文章

如何利用python机器学习解决空间模拟与时间预测问题及经典案例分析

目录 专题一 机器学习原理与概述 专题二 Python编译工具组合安装教程 专题三 掌握Python语法及常见科学计算方法 专题四 机器学习数据清洗 专题五 机器学习与深度学习方法 专题六 机器学习空间模拟实践操作 专题七 机器学习时间预测实践操作 更多推荐 了解机器学习的发…

Web服务器TomCat快速入门(从安装到部署)

文章目录什么是Web服务器&#xff1f;相关概念基本使用下载安装卸载启动关闭配置部署&#x1f4c2;橙子精品文章学习推荐什么是Web服务器&#xff1f; Web 服务器是一个应用程序&#xff0c;对 HTTP 协议的操作进行封装&#xff0c;使得程序员不必直接对协议进行操作&#xff…

【Linux 系统运维基础】Linux命令大全

Linux 命令大全立志列举出Linux中常用的所有命令(有很多命令不使用的话&#xff0c;很快会忘记哦)。 1. cd 目录前进/ 后缀 cd /表示跳转到根目录下&#xff0c;无论是哪个目录下&#xff0c;执行此命令后一定会跳转到根目录下。 cd ~ 表示跳转到主目录下。 cd . 表示跳转还…

【5.2】Nacos注册中心--服务多级存储模型

【【5.2】Nacos注册中心--服务多级存储模型1 Nacos服务多级存储模型2 服务跨集群调用问题3 配置集群属性4 总结1 Nacos服务多级存储模型 之前有服务的概念&#xff1a; 例如&#xff1a;提供用户查询的use-service和提供订单查询的order-service&#xff0c;它们都叫服务。 我…

Linux安装配置JDK安装运行Tomcat

Linux软件主流安装方式: tar:解压安装(前提将安装包下载下来) 安装包格式:tar,tar.gz,tar.bz 安装解压包命令: tar -zxvf 包名xxx rpm:直接安装,需要将安装包下载下来(好比双击window里的.exe文件) 安装包格式:rpm 安装命令:rpm -ivh 软件路径 卸载命令:rpm -e 软件包全名 y…

【GPLT 二阶题目集】L2-014 列车调度

火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口&#xff08;Entrance&#xff09;轨道和一条出口&#xff08;Exit&#xff09;轨道&#xff0c;它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入&#xff0c;最后从出口离开。在图中有9趟列车&am…

(蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第1天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有75天

&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6; 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&a…

2023年“华数杯”国际数模赛赛题浅析

2023华数杯如期开赛&#xff0c;本次比赛作为美赛的模拟赛&#xff0c;赛题和比赛时间都和美赛高度相似&#xff0c;因此大家 完全可以当作一次美赛之前的练习赛进行。美赛的发题时间与华数杯一致&#xff0c;都是早晨六点&#xff0c;现已经将机器翻译的初步翻译 结果进行了分…

Gdb调试复现Dirty Pipe漏洞(CVE-2022-0847)之内核态调试

第一、准备环节-增加内核调试辅助语句&#xff1a; 首先&#xff0c;为了更好的查看关键因素的变化&#xff1a;稍微做了两处修改&#xff1a; 第一处:splice前后&#xff0c;增加getchar和puts; 第二处:prepare pipe过程中&#xff0c;增加getchar和puts; 修改后代码执行结…

Spring Bean生命周期,就像人的一生

这篇我们来看一看Spring中Bean的生命周期&#xff0c;我发现&#xff0c;和人的一生真的很像。1 简单说说IoC和BeanIoC&#xff0c;控制反转&#xff0c;想必大家都知道&#xff0c;所谓的控制反转&#xff0c;就是把new对象的权利交给容器&#xff0c;所有的对象都被容器控制&…

利用STC15输出两路互补SPWM波形

利用STC15输出两路互补SPWM波形&#x1f39e;逻辑分析仪信号采集演示&#xff1a; &#x1f516;本案例使用的是IAP15W4K61S4验证。 &#x1f4cd;相关篇《STC15系列PWM相关功能寄存器介绍》 &#x1f4cc;相关开源PCB《【PCB开源分享】STC/IAP15W4K61S4开发板》 &#…

Linux(七)进程间通信

进程间是如何进行通信的&#xff1f; 通过前面的学习之后&#xff0c;我们知道进程间是具有独立性的&#xff0c;在操作系统的层面来看&#xff0c;进程就是一块pcb&#xff0c;是对运行中的程序动态运行过程的描述&#xff0c;在Linux角度下&#xff0c;进程就是一个task_stru…

2-2JVM-GC垃圾回收

GC垃圾回收 了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行、并行、并发、G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收&#xff1f; 程序的运行必然需要申请内存资源&#xff0c;无效的对象资源如果不及时处理就会一直占有内存资源&#xff0c;最终将导致内…

YOLOv5/v7 Falsk Web 监测平台 | YOLOv5/v7 Falsk Web 部署

YOLOv7 Falsk Web 监测平台图片效果展示 YOLOv7 Falsk Web 监测平台视频效果展示 YOLOv7 Flask Web 检测平台 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开…

HTB_Jerry tomcat弱口令war包getshell

文章目录信息收集Tomcat war 包 getshell信息收集 扫描发现 8080 端口存在 tomcat 服务&#xff0c;访问 manage app 管理接口&#xff0c;需要输入账号密码 点击取消&#xff0c;看到默认账号密码&#xff0c;重新登录&#xff0c;登录成功&#xff0c;未修改 一般就是上传或…

JVM类加载

作用&#xff1a;负责从硬盘/网络中加载字节码信息&#xff0c;加载到内存中&#xff08;运行时数据区的方法区中&#xff09; 类加载过程&#xff1a; 加载 使用IO读取字节码文件&#xff0c;转换并存储 为每个类创建一个Class类的对象 存储在方法区中 链接&#xff08;…

Jackson注解使用分析

文章目录Jackson常用注解1. 常用注解汇总2. 注解使用分析JsonIncludeJsonAnyGetterJsonAnySetterJsonNamingJsonAutoDetectJacksonInjectJsonAliasJsonValueJsonMergeJsonRawValueJsonEnumDefaultValueJsonFilterJsonSerializeJsonDeserializeJacksonAnnotationJacksonAnnotati…

excel合并技巧:查找函数遇到合并单元格怎么应对

大家都在期盼奖金的到来&#xff0c;可是核算奖金的同事正在苦恼&#xff0c;因为以前用得好好的VLOOKUP函数突然不合适了&#xff0c;很多人的奖金计算出来都变成了乱码&#xff1a;使用VLOOKUP函数每个部门只有第一行正确&#xff0c;其他都是乱码。看到这个表&#xff0c;相…

【服务器数据恢复】raid5硬盘离线后热备盘未启用的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌X3850服务器&#xff0c;组建的raid5磁盘阵列&#xff0c;该raid5磁盘阵列包含4块成员盘和1块热备盘。 服务器故障&#xff1a; 服务器在运行过程中由于未知原因突然崩溃&#xff0c;用户方工程师检查后发现该故障服务器raid5阵列中2块磁…

Electron + Vue 开发环境搭建

1.安装nodejs&#xff0c;下载网址&#xff1a;https://nodejs.org/en/ 点击安装程序&#xff0c;一路next即可 安装完成之后打开cmd测试&#xff0c;输入node -v查看node版本&#xff0c;输入npm -v查看npm版本 安装完成后&#xff0c;.msi格式的安装包已经将node.exe添加到…