Version: Next

Redis入门

概述

Redis是什么

Remote Dictionary Server——远程字典服务

Redis能干什么

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

每秒写8万次,读11万次

  1. 内存存储、持久化,内存中是断电即失,所以持久化很重要(RDB、AOF)
  2. 效率高,可用于高效缓存
  3. 发布订阅系统
  4. 地图信息分析
  5. 计时器、技术去(网站浏览量)

Redis的特性

  • 多样的数据类型
  • 持久化
  • 集群
  • 事务

Linux安装Redis

  1. 官网下载Redis安装包

  2. 使用filezila将安装包上传到Linux的home目录下

  3. 将redis安装包移动到/opt路径下

    mv redis-6.0.3.tar.gz /opt
  4. 解压redis安装包

    tar -zxvf redis-6.0.3.tar.gz

    image-20200521213319799

  5. 安装

    • centos

      yum install gcc-c++
      sudo make
    • ubuntu

      sudo make

      报找不到cc错误则安装gcc

      sudo apt install gcc

      此时执行make命令,如果报错,是因为上次编译有残留文件。

      make distclean

      运行测试

      sudo make test

      安装redis到/usr/local/bin目录

      sudo make install

      进入/usr/local/bin查看

      image-20200521214809394

  1. 将redis配置文件复制到当前目录下

    mkdir myconfig
    cp /opt/redis-6.0.3/redis.conf myconfig

    之后就是用这个配置文件进行启动

  2. redis默认不是后台启动的,修改配置文件

    sudo nano redis.conf

    修改daemonize nodaemonize yes,开启后台启动

  3. 启动redis服务

    使用指定的配置文件启动redis

    redis-server myconfig/redis.conf

    image-20200521220720217

  4. 使用redis客户端

    • -h:主机

    • -p:端口

      redis-cli -p 6379

      测试存取一个键值对

      set key value
      get key

    image-20200521221022797

    查看所有的键

    keys *

    查看redis进程是否开启

    ps -ef | grep redis

    image-20200521222137669

  5. 退出redis

    shutdown

    然后

    exit

    image-20200521222306661

    同时关闭redis-serverredis-cli

    ps -ef | grep redis

    会发现进程已经消失

    redis-benchmar性能测试工具

  • -p:端口

  • -h:主机

  • -c:连接数

  • -n:并发数

    测试50个并发链接,每一个链接10w个请求

    redis-benchmark -p 6379 -c 50 -n 100000

Redis基础知识

切换数据库

redis默认有16个数据库,可在配置文件中看到

默认使用第0个数据库,可使用select进行切换

select 数据库索引号

查看数据库大小

dbsize

查看当前数据库中所有的key

keys *

清空当前数据库

flushdb

清空所有数据库

flushall

Redis是单线程还是多线程

单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。

redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。

  • 绝大部分请求是纯粹的内存操作(非常快速)

  • 采用单线程,避免了不必要的上下文切换和竞争条件

  • 非阻塞IO - IO多路复用

Redis基于C开发,100000QPS

Redis为什么单线程还这么快?

  1. 误区1:高性能的服务器一定是多线程的
  2. 误区2:多线程一定比单线程效率高

redis将所有数据存放在内存中,所以使用单线程操作效率很高,对于内存系统而言如果没有上下文切换效率就很高,多次都写都在同一个CPU上