ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

  • 虚拟化服务

  • 数据库服务

    • MySQL笔记

    • ELK笔记

    • Redis笔记

      • Redis部署与使用
        • Redis介绍
          • Redis简介
          • Redis应用场景
        • Redis部署
          • 安装Redis
          • 启动Redis
          • 关闭Redis
          • Redis配置文件
        • Redis数据类型
          • str - 字符串类型
          • list - 列表类型
          • hash - 哈希类型
          • set - 集合
          • zset - 有序集合
        • Key命名规范
        • Redis常用命令
          • 通用命令
          • str类型命令
          • list类型命令
          • hash类型命令
          • set类型命令
          • Redis事务
      • Redis持久化与高可用
    • MongoDB笔记

    • Git笔记

  • 监控服务

  • Web服务

  • 数据处理

  • Ops
  • 数据库服务
  • Redis笔记
Hoshinozora
2023-04-06
目录

Redis部署与使用

# Redis介绍

# Redis简介

redis是一个开源的、支持网络交互、可基于内存也可持久化的Key-Value内存数据库,它的特点有:

  • 速度快,性能极高
    • redis的数据存储在内存中,它使用C语言实现,且是单线程架构,处理结构更简单,也减少了CPU之间切换的开销。
    • redis能读的速度是110000次/s,写的速度是81000次/s。
  • 基于键值对的数据结构
    • redis数据库支持多种数据类型,字符串、列表、集合、有序集合、哈希等。
  • 提供丰富的功能
    • 提供键过期功能,可以实现缓存。
    • 提供发布订阅功能,可以实现消息系统。
    • 提供了pipline功能,客户端可以将一批命令一次性传到redis,减少网络开销。
  • 简单稳定
    • 使用单线程模型,使redis服务端处理模型更简单。
    • 不依赖操作系统中的类库,且体积非常小。
  • 提供多种语言的API
    • java、python、php、c/c++、nodejs等。
  • 支持数据持久化
    • RDB和AOF方式。
  • 支持高可用和分布式
    • 自带主从复制、哨兵、集群等。

# Redis应用场景

  • 缓存 - 利用键过期时间
    • 缓存session会话。
    • 缓存用户信息,找不到再去mysql查,查到然后写到redis。
    • 缓存优惠卷等会过期的东西。
  • 排序功能 - 利用列表&有序集合
    • 比如热度排行榜、发布时间排序等。
  • 点击量计数 - 利用计数器
    • 统计阅读数、浏览数、播放数、评论数、点赞数等。
  • 社交网络 - 利用集合
    • 取交集、并集、差集等方式筛选标签,获取特定数据、用户等。
  • 消息队列系统 - 发布订阅
    • 作为中间件,例如配合ELK实现日志收集等。

# Redis部署

# 安装Redis

# 创建相关目录
mkdir /data/apps/redis/{conf,logs,tmp,data}

# 在官网下载Redis源代码包:https://redis.io/download/
tar -xvf redis-7.0.10.tar.gz

# 编译安装
cd ./redis-7.0.10/
make && make install
1
2
3
4
5
6
7
8
9
  • 应用程序
    • redis-server - redis的服务端
    • redis-cli - redis的客户端
    • redis-benchmark - 用于进行redis性能测试的工具
    • redis-check-dump - 用于修复出问题的dump.rdb文件
    • redis-check-aof - 用于修复出问题的AOF文件
    • redis-sentinel - 用于集群管理
  • 相关补充
    • make install会将编译后的二进制可执行文件,复制到所指定的位置,默认为/usr/local/bin。
    • 实际上不执行make install也可以,make成功后,会在程序目录下的src文件夹下,生成二进制可执行文件。可以直接执行,或者手动复制到/bin文件夹里去。

# 启动Redis

  • 服务端
    • redis-server - 启动Redis服务器,默认情况下redis-server会以非daemon的方式启动,默认服务端口为6379。
    • redis-server [配置文件路径].conf - 指定配置文件启动Redis服务器。
  • 客户端
    • redis-cli -h [主机IP] - 启动Redis交互式客户端。
    • redis-cli -h [主机IP] [redis命令] - 非交互式执行Redis命令。

