OddFar's Notes OddFar's Notes
首页
  • Java-Se

    • Java基础
    • Java面向对象
    • Java常用类
    • Java集合框架
  • Java-Se进阶

    • JUC多线程
  • Java-ee

    • JavaWeb
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • Redis
    • ElasticSearch
    • MongoDB
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • Spring

    • Spring
  • 中间件

    • RabbitMQ
  • Git
  • Docker
  • Jenkins
爬虫
  • Campus (opens new window)
  • 校园信息墙 (opens new window)
关于
归档
GitHub (opens new window)
首页
  • Java-Se

    • Java基础
    • Java面向对象
    • Java常用类
    • Java集合框架
  • Java-Se进阶

    • JUC多线程
  • Java-ee

    • JavaWeb
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • Redis
    • ElasticSearch
    • MongoDB
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • Spring

    • Spring
  • 中间件

    • RabbitMQ
  • Git
  • Docker
  • Jenkins
爬虫
  • Campus (opens new window)
  • 校园信息墙 (opens new window)
关于
归档
GitHub (opens new window)
  • MySQL

  • Redis

    • Redis - 知识体系
    • Redis - 概念和基础
      • 概述
      • 常用网站
      • 安装Redis
      • 基础知识说明
        • redis压力测试
        • 基本数据库常识
      • 关于redis的单线程
    • Redis - 五大数据类型
    • Redis - 三种特殊数据类型
    • Redis - 事务
    • Redis - Java
    • Redis - 学习笔记-总览
  • ElasticSearch

  • MongoDB

  • 数据库
  • Redis
zhiyuan
2021-05-17
目录

Redis - 概念和基础

狂神redis视频教程视频教程:https://www.bilibili.com/video/BV1S54y1R7SB

# 概述

Redis:REmote DIctionary Server(远程字典服务器)

是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key/Value)分布式内存数据 库,基于内存运行,并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器

Redis与其他key-value缓存产品有以下三个特点

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的 key-value 类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

# 常用网站

  • 官网

    https://redis.io/

  • 中文网

    http://www.redis.cn

# 安装Redis

由于企业里面做Redis开发,99%都是Linux版的运用和安装,几乎不会涉及到Windows版,所以这里就以linux版为主,可以自己去测试玩玩,Windows安装及使用教程:https://www.cnblogs.com/xing-nb/p/12146449.html

linux直接去官网下载:https://redis.io/download

安装步骤(基于当时最新版6.2.1):

  1. 下载压缩包,放置Linux的目录下 /opt

  2. 在/opt 目录下解压,命令 : tar -zxvf redis-6.2.1.tar.gz

  3. 解压完成后出现文件夹:redis-6.2.1

  4. 进入目录: cd redis-6.2.1

  5. 在 redis-6.2.1 目录下执行 make 命令

    运行make命令时故意出现的错误解析:

    1. 安装gcc (gcc是linux下的一个编译程序,是c程序的编译工具)

      能上网: yum install gcc-c++

      版本测试: gcc-v

    2. 二次make

    3. Jemalloc/jemalloc.h:没有那个文件或目录

      运行 make distclean 之后再make

    4. Redis Test(可以不用执行)

  6. 如果make完成后执行 make install

  7. 查看默认安装目录:cd /usr/local/bin

    /usr 这是一个非常重要的目录,类似于windows下的Program Files,存放用户的程序

    image-20210406233231151

  8. redis默认不是后台启动,修改文件

    一般我们在 /usr/local/bin 目录下,创建myconfig目录,存放我们的配置文件

    cd /usr/local/bin
    mkdir myconfig   #创建目录
    
    #拷贝配置文件
    cd /opt/redis-6.2.1
    cp redis.conf /usr/local/bin # 拷一个备份,养成良好的习惯,我们就修改这个文件
    # 修改配置保证可以后台应用
    vim redis.conf
    /daemonize   #查找
    :wq    #保存
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    image-20210406234601005

    • A、redis.conf配置文件中daemonize守护线程,默认是NO。
    • B、daemonize是用来指定redis是否要用守护线程的方式启动。

    daemonize 设置yes或者no区别

    • daemonize:yes

      redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项 pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。

    • daemonize:no

      当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。

  9. 启动测试一下!

  • 启动redis服务

    cd /usr/local/bin
    redis-server myconfig/redis.conf
    
    1
    2
  • redis客户端连接

       redis-cli -p 6379
    
    1

    观察地址的变化,如果连接成功,是直接连上的,redis默认端口号 6379

    image

  • 执行ping、get和set操作、退出

       127.0.0.1:6379> ping
       PONG
       127.0.0.1:6379> get hello
       (nil)
       127.0.0.1:6379> set hello zhiyuan
       OK
       127.0.0.1:6379> get hello
       "zhiyuan"
    
    1
    2
    3
    4
    5
    6
    7
    8

    image-20210407001739971

  • 关闭连接

       127.0.0.1:6379> shutdown
       not connected> exit
    
    1
    2

