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

Redis初阶学习

1.Redis概述

1.1Redis介绍

Redis的英文全称为remote dictionary server,翻译过来就是远程字典服务,

1. 字典这个概念在python中很重要是一个键值对类型的数据结构

redis是一个数据库怎么能和键值对牵扯到关系呢?原因是因为redis内置了很多丰富的数据结构,其中大部分核心都是键值对。


2. 那么redis中的remote是什么意思?

remote是遥远的,我们知道mysql是一个客户端/服务器模型的数据库,也就是说我们需要通过客户端的命令来向服务器发出请求获取到数据。而redis也是这样的,它也是一种客户端/服务器架构的设计,我们也分别需要redis的客户端和redis的服务器,remote 本质上指的就是 客户端通过网络连接到 Redis 服务端


3. Redis 与 MySQL 都是典型的 客户端/服务器架构,但在性能上差距明显:

mysql的运行速度是一只蜗牛那么redis的运行速度就是近地卫星

redis的官网中的介绍:

性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。读取延迟在 微秒级

mysql的官网中的介绍:

mysql读取数据的速度是1 千 ~ 1 万 左右。读写延迟在 毫秒级

二者差距大概在100倍左右,其实说是蜗牛和卫星有点夸张,比较准确的是人骑自行车的速度和搭载飞机的速度


4.其中为什么,redis的性能要明显强于mysql呢?

其中的原因是:

redis是"掌管"内存的,而mysql是"掌管"磁盘的

在计算机底层逻辑中,内存的读写速度是要远大于磁盘的,因为磁盘的IO效率低,虽然mysql是有缓存的存在的且MySQL 支持多线程,但是终归还是需要和磁盘打交道不可避免地影响了速度,redis虽然是单线程的模型,但是它基于内存这个特性完美的帮它弥补了单线程所带来的性能低下的缺点。


5.那么redis的数据放在内存中,如果发生意外甚至重启电脑数据不就没了吗?

但是 —— Redis 早就考虑过这个问题,它提供了 持久化机制,把数据写到磁盘里,避免意外全丢。

具体就是以下两种方式

  • RDB 快照 = 定时拍一张照片存档。

  • AOF 日志 = 写流水账,随时能回溯。

1.2 Redis特点

  • 开源的,使用C编写,基于内存且支持持久化

  • 高性能的Key-Value的NoSQL数据库

  • 支持数据类型丰富,字符串string,列表list,散列hash,集合set,有序集合sorted set

  • 支持多种编程语言(C C++ Python Java PHP ... )

Redis数据库的诞生是为了解决磁盘IO带来的性能瓶颈

1.3 应用场景

  • 使用Redis来缓存一些经常被用到、或者需要耗费大量资源的内容,通过这些内容放到redis里面,程序可以快速读取这些内容

  • 一个网站,如果某个页面经常会被访问到,或者创建页面时消耗的资源比较多,比如需要多次访问数据库、生成时间比较长等,我们可以使用redis将这个页面缓存起来,减轻网站负担,降低网站的延迟,比如说网站首页等

1.5 Redis附加功能

  • 数据持久化

    将内存中数据保存到磁盘中,保证数据安全,方便进行数据备份和恢复

  • 过期键功能

    为键设置一个过期时间,让它在指定时间内自动删除

  • 主从同步

  • Sentinel哨兵

1.6 Redis安装

Ubuntu 上安装 Redis和Rocky Linux 上安装 Redis大致是相同的

  • Ubuntu / Debian 系列 → 使用 apt

    sudo apt update sudo apt install redis-server -y

  • Rocky Linux / CentOS / RHEL 系列 → 使用 dnfyum

    sudo dnf install redis -y或者sudo yum install redis -y


除此之外,操作 Redis 服务、连接客户端的命令几乎一模一样:

  • 启动服务:systemctl start redis

  • 停止服务:systemctl stop redis

  • 重启服务:systemctl restart redis

  • 查看状态:systemctl status redis

  • 设置开机自启:systemctl enable redis

  • 客户端连接:redis-cli -h 127.0.0.1 -p 6379 -a 密码


唯一要注意的小差别

  • Ubuntu 默认安装时配置文件在 /etc/redis/redis.conf

  • Rocky Linux 默认配置文件在 /etc/redis.conf

所以如果要修改 requirepassbindsupervised 等配置,路径略有不同。