# 关闭Redis

  • Redis客户端中执行shutdown命令。
  • 或者直接非交互式执行redis-cli -h [主机IP] shutdown命令。

# Redis配置文件

# 以守护进程模式启动 (默认no)
daemonize yes

# 绑定的网卡地址 (一般为内网地址)
bind 10.0.0.7

# 监听端口
port 6379

# pid文件路径
pidfile [路径]

#log文件路径
logfile [路径]

# 设置数据库的数量 (默认数据库为0)
databases 16

# 本地持久化数据库的目录
dir [路径]

# 本地持久化数据库的文件名(默认是dump.rdb)
dbfilename redis_6379.rdb

# 指定客户端登录服务器时需要验证密码,可不填
requirepass [密码]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# Redis数据类型

# str - 字符串类型

  • 用于存储字符串数据,也可将图片文件内容(二进制) 作为字符串来存储。
  • 同时str类型也可以作为数值进行操作,遇到数值操作时,redis会将全为数字的字符串转换成数值再进行操作。

# list - 列表类型

  • Redis中的list在底层实现上并不是数组,而是链表。
    • 所以在头部和尾部插入一个新元素,无论数据量多大,其消耗的时间基本都是常数。也就是说插入一个新元素到有十个元素的列表,和插入一个新元素到有千万个元素的列表的速度基本是相同的。
    • 但同时链表型list的元素定位会比较慢,而数组型list的元素定位就会快得多,所以redis的列表更适合作为队列使用。
  • Redis中我们可以利用list来实现消息队列、分页、数据存储等功能。

# hash - 哈希类型

  • hash类型是一个键值对(key-value)的集合,也就是一对多,适合用于存储对象,类似于Python的字典类型。

# set - 集合

  • Redis的集合是一种无序的集合,集合中的元素没有先后顺序,且无法加入已有的值,也就是不允许重复。
  • Redis中我们可以利用集合来实现去重、取交集、取并集、取差集等功能。

# zset - 有序集合

  • 就是有顺序排序的集合,也就是添加了索引。

# Key命名规范

  • Key不要超过1024字节,不仅消耗内存,还会降低查找效率。

  • Key也不要太短,太短会造成可读性降低。

  • 统一Key的格式,分隔符、字母是否大写之类,比如:XXX:XXX:XXX、xxx-xxx-xxx。

  • 规划好命名空间,比如:项目名:表名:关键字(主键值):字段名

  • 例子:

    # ROBOT项目下有USER表,而USER表内有ID和NAME和PASSWORD字段,就可以按以下方式进行规划:
    # ROBOT:USER:[ID]:NAME
    ROBOT:USER:2900192841:NAME
    # ROBOT:USER:[ID]:AGE
    ROBOT:USER:2900192841:AGE
    
    1
    2
    3
    4
    5

# Redis常用命令

redis在设置值到一个不存在的key时,会自动创建操作对应的数据类型到key。

# 通用命令

  • keys [key]
    • 查询数据库中的键名,可用通配符匹配键名*?[]。
    • 注意:keys *操作非常危险,生产环境中一般禁止使用,会返回内存中所有键名,如果键名非常多内存占用非常大,执行该命令可能会造成Redis卡死。
  • exists [key]
    • 判断key是否存在,返回 1为存在,0为不存在。
  • del [key]
    • 删除指定key与value。
  • type [key]
    • 返回key的数据类型。
  • expire [key] [seconds]
    • 设置key的过期时间(单位秒),key过期会被删除。
    • 注意:设置过期时间后,如果期间又重新设置了key,则过期时间会被覆盖成默认的永不过期。
  • persist [key]
    • 清除key的过期时间,会重新变回永不过期。
  • ttl [key]
    • 查询key的过期时间。
    • 注意:-1表示key永不过期,-2表示key不存在。

# str类型命令

  • set [key] [value]
    • 设置一个kv键值对。
  • get [key]
    • 获取一个key所对应的值。
  • mset [key1 value1 key2 value2 ...]
    • 设置多个kv键值对。
  • mget [key1 key2 key3 ...]
    • 获取多个key所对应的值。
  • incr [key]
    • 计数器功能,key的数值自增一。
  • incrby [key] [数值]
    • 计数器功能,key的数值自增指定数。

