Redis数据库

1 Redis概述

1.1 Redis介绍

​ Redis(Remote Dictionary Server)是一个开源的内存数据库,使用C语言编写,可基于内存亦可持久化,提供多种语言的API。它以其高性能、丰富的数据类型以及简单的单线程模型等特点而广受欢迎。

​ Redis提供了一个高性能的键值(key-value)存储系统,能够支持每秒数十万次的读写操作,因此特别适用于处理高并发请求和需要快速响应的场景,如缓存、会话管理、排行榜等。它支持多种数据结构,包括字符串、列表、哈希表、集合、有序集合等,为开发者提供了灵活的数据操作能力,可以适应各种不同的应用场景。

​ 此外,Redis还支持数据持久化,可以将内存中的数据异步地保存到硬盘上,防止数据在程序重启时丢失。

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.4 Redis版本

  • 最新版本:6.0
  • 历史版本:2.4、2.6、2.8、3.0(里程碑)、3.2、3.4、4.0、5.0(教学环境版本)、6.0

1.5 Redis附加功能

  • 数据持久化

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

  • 过期键功能

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

  • 主从同步

  • Sentinel哨兵

1.6 Redis安装

1.6.1 Rocky Linux操作系统
  • 安装命令

    • 第1步:更新系统,执行:dnf update -y
    • 第2步:安装Redis,执行:dnf -y install redis
  • Redis服务端操作

    • 启动数据库服务:systemctl start redis

    • 停止数据库服务:systemctl stop redis

    • 查看数据库状态:systemctl status redis

    • 重启数据库服务:systemctl restart redis

  • Redis客户端连接

    redis-cli -h IP地址 -p 端口号 -a 密码

    redis-cli -h 127.0.0.1 -p 6379 -a 密码
    
    # 如不指定IP地址和端口,默认连接本机的6379端口
    redis-cli
    
1.6.2 Windows操作系统
  • 下载安装包

    https://github.com/ServiceStack/redis-windows/blob/master/downloads/redis-64.3.0.503.zip

  • 将Redis服务添加到本地服务

    • 第1步:解压之后进入 redis-server.exe 文件所在的目录;
    • 第2步:地址栏输入cmd + 回车,进入到cmd命令行;
    • 第3步:执行命令 redis-server --service-install redis.windows.conf --loglevel verbose
    • 第4步:右键桌面的计算机 - 管理 - 服务 - 找到Redis并双击 - 点击启动,即可启动Redis服务
    • 第5步:打开cmd命令行,输入 redis-cli 命令,即可进入到redis的命令行模式
1.6.3 Mac操作系统

brew install redis

2 配置文件详解

  • 配置文件所在路径

    /etc/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 123456
       127.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 和 BRPOP
      	1、如果弹出的列表不存在或者为空,就会阻塞
    	2、超时时间设置为0,就是永久阻塞,直到有数据可以弹出
    	3、如果多个客户端阻塞再同一个列表上,使用First In First Service原则,先到先服务
    11、删除指定元素
    	LREM key count value
        count>0:表示从头部开始向表尾搜索,移除与value相等的元素,数量为count
    	count<0:表示从尾部开始向表头搜索,移除与value相等的元素,数量为count
    	count=0:移除表中所有与value相等的值
    12、保留指定范围内的元素
    	LTRIM key start stop
      LRTIM 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 20190520
    	user:10000 user:605 20190521
    2、用户维度统计
       统计数包括:关注数、粉丝数、喜欢商品数、发帖数
       用户为key,不同维度为field,value为统计数
       比如关注了5人
    	HSET user:10000 fans 5
    	HINCRBY 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
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