首页 > 技术文章 > Redis从入门到精通——认识 Redis

zuoyang 2021-03-16 11:01 原文

认识 Redis

一、Redis简介

  1.1 Redis的由来

  Redis 是由意大利的一家创业公司 Merzia 的创始人 Salvatore Sanfilippo 于 2009 年开发的一款数据库,最初是为了解决公司内部的一个实时统计系统的性能,后来 Salvatore Sanfilippo 希望有更多人能够适用它。同年,将 Redis 开源发布,然后继续与 Pieter Noordhuis(Redis 代码贡献者)开发 Redis,并不断地完善至今。

  1.2 什么是 Redis

  Redis 是由 Salvatore Sanfilippo 用 C 语言开发的一款开源的、高性能的键值对存储数据库,它采用 BSD 协议,为了适应不用场景下的存储需求,提供了多种键值数据类型。支持丰富的数据类型,比如:字符串、列表、有序集合、散列、集合等。它内置复制、Lua脚本、LRU收回、事务及不同级别磁盘持久化功能,同时通过 Redis Sentinel 实现高可用、通过 Redis Cluster 提供自动分区等相关功能。

  1.3 Redis的特性☆☆☆

  Redis是一款功能强大、支持多种数据类型的数据库,它具有许多优秀的特性,具体如下:

    • 支持多种计算机编程语言,如Java、C、C++、Python、PHP、Lua、Ruby、Node.js、C#、GoLand等。
    • 具有丰富的数据类型,如字符串、列表有序集合、散列及集合等。
    • 支持多种数据结构。如哈希、集合、位图、GEO(地理信息位置)。
    • 读/些速度快,性能高。官方给出数据是:Redis能读的速度是110000次/s,写的速度是 8000次/s,之所以有这么快的读/写速度,是因为这些数据都存储在内存中。
    • 支持持久化。Redis 的持久化也就是备份数据,它每隔一段时间就将内存的数据保存在磁盘中,在重启的时候 会再次加载到内存中,从而实现数据持久化。Redis 的持久化方式是 RDB 和 AOF。
    • 简单且强大。如利用 Redis 可以实现消息订阅发布、Lua 脚本、数据库事务、Pipline(管道,即当指令达到一定数量后,客户端才会执行)。同时 Redis 是单线程的,它不依赖外部库,它的所有操作都是原子性的,使用简单。
    • 实现高可用主从复制,主从节点做数据副本。
    • 实现分布式集群和高可用。Redis Cluster 支持分布式,进而可以实现分布式集群;Redis Sentinel 支持高可用。

  1.4 Redis的使用场景☆☆☆

    • 做缓存。这是 Redis 使用最多的场景。Redis 能够替代 Memcached。使用 Redis,不需要每次都重新生成数据,而且它的缓存速度和查询速度比较快,使用也比较方便。比如,实现数据查询、缓存新闻消息内容、缓存商品内存或购物车等。
    • 做计数器应用。Redis 的命令具有原子性,它提供了 INCR、DECR、GETSET、INCRBY等相关命令来构建计算器系统,可以使用 Redis来记录一个热门帖子的转发数、评论数。通过 Redis 的原子递增,可以实现在任何时候封锁一个IP地址等。
    • 实现消息队列系统。Redis 运行稳定,速度快,支持模式匹配,也可以实现消息订阅发布。Redis 还有阻塞队列的命令,能够让一个程序在执行时的命令,能够让一个程序在执行时被另外一个程序添加到队列中。比如,实现秒杀、抢购等。
    • 做实时系统、消息系统。可以利用 Redis 的 set 功能做实时功系统,来查看某个用户是否进行了某项操作,对其行为进行统计对比。也可以利用 Redis 的 Pub/Sub 构建消息系统,如在线聊天系统。
    • 实现排行榜应用。排行榜的实现利用了 Redis 有序集合。比如,对上百万个用户的排名,采用其他数据库来实现是非常困难的,而利用 Redis 的 ZADD、ZREVRANGE、ZRANK 等命令可以轻松实现排名并获取排名的用户。
    • 做数据过期处理。我们可以将要 sorted set 的 score 值设置成过期时间的时间戳,然后通过过期时间排序,找出过期的数据进行删除。可以采用过期属性来确认一个关键字在什么时候应该被删除。也可以利用 UNIX 时间作为关键字,将列表按时间排序。对 currenttime 和 timeto_live 进行检索,查询出过期的数据,进而删除。
    • 分布式集群架构中的 session 分离。采用分布式集群部署,可以满足一个 Web 应用系统被大规模访问的需要。而要实现分布式集群部署,就要解决 session 统一的问题,通常可以采用 Redis 来实现 session 共享机制,以达到 session 统一的目的。
    • ……