1. 为什么不推荐在 Windows 操作系统 上安装 Redis?

  • 官方不支持
    Redis 作者原本是 Linux/Unix 世界的人,他明确说过 Redis 不会支持 Windows 作为生产环境
    虽然微软以前做过一个 Windows 版本的 Redis(叫 Memurai),但那只是实验性的,早就停更了。

  • 性能差距大
    Redis 是 高性能内存数据库,底层大量用到 epoll/kqueue 这种 Linux 特有的高效 IO 模型。
    Windows 上只能用 select/poll 这些“老古董”,性能会差几个数量级,就好比让短跑运动员穿拖鞋跑步。

  • 运维生态不成熟
    Linux 上 Redis 配合 systemdshell 脚本、dockerk8s 都是标配。
    Windows 下没有这些生态,部署、监控、集群管理都很麻烦。

2. 为什么不用 图形化页面操控 Redis

  • Redis 设计哲学
    Redis 就是一款“快到飞起”的内存数据库,官方哲学是 简单、轻量、命令行驱动
    多一层 GUI,其实就是多一层负担。

  • 运维人员习惯命令行
    大多数 DBA/后端工程师习惯在命令行里操作 Redis,写几条脚本就能自动化管理,比鼠标点 GUI 更快。

2 配置文件详解

配置文件所在路径

Rocky Linux在:/etc/redis.conf

Ubuntu在:/etc/redis/redis.conf

修改配置文件之前首先备份,执行命令:cp -p /etc/redis.conf    /etc/redis.conf.bak

  • 设置连接密码

    # 1.配置文件中对应的配置requirepass 123456 #其中123456为设置的密码# 2.修改完成后重启Reids服务systemctl restart redis# 3.客户端连接测试redis-cli -h 127.0.0.1 -p 6379 -a 123456127.0.0.1:6379>PING
  • 设置允许远程连接

    # 1.注释掉配置文件中的本地IP地址绑定bind 127.0.0.1# 2.关闭保护模式(把yes改为no)protected-mode no# 3.重启Redis服务systemctl restart redis

    Windows连接Rocky Linux的Redis服务

    Linux查看IP地址的命令:ifconfig

    # 其中:x.x.x.x 是Rocky Linux的IP地址
    redis-cli -h x.x.x.x -a 123456

3 数据类型

 

全局命令:适用于所有数据类型

命令作用
SELECT number选择所在库(number在db0~db15之间)
KEYS *查看KEY
TYPE key查看KEY数据类型
DEL key删除KEY
FULSHDB清空当前库
FLUSHALL清除所有库数据

3.1 字符串String

字符串、数值 都会转为字符串来存储

3.1.1 字符串
  • 必须掌握

    // 1. 设置一个key-value
    set key value
    // 2. 获取key的值
    get key
    // 3. key不存在时再进行设置(nx)
    set key value nx  # not exists
    // 4. 设置过期时间(ex)
    set key value ex seconds
  • 了解即可

    // 同时设置多个key-value
    mset key1 value1 key2 value2 key3 value3
    // 同时获取多个key-value
    mget key1 key2 key3 
    // 获取长度
    strlen key
3.1.2 数值
  • 必须掌握

    // 整数操作
    INCRBY key 步长
    DECRBY key 步长
    INCR key : +1操作
    DECR key : -1操作// 应用场景: 抖音上有人关注你了,是不是可以用INCR呢,如果取消关注了是不是可以用DECR
    // 浮点数操作: 自动先转为数字类型,然后再进行相加减,不能使用append
    incrbyfloat key step