# list类型命令

  • rpush [key value1 value2 ...]

    • 在列表右边插入元素,并返回当前列表的元素个数。
  • rpop [key]

    • 弹出列表的最后一个元素 (移除并获取该元素值)。
  • brpop [key] [超时时间/s]

    • 弹出列表的最后一个元素 (移除并获取该元素值)。
    • 如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止。
    • 超时时间为0时,则表示一直阻塞。
  • lpush [key value1 value2 ...]

    • 在列表左边插入元素,并返回当前列表的元素个数。
  • lpop [key]

    • 弹出列表的第一个元素 (移除并获取该元素值)。
  • blpop [key] [超时时间/s]

    • 弹出列表的第一个元素 (移除并获取该元素值)。
    • 如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止。
    • 超时时间为0时,则表示一直阻塞。
  • llen [key]

    • 查询列表的长度。
  • lrange [key 开始索引 结束索引]

    • 查看列表中指定范围的元素 (开始索引到结束索引之间的元素)。
    • 索引从0开始,支持反向索引,如-1为列表尾部。

# hash类型命令

  • hset [key field value]
    • 设置一个hash类型,同时插入一个字段与值。
  • hget [key field]
    • 获取指定key的字段的值。
  • hmset [key field1 value1 field2 value2 ...]
    • 设置一个hash类型,同时插入多个字段与值。
  • hmget [key field1 field2 ...]
    • 获取指定key的多个指定字段的值。
  • hkeys [key]
    • 获取指定key的哈希表中的所有字段。
  • hgetall [key]
    • 获取指定key的哈希表中的所有字段和值。
  • hincrby [key field 数值]
    • 为哈希中的字段的数字值加上指定数。

# set类型命令

  • sadd [key value1 value2 value3 ...]
    • 插入一个或多个值到集合。
  • smembers [key]
    • 列出指定集合中的所有元素。
  • sismember [key] "[元素值]"
    • 判断指定元素是否在集合中。
    • 存在返回1,不存在返回0。
  • sdiff [key1] [key2]
    • 求差集,取出key1有,而key2没有的值,也就是key1 - key2。
  • sinter [key1] [key2]
    • 求交集,取出key1和key2都有的值。
  • sunion [key1] [key2]
    • 求并集/合集,将key1和key2的值合在一起并去重。

# Redis事务

  • 介绍

    • Redis的事务主要用于客户端批量执行命令,它对事务ACID特性的支持比较简单。
    • Redis的持久性由AOF/RDB实现、隔离性由串行执行实现、不提供原子性、一致性由前面几点一起实现。
    • Redis不提供完整的原子性,在事务执行过程中如果命令执行失败,Redis会忽略该命令继续执行剩余的命令,之所以不提供回滚能力,是由于Redis作者认为Redis定位是快速响应的内存数据库,如果加入回滚能力,将会严重影响效率。
  • 事务执行过程

    • 客户端执行multi命令开启事务。

    • 后续执行的命令会提交到服务端的队列缓存中,直到客户端提交exec命令。

      • 事务中执行的命令在进入队列缓存之前,都会检查命令的合法性,但不会检查语法的合法性。

        # 下列命令的语法错误,但能成功入队
        set multi_key 111 hhh
        # 下列的命令错误,无法入队,事务会被取消
        sssset
        
        1
        2
        3
        4
      • 如果在事务执行过程中因为语法错误导致命令执行失败,则Redis会忽略该命令继续执行剩余的命令。但一般不会出现语法错误的情况,因为语法错误在软件测试阶段就会暴露出来。

    • 客户端执行exec命令后,服务端将会从缓存队列中批量取出命令进行执行,最后响应客户端。

  • 事务相关命令

    • multi - 开始一个新事务
    • exec - 提交事务,执行事务中的所有命令
    • discard - 取消事务,放弃事务中的所有命令
#数据库#Redis
Logstash和Kibana
Redis持久化与高可用

← Logstash和Kibana Redis持久化与高可用→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式