二、搭建 Redis 环境

  2.1 新建 redis 要安装的目录

[root@localhost.localdomain ~]#mkdir -pv /usr/local/redis/release
mkdir: created directory ‘/usr/local/redis’
mkdir: created directory ‘/usr/local/redis/release’
[root@localhost.localdomain ~]#cd /usr/local/redis/release
[root@localhost.localdomain release]#wget https://download.redis.io/releases/redis-4.0.9.tar.gz
--2021-03-17 10:15:09--  https://download.redis.io/releases/redis-4.0.9.tar.gz
Resolving download.redis.io (download.redis.io)... 45.60.125.1
Connecting to download.redis.io (download.redis.io)|45.60.125.1|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1737022 (1.7M) [application/octet-stream]
Saving to: ‘redis-4.0.9.tar.gz’

100%[===================================================================================================================>] 1,737,022   1.29MB/s   in 1.3s   

2021-03-17 10:15:11 (1.29 MB/s) - ‘redis-4.0.9.tar.gz’ saved [1737022/1737022]

[root@localhost.localdomain release]#

  2.2 下载完成后,查看下载文件,将会看到刚才下载的文件 redis-4.0.9.tar.gz,然后使用解压命令,解压缩这个包,并做软连。

[root@localhost.localdomain release]#ll
total 1700
-rw-r--r--. 1 root root 1737022 Jun 27  2020 redis-4.0.9.tar.gz
[root@localhost.localdomain release]#tar -zxf redis-4.0.9.tar.gz 
[root@localhost.localdomain release]#ll
total 1704
drwxrwxr-x. 6 root root    4096 Mar 27  2018 redis-4.0.9
-rw-r--r--. 1 root root 1737022 Jun 27  2020 redis-4.0.9.tar.gz
[root@localhost.localdomain release]#rm -rf redis-4.0.9.tar.gz 
[root@localhost.localdomain release]#cd ..
[root@localhost.localdomain redis]#ln -snvf release/redis-4.0.9 current

  2.3 做完软连,输入命令进入redis文件夹,执行make进行安装。执行过程中遇到报错,缺少gcc,执行安装命令 yum install -y gcc ,继续 make

[root@localhost.localdomain ~]#cd /usr/local/redis/current
[root@localhost.localdomain current]#ll
total 304
-rw-rw-r--.  1 root root 157632 Mar 27  2018 00-RELEASENOTES
-rw-rw-r--.  1 root root     53 Mar 27  2018 BUGS
-rw-rw-r--.  1 root root   1815 Mar 27  2018 CONTRIBUTING
-rw-rw-r--.  1 root root   1487 Mar 27  2018 COPYING
drwxrwxr-x.  6 root root    192 Mar 17 10:22 deps
-rw-rw-r--.  1 root root     11 Mar 27  2018 INSTALL
-rw-rw-r--.  1 root root    151 Mar 27  2018 Makefile
-rw-rw-r--.  1 root root   4223 Mar 27  2018 MANIFESTO
-rw-rw-r--.  1 root root  20543 Mar 27  2018 README.md
-rw-rw-r--.  1 root root  58766 Mar 27  2018 redis.conf
-rwxrwxr-x.  1 root root    271 Mar 27  2018 runtest
-rwxrwxr-x.  1 root root    280 Mar 27  2018 runtest-cluster
-rwxrwxr-x.  1 root root    281 Mar 27  2018 runtest-sentinel
-rw-rw-r--.  1 root root   7606 Mar 27  2018 sentinel.conf
drwxrwxr-x.  3 root root   8192 Mar 17 10:23 src
drwxrwxr-x. 10 root root    167 Mar 27  2018 tests
drwxrwxr-x.  8 root root   4096 Mar 27  2018 utils
[root@localhost.localdomain current]#make MALLOC=libc

  2.4 make 执行完成后,执行make test,遇到报错,缺少tcl,yum install tcl 即可。