3.2 列表List

  • 特性

    • 元素是字符串类型

    • 列表头尾增删快,中间增删慢,增删元素是常态

    • 元素可重复

    • 最多可包含2^32 -1个元素

  • 列表常用命令

    # 增
    1、从列表头部压入元素LPUSH key value1 value2 
    2、从列表尾部压入元素RPUSH key value1 value2
    3、从列表src尾部弹出1个元素,压入到列表dst的头部RPOPLPUSH src dst
    4、在列表指定元素后/前插入元素LINSERT key after|before value newvalue# 查
    5、查看列表中元素LRANGE key start stop# 查看列表中所有元素: LRANGE key 0 -1
    6、获取列表长度LLEN key# 删
    7、从列表头部弹出1个元素LPOP key
    8、从列表尾部弹出1个元素RPOP key
    9、列表头部,阻塞弹出,列表为空时阻塞BLPOP key timeout
    10、列表尾部,阻塞弹出,列表为空时阻塞BRPOP key timeout# 关于BLPOP 和 BRPOP1、如果弹出的列表不存在或者为空,就会阻塞2、超时时间设置为0,就是永久阻塞,直到有数据可以弹出3、如果多个客户端阻塞再同一个列表上,使用First In First Service原则,先到先服务
    11、删除指定元素LREM key count valuecount>0:表示从头部开始向表尾搜索,移除与value相等的元素,数量为countcount<0:表示从尾部开始向表头搜索,移除与value相等的元素,数量为countcount=0:移除表中所有与value相等的值
    12、保留指定范围内的元素LTRIM key start stopLRTIM mylist1 0 2 # 只保留前3条# 应用场景: 保存微博评论最后500条LTRIM weibo:comments 0 499# 改
    13、LSET key index newvalue
  • 练习

    1、查看所有的键
    2、向列表 spider:urls 中以RPUSH放入如下几个元素:01_baidu.com、02_taobao.com、03_sina.com、04_jd.com、05_xxx.com
    3、查看列表中所有元素
    4、查看列表长度
    5、将列表中01_baidu.com 改为 01_tmall.com
    6、在列表中04_jd.com之后再加1个元素 02_taobao.com
    7、弹出列表中的最后一个元素
    8、删除列表中所有的 02_taobao.com
    9、剔除列表中的其他元素,只剩前3条

3.3 Hash散列

  • 定义

    • 由field和关联的value组成的键值对

    • field和value是字符串类型

    • 一个hash中最多包含2^32-1个键值对

  • 优点

    • 每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等)

    • 键越多,redis数据库在储存附件管理信息方面耗费内存越多,花在管理数据库键上的CPU也会越多

  • 缺点(不适合hash情况)

    • 使用过期键功能:键过期功能只能对键进行过期操作,而不能对散列的字段进行过期操作

  • 基本命令操作

    # 1、设置单个字段
    HSET key field value
    HSETNX key field value
    # 2、设置多个字段
    HMSET key field value field value
    # 3、返回字段个数
    HLEN key
    # 4、判断字段是否存在(不存在返回0)
    HEXISTS key field
    # 5、返回字段值
    HGET key field
    # 6、返回多个字段值
    HMGET key field filed
    # 7、返回所有的键值对
    HGETALL key
    # 8、返回所有字段名
    HKEYS key
    # 9、返回所有值
    HVALS key
    # 10、删除指定字段
    HDEL key field 
    # 11、在字段对应值上进行整数增量运算
    HINCRBY key filed increment
    # 12、在字段对应值上进行浮点数增量运算
    HINCRBYFLOAT key field increment
  • 应用场景:微博好友关注

    1、用户ID为key,Field为好友ID,Value为关注时间user:10000 user:606 20190520user:10000 user:605 20190521
    2、用户维度统计统计数包括:关注数、粉丝数、喜欢商品数、发帖数用户为key,不同维度为field,value为统计数比如关注了5人HSET user:10000 fans 5HINCRBY user:10000 fans 1

3.4 集合

  • 特点

    • 无序、去重

    • 元素是字符串类型

    • 最多包含2^32-1个元素

  • 基本命令

    # 1、增加一个或者多个元素,自动去重
    SADD key member1 member2
    # 2、查看集合中所有元素
    SMEMBERS key
    # 3、删除一个或者多个元素,元素不存在自动忽略
    SREM key member1 member2
    # 4、元素是否存在
    SISMEMBER key member
    # 5、随机返回集合中指定个数的元素,默认为1个
    SRANDOMMEMBER key count
    # 6、返回集合中元素的个数,不会遍历整个集合,只是存储在键当中了
    SCARD key
    # 7、把元素从源集合移动到目标集合
    SMOVE source destination member
    # 8、差集(number1 1 2 3 number2 1 2 4)
    SDIFF key1 key2 
    # 9、差集保存到另一个集合中
    SDIFFSTORE destination key1 key2
    # 10、交集
    SINTER key1 key2
    SINTERSTORE destination key1 key2
    # 11、并集
    SUNION key1 key2
    SUNIONSTORE destination key1 key2
  • 应用场景

    案例: 新浪微博的共同关注

    需求: 当用户访问另一个用户的时候,会显示出两个用户共同关注过哪些相同的用户

    设计: 将每个用户关注的用户放在集合中,求交集即可

    实现:

    user001 = {'peiqi','qiaozhi','danni'}user002 = {'peiqi','qiaozhi','lingyang'}user001和user002的共同关注为:SINTER user001 user002// 结果为: {'peiqi','qiaozhi'}