可以使用指令ps -ef|grep redis显示系统当前redis 进程信息,查看开启和关闭连接的变化

# 基础知识说明

# redis压力测试

Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。

redis 性能测试工具可选参数如下所示:

序号 选项 描述 默认值
1 -h 指定服务器主机名 127.0.0.1
2 -p 指定服务器端口 6379
3 -s 指定服务器 socket
4 -c 指定并发连接数 50
5 -n 指定请求数 10000
6 -d 以字节的形式指定 SET/GET 值的数据大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用随机 key, SADD 使用随机值
9 -P 通过管道传输 numreq 请求 1
10 -q 强制退出 redis。仅显示 query/sec 值
11 --csv 以 CSV 格式输出
12 -l 生成循环,永久执行测试
13 -t 仅运行以逗号分隔的测试命令列表。
14 -I Idle 模式。仅打开 N 个 idle 连接并等待。
# 测试:100个并发连接,100000个请求,检测host为localhost 端口为6379的redis服务器性能
cd  /usr/local/bin
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
1
2
3

参考资料:https://www.runoob.com/redis/redis-benchmarks.html

# 基本数据库常识

默认16个数据库,类似数组下标从零开始,初始默认使用零号库

查看 redis.conf ,里面有默认的配置

# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
1
2
3
4

Select命令切换数据库

127.0.0.1:6379> select 7
OK
127.0.0.1:6379[7]>
# 不同的库可以存不同的数据
1
2
3
4

Dbsize查看当前数据库的key的数量

127.0.0.1:6379> select 7
OK
127.0.0.1:6379[7]> DBSIZE
(integer) 0
127.0.0.1:6379[7]> select 0
OK
127.0.0.1:6379> DBSIZE
(integer) 5
127.0.0.1:6379> keys * # 查看具体的key
1) "counter:__rand_int__"
2) "mylist"
3) "k1"
4) "myset:__rand_int__"
5) "key:__rand_int__"
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Flushdb:清空当前库

Flushall:清空全部的库

127.0.0.1:6379> DBSIZE
(integer) 5
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> DBSIZE
(integer) 0
1
2
3
4
5
6

# 关于redis的单线程

注:6.x版本有多线程,一般用不到,单线程足够应对

我们首先要明白,Redis很快!官方表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就 顺理成章地采用单线程的方案了!

Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差!

Redis为什么这么快?

redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为 多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切 换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存 的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处 理这个事。在内存的情况下,这个方案就是最佳方案。

因为一次CPU上下文的切换大概在 1500ns 左右。从内存中读取 1MB 的连续数据,耗时大约为 250us, 假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了,我还不算你每次读一点数据的时间。

在 GitHub 上编辑此页 (opens new window)
最后更新: 2023/03/26, 13:03:00
Redis - 知识体系
Redis - 五大数据类型

← Redis - 知识体系 Redis - 五大数据类型→

Theme by Vdoing | Copyright © 2021-2023 oddfar | 冀ICP备20001094号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式