[root@localhost.localdomain current]#make test

  2.5 make test 正常结果如下,make test 可以不执行,为了测试验证使用:

  2.6 在 current/src 目录下,编译成功后,会出现一个 redis-server 执行文件,以及 redis-cli 执行文件。

[root@localhost.localdomain current]#pwd
/usr/local/redis/current
[root@localhost.localdomain current]#ll src/redis-*
-rwxr-xr-x. 1 root root  353872 Mar 17 10:23 src/redis-benchmark
-rw-rw-r--. 1 root root   29605 Mar 27  2018 src/redis-benchmark.c
-rw-r--r--. 1 root root  109056 Mar 17 10:23 src/redis-benchmark.o
-rwxr-xr-x. 1 root root 3639512 Mar 17 10:23 src/redis-check-aof
-rw-rw-r--. 1 root root    7143 Mar 27  2018 src/redis-check-aof.c
-rw-r--r--. 1 root root   28608 Mar 17 10:23 src/redis-check-aof.o
-rwxr-xr-x. 1 root root 3639512 Mar 17 10:23 src/redis-check-rdb
-rw-rw-r--. 1 root root   13898 Mar 27  2018 src/redis-check-rdb.c
-rw-r--r--. 1 root root   62720 Mar 17 10:23 src/redis-check-rdb.o
-rwxr-xr-x. 1 root root  519112 Mar 17 10:23 src/redis-cli
-rw-rw-r--. 1 root root   99693 Mar 27  2018 src/redis-cli.c
-rw-r--r--. 1 root root  393224 Mar 17 10:23 src/redis-cli.o
-rwxr-xr-x. 1 root root 3639512 Mar 17 10:23 src/redis-sentinel
-rwxr-xr-x. 1 root root 3639512 Mar 17 10:23 src/redis-server
-rwxrwxr-x. 1 root root   65991 Mar 27  2018 src/redis-trib.rb
[root@localhost.localdomain current]#

  2.7 进入/usr/local/redis/current 目录,输入命令 ./redis-server 来启动 redis 服务。

[root@localhost.localdomain src]#./redis-server 
55893:C 17 Mar 10:37:06.421 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
55893:C 17 Mar 10:37:06.421 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=55893, just started
55893:C 17 Mar 10:37:06.421 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
55893:M 17 Mar 10:37:06.421 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 55893
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

55893:M 17 Mar 10:37:06.422 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
55893:M 17 Mar 10:37:06.422 # Server initialized
55893:M 17 Mar 10:37:06.422 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
55893:M 17 Mar 10:37:06.422 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
55893:M 17 Mar 10:37:06.423 * Ready to accept connections

  2.8 解决上面报错,执行命令如下:

[root@localhost.localdomain src]#sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@localhost.localdomain src]#echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@localhost.localdomain src]#echo 511 > /proc/sys/net/core/somaxconn
[root@localhost.localdomain src]#./redis-server 
55903:C 17 Mar 10:40:35.362 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
55903:C 17 Mar 10:40:35.362 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=55903, just started
55903:C 17 Mar 10:40:35.362 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
55903:M 17 Mar 10:40:35.363 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 55903
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

55903:M 17 Mar 10:40:35.363 # Server initialized
55903:M 17 Mar 10:40:35.363 * DB loaded from disk: 0.000 seconds
55903:M 17 Mar 10:40:35.363 * Ready to accept connections

  至此,完成单机简单安装!

推荐阅读