3.5 有序集合sortedset

  • 特点

    • 有序、去重

    • 元素是字符串类型

    • 每个元素都关联着一个浮点数分值(score),并按照分值从小到大的顺序排列集合中的元素(分值可以相同)

    • 最多包含2^32-1元素

  • 示例

    一个保存了水果价格的有序集合

分值2.04.06.08.010.0
元素西瓜葡萄芒果香蕉苹果

一个保存了员工薪水的有序集合

分值600080001000012000
元素lucytomjimjack

一个保存了正在阅读某些技术书的人数

分值300400555666777
元素核心编程阿凡提本拉登阿姆斯特朗比尔盖茨
  • 常用命令

    # 在有序集合中添加一个成员
    zadd key score member
    # 查看指定区间元素(升序)
    zrange key start stop [withscores]
    # 查看指定区间元素(降序)
    ZREVRANGE key start stop [withscores]
    # 删除成员
    zrem key member
    # 增加或者减少分值
    zincrby key increment member
    # 返回元素排名
    zrank key member
    # 返回元素逆序排名
    zrevrank key member
    # 返回集合中元素个数
    zcard key
    # 并集
    zunionstore destination numkeys key [weights 权重值] [AGGREGATE SUM|MIN|MAX]
    # 交集:和并集类似,只取相同的元素
    ZINTERSTORE destination numkeys key1 key2 WEIGHTS weight AGGREGATE SUM|MIN|MAX

案例1: 京东商品畅销榜

# 第1天
ZADD mobile-001 5000 'huawei' 4000 'oppo' 3000 'iphone'
# 第2天
ZADD mobile-002 5200 'huawei' 4300 'oppo' 3230 'iphone'
# 第3天
ZADD mobile-003 5500 'huawei' 4660 'oppo' 3580 'iphone'
问题:如何获取三款收集的销量排名?
ZUNIONSTORE mobile-001:003 mobile-001 mobile-002 mobile-003 # 可否?
# 正确
1、ZADD mobile-003 5500 'huawei' 4660 'oppo' 3580 'iphone'
2、ZUNIONSTORE mobile-001:003 mobile-001 mobile-002 mobile-003 AGGREGATE MAX

http://www.xdnf.cn/news/1441351.html

相关文章:

  • 宋红康 JVM 笔记 Day12|执行引擎
  • 《SVA断言系统学习之路》【03】关于布尔表达式
  • 番茄生吃熟吃大PK!VC vs 番茄红素,谁更胜一筹?医生不说的秘密!
  • 【算法--链表】142.环形链表中Ⅱ--通俗讲解如何找链表中环的起点
  • Keras/TensorFlow 中 `fit()` 方法参数详细说明
  • 编程基础-eclipse创建第一个程序
  • 存算一体:重构AI计算的革命性技术(3)
  • 浅谈人工智能之阿里云搭建coze平台
  • 【大前端】React 父子组件通信、子父通信、以及兄弟(同级)组件通信
  • 【轨物方案】创新驱动、精准运维:轨物科技场站光伏组件缺陷现场检测解决方案深度解析
  • 【QT随笔】事件过滤器(installEventFilter 和 eventFilter 的组合)之生命周期管理详解
  • 卷积神经网络CNN-part2-简单的CNN
  • 深度学习篇---InceptionNet
  • 深度学习——卷积神经网络
  • 服务器搭建日记(十二):创建专用用户通过 Navicat 远程连接 MySQL
  • Mac电脑Tomcat+Java项目中 代码更新但8080端口内容没有更新
  • 最新KeyShot 2025安装包下载及详细安装教程
  • leetcode210.课程表II
  • STM32F103按钮实验
  • Redis基础篇
  • 新后端漏洞(上)- Redis 4.x5.x 未授权访问漏洞
  • COB封装固晶载具/IC芯片固晶载具核心功能与核心要求
  • 《明朝那些事》读书笔记-王阳明:「知行合一」
  • Prometheus 配置主机宕机告警
  • 同城跑腿系统 跑腿小程序app java源码 跑腿软件项目运营
  • 存算一体:重构AI计算的革命性技术(2)
  • “互联网 +”时代商业生态变革:以开源 AI 智能名片链动 2+1 模式 S2B2C 商城小程序为例
  • 小程序点击之数据绑定
  • 深度学习三大框架对比评测:PaddlePaddle、PyTorch 与 TensorFlow
  • 从零开始的python学习——列表