一.Redis 介绍
Redis 和 Memcached 都是非关系型数据库也称为 NoSQL 数据库,MySQL、
Mariadb、SQL Server、PostgreSQL、Oracle 数据库属于关系型数据
关系型数据库(RDBMS, Relational Database Management System)。
1.1 Redis 介绍
Redis(Remote Dictionary Server)在 2009 年发布,开发者 Salvatore Sanfilippo
是意大利开发者,他本想为自己的公司开发一个用于替换 MySQL 的产品 Redis,但
是没有想到他把 Redis 开源后大受欢迎,短短几年,Redis 就有了 大的用户群体,
目前国内外使用的公司有知乎网、新浪微博、GitHub 等
redis 是一个开源的、遵循 BSD 协议的、基于内存的而且目前比较流行的键值数据
库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远
程共享的一种服务,提供类似功能的还有 memcache,但相比 memcache,redis 还
提供了易扩展、高性能、具备数据持久性等功能。
Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛,目前 redis 在
DB-Engine 月排行榜中一直比较靠前,而且一直是键值型存储类的首位。
1.2 Redis 对比 Memcached
Memcached 不支持数据持久化,而 Redis 支持数据的持久化:可以将内存中的数据
保持在磁盘中,重启 redis 服务或者服务器之后可以从备份文件中恢复数据到内存
继续使用。
-
Redis 支持更多的数据类型:支持 string(字符串)、hash(哈希数据)、
list(列表)、set(集合)、zet(有序集合) -
Redis 支持数据的备份:可以实现类似于数据的 master-slave 模式的数据备份,
另外也支持使用快照+AOF。 -
Redis 支持更大的 value 数据:memcache 单个 key value 最大只支持 1MB,
而 redis 最大支持 512MB。 -
Redis 是单线程,而 memcache 是多线程,所以单机情况下没有 memcache 并发
高,但 redis 支持分布式集群以实现 -
Redis 支持更高的并发,单 Redis 实例可以实现数万并发。
-
Redis 支持集群横向扩展:基于 redis cluster 的横向扩展,可以实现分布式
集群,大幅提升性能和数据安全性。Redis 和 memcached 都是基于 C 语言开发。
二.Redis 单机部署
2.1 Redis 安装
2.1.1 使用包管理器安装
Redis 属于 epel 源的软件,centos 需要安装 epel 源
[root@redis-server-node1 ~]# yum install epel-release -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.huaweicloud.com
* epel: mirror.lzu.edu.cn
* extras: mirrors.huaweicloud.com
* updates: mirror.bit.edu.cn
Installed Packages
redis.x86_64 3.2.12-2.el7 @epel
# 此处@epel表示已经安装
安装 redis
[root@redis-server-node1 ~]# yum install redis -y
[root@redis-server-node1 ~]# systemctl start redis
[root@redis-server-node1 ~]# systemctl enable redis
# 连接试试
[root@redis-server-node1 ~]# redis-cli
127.0.0.1:6379> info
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-1062.1.1.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:1725
run_id:01b34011ed867c89345b70550dbc18d45b691574
tcp_port:6379
uptime_in_seconds:1955
uptime_in_days:0
hz:10
lru_clock:3993132
executable:/usr/bin/redis-server
config_file:/etc/redis.conf
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:813568
used_memory_human:794.50K
used_memory_rss:6037504
used_memory_rss_human:5.76M
used_memory_peak:813568
used_memory_peak_human:794.50K
total_system_memory:3972988928
total_system_memory_human:3.70G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:7.42
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1581050382
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:2
total_commands_processed:12
instantaneous_ops_per_sec:0
total_net_input_bytes:447
total_net_output_bytes:22158
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:3
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:646
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:1.27
used_cpu_user:0.59
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
# 存储K-V试试
127.0.0.1:6379> set url www.suosuoli.cn
OK
127.0.0.1:6379> get url
"www.suosuoli.cn"
127.0.0.1:6379>
2.1.2 编译安装
2.1.2.1 编译安装
下载当前最新 release 版本 redis 源码包
[root@redis-server-node1 src]# tar -xf redis-5.0.7.tar.gz
[root@redis-server-node1 redis-5.0.7]# pwd
/usr/local/src/redis-5.0.7
[root@redis-server-node1 redis-5.0.7]# make PREFIX=/apps/redis install
[root@redis-server-node1 redis-5.0.7]# ll /apps/redis/
total 4
drwxr-xr-x 2 root root 4096 Feb 8 11:38 bin
# 创建redis用户和数据目录
[root@redis-server-node1 redis-5.0.7]# useradd -u 994 -s /sbin/nologin
[root@redis-server-node1 redis-5.0.7]# id redis
uid=996(redis) gid=994(redis) groups=994(redis)
[root@redis-server-node1 redis-5.0.7]# mkdir /apps/redis/{etc,logs,data,run} -v
mkdir: created directory ‘/apps/redis/etc’
mkdir: created directory ‘/apps/redis/logs’
mkdir: created directory ‘/apps/redis/data’
mkdir: created directory ‘/apps/redis/run’
[root@redis-server-node1 redis-5.0.7]# chown redis.redis /apps/redis -R
2.1.2.2 前台启动 redis
2.1.2.3 警告解决
的看法接收到看风景的开发商来房间是大佬开发精灵盛典上课的废旧塑料的方式来地方可
-
vm.overcommit_memory
该值设为 0: 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的
可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。该值设
为 1: 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。该值设为
2: 表示内核允许分配超过所有物理内存和交换空间总和的内存。一般设置为 1
vm.overcommit_memory=1
-
transparent hugepage
大页内存动态分配机制,需要关闭让 redis 负责。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
-
tcp-backlog
此处使用云主机没有出现 tcp-backlog 警告,在使用新装的虚拟机时可能会出现The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow. If a connection request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.
backlog 参数控制的是三次握手的时候 server 端收到 client ack 确认号之后的队列值。
net.core.somaxconn = 512
接触警告操作
[root@redis-server-node1 redis-5.0.7]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis-server-node1 redis-5.0.7]# vim /etc/sysctl.conf
net.core.somaxconn=1024
vm.overcommit_memory=1
...
[root@redis-server-node1 redis-5.0.7]# sysctl -p
net.core.somaxconn = 1024
vm.overcommit_memory = 1
...
- 再次启动没有警告
2.1.2.4 编辑 redis 服务启动脚本
可以使用 yum 安装的 service 文件作为参考来编写编译安装的 service 文件
[root@redis-server-node1 redis-5.0.7]# cat /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
# ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
# ExecStop=/usr/libexec/redis-shutdown
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
2.1.2.5 使用 systemd 启动 Redis
[root@redis-server-node1 redis-5.0.7]# cd
[root@redis-server-node1 ~]# systemctl daemon-reload
[root@redis-server-node1 ~]# systemctl start redis
[root@redis-server-node1 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 511 127.0.0.1:6379 *:*
LISTEN 0 511 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:22
[root@redis-server-node1 ~]# systemctl status redis
● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2020-02-09 13:56:54 CST; 1s ago
...
[root@redis-server-node1 ~]# systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
# 连接测试
[root@redis-server-node1 ~]# /apps/redis/bin/redis-cli
127.0.0.1:6379> set url www.suouoli.cn
OK
127.0.0.1:6379> get url
"www.suouoli.cn"
127.0.0.1:6379> info
# Server
redis_version:5.0.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:831df5170c6e139f
redis_mode:standalone
os:Linux 3.10.0-1062.1.1.el7.x86_64 x86_64
...
2.1.2.6 使用非本机客户端连接 redis
~$ /apps/redis/bin/redis-cli -h IP/HOSTNAME -p PORT -a PASSWORD
# 如:
[root@steve ~]$redis-cli -h 114.116.248.58 -p 6379 -a stevenux
2.1.2.7 创建 redis 命令的软连接
将命令链接到/usr/bin
下,不再输入命令的绝对路径
[root@redis-server-node1 ~]# ln -sv /apps/redis/bin/redis-* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
编译安装后的额命令功能
[root@redis-server-node1 ~]# ll /apps/redis/bin/
total 32772
-rwxr-xr-x 1 redis redis 4366824 Feb 8 11:38 redis-benchmark # redis的性能测试工具
-rwxr-xr-x 1 redis redis 8125216 Feb 8 11:38 redis-check-aof # AOF文件检查工具
-rwxr-xr-x 1 redis redis 8125216 Feb 8 11:38 redis-check-rdb # RDB文件检查工具
-rwxr-xr-x 1 redis redis 4807896 Feb 8 11:38 redis-cli # redis客户端,连接redis数据库使用
lrwxrwxrwx 1 redis redis 12 Feb 8 11:38 redis-sentinel -> redis-server # redis哨兵,使用软连接连到redis-server
-rwxr-xr-x 1 redis redis 8125216 Feb 8 11:38 redis-server # redis服务
2.1.3 windows 安装 redis
强烈不推荐在生产环境使用 Windows 系统运行 Redis 服务。开发测试时可以使用。
2.2 Redis 使用
2.2.1 连接到 redis
运维人员和各种语言编写的程序的都可以连接到 redis 数据库,主要有以下几种方式:
2.2.1.1 运维式的连接
- 本机非密码
~$ redis-cli
- 跨主机非密码
~$ redis-cli -h HOSTNAME/IP -p PORT
- 跨主机使用密码
~$ redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD
2.2.1.2 shell 程序连接 redis
shell 脚本连接和写入数据
脚本
[root@redis-server-node1 ~]# vim redis-test.sh
#!/bin/bash
# A connection prog for redis.
NUM=`seq 1 10000` # 使用for循环写入10000个键值对
for i in ${NUM};do
redis-cli -h 127.0.0.1 set key-${i} value-${i}
done
测试
[root@redis-server-node1 ~]# chmod u+x redis-test.sh
[root@redis-server-node1 ~]# ./redis-test.sh
[root@redis-server-node1 ~]# time ./redis