一、Redis概述
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库;一个非关系型数据库,和Memcached类似,它支持存储的value类型相对更多,这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。
与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB,并且在此基础上实现了master-slave(主从)同步,目前由redis项目的开发和维护由vmware厂商负责提供支持。
二、Redis特性
1、特点
- 性能极高-(Redis能支持超过 100K+ 每秒的读写频率);
- 丰富的数据类型-(Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作);
- 原子性-(Redis的所有操作都是原子性(即所有操作要么成功要么失败不执行),同时Redis还支持对几个操作全并后的原子性执行);
- 持久化-(Redis可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务,
但是Redis对持久化的支持不够好,所以一般来说Redis是配合传统的SQL数据库去使用的
); - 单线程-(单进程单线程key-value类型高速内存缓存系统);
- 主从复制-(master-slave模式的数据备份(主从备份)也支持高可用跟分布式)。
2、Redis单线程
Redis6.0版本之前一直都是单线程方式处理用户的请求
单线程为何如此之快?
- 纯内存
- 非阻塞
- 避免线程切换和竟态消耗
注意
- 一次只运行一条命令;
- 拒绝长(慢)命令:keys,flushall,fulshdb;
- 其实并不是单线程:早期版本是单线程单进程,3版本后其实还有其他线程,fysnc file descriptor,close file descriptor。
3、Redis数据回收策略
Redis的回收策略:
volatile-lru
:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰;
volatile-ttl
:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰;
volatile-random
:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰;
allkeys-lru
:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰;
allkeys-random
:从数据集(server.db[i].dict)中任意选择数据淘汰;
no-enviction(驱逐)
:禁止驱逐数据。
三、Redis对比Memcached
支持数据的持久化
:可以将内存中的数据保持在磁盘中,重启redis服务或者重启服务器之后可以从备份文件中恢复数据到内存继续使用;支持更多的数据类型
:支持String(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合);支持数据的备份
:可以实现类似于数据的master-slave模式的数据备份,另外也支持使用快照+AOF支持更大的value数据
:memcached单个key-value最大只支持1MB,而redis最大支持512MB(生产不建议超过2M,性能受影响);单线程
:在Redis6之前,Redis是单线程,而memcached是多线程,所以单机情况下没有memcached并发高,性能更高,但是Redis支持分布式集群以实现更高的并发,单Redis实例可以实现数万并发;支持集群模式横向拓展
:基于redis cluster的横向拓展,可以实现分布式集群,大幅提升性能和数据安全性;都是基于 C 语言开发
。
四、Redis典型应用场景
- Session共享:常见于Web服务集群中的Tomcat或者PHP中多Web服务器的Session共享;
- 缓存:数据查询、电商网站商品信息、新闻内容;
- 计数器:访问排行榜、商品浏览数等或次数相关的数值统计场景;
- 微信社交:共同好友,点赞,评论;
- 消息队列:ELK的日志缓存、部分业务的订阅发布系统;
- 地理位置:基于GEO(地理信息位置),附近的人,摇一摇等。
五、搭建Redis服务
案例环境:
地址 | 主机名 | 系统 | 版本 |
---|---|---|---|
192.168.10.1 | redis | Centos7.4 | redis-4.0.9.tar.gz/redis-6.2.4.tar.gz |
手动安装redis
[root@localhost ~]# hostnamectl set-hostname redis
[root@localhost ~]# bash
[root@redis ~]# echo "192.168.10.1 redis" >> /etc/hosts
[root@redis ~]# wget http://download.redis.io/releases/redis-4.0.9.tar.gz
[root@redis ~]# tar zxvf redis-4.0.9.tar.gz
[root@redis ~]# cd redis-4.0.9
[root@redis redis-4.0.9]# make
[root@redis redis-4.0.9]# echo $?
[root@redis redis-4.0.9]# cd
[root@redis ~]# mkdir -p /usr/local/redis
[root@redis ~]# cp /root/redis-4.0.9/src/redis-server /usr/local/redis/ ##服务端程序
[root@redis ~]# cp /root/redis-4.0.9/src/redis-cli /usr/local/redis/ ##客户端程序
[root@redis ~]# cp /root/redis-4.0.9/redis.conf /usr/local/redis/ ##主配置文件
[root@redis ~]# ls /usr/local/redis/
redis-cli redis.conf redis-server
[root@redis ~]# sed -i '/^bind 127.0.0.1$/s/127.0.0.1/192.168.10.1/g' /usr/local/redis/redis.conf
[root@redis ~]# sed -i '/protected-mode/s/yes/no/g' /usr/local/redis/redis.conf ##关闭redis的保护模式
[root@redis ~]# sed -i '/daemonize/s/no/yes/g' /usr/local/redis/redis.conf ##开启redis的后台守护进程模式
[root@redis ~]# sed -i '/requirepass/s/foobared/123123/g' /usr/local/redis/redis.conf ##设置redis的密码为123123
[root@redis ~]# sed -i '/requirepass 123123/s/^#//g' /usr/local/redis/redis.conf ##开启redis的密码
在线自动安装redis
[root@redis ~]# vim redis-install.sh
#!/bin/bash
#----------------------------------------
#Author: xiaoyu!
#FileName: redis-install.sh
#URL: https://blog.csdn.net/m0_51052245/article/details/123779513
#----------------------------------------
VERSION=redis-6.2.4
PASSWORD=123123
INSTALL_DIR=/app/redis
IPADDR=192.168.10.1
USER=redis
#yum安装基础软件包
yum -y install gcc jemalloc-devel wget
mkdir -p ${INSTALL_DIR}
wget -P ${INSTALL_DIR} http://download.redis.io/releases/${VERSION}.tar.gz
tar xf ${INSTALL_DIR}/${VERSION}.tar.gz -C ${INSTALL_DIR}
cd ${INSTALL_DIR}/${VERSION}
#编译 安装redis
make -j `cat /proc/cpuinfo | grep processor | wc -l` PREFIX=${INSTALL_DIR} install
ln -s ${INSTALL_DIR}/bin/redis-* /usr/bin/
mkdir -p ${INSTALL_DIR}/{conf,log,data,run}
cp ${INSTALL_DIR}/${VERSION}/redis.conf ${INSTALL_DIR}/conf/
#修改配置文件
sed -i "s/bind 127.0.0.1/bind ${IPADDR}/g" ${INSTALL_DIR}/conf/redis.conf
sed -i "/# requirepass/a requirepass ${PASSWORD}" ${INSTALL_DIR}/conf/redis.conf
sed -i "/^dir .*/c dir ${INSTALL_DIR}/data/" ${INSTALL_DIR}/conf/redis.conf
sed -i "/logfile .*/c logfile ${INSTALL_DIR}/log/redis-6379.log" ${INSTALL_DIR}/conf/redis.conf
sed -i "/^pidfile .*/c pidfile ${INSTALL_DIR}/run/redis_6379.pid" ${INSTALL_DIR}/conf/redis.conf
#创建用户
id -u $USER &>> /dev/unll
if [ "$?" == "0" ];then
echo "user $USER Already exists"
else
useradd -r -s /sbin/nologin redis
echo "user $USER Created successfully"
fi
chown -R redis.redis ${INSTALL_DIR}
#设置socket监听(listen)的backlog上限
#表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 1024
vm.overcommit_memory = 1
EOF
sysctl -p
#关闭透明大页
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
/etc/rc.d/rc.local
#设置启动快捷
cat > /usr/lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=${INSTALL_DIR}/bin/redis-server ${INSTALL_DIR}/conf/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT \$MAINPID
#Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF
#启动redis
systemctl daemon-reload && echo "加载成功" || echo "加载失败"
systemctl enable --now redis &> /dev/null && echo "redis启动成功" || echo "redis启动失败"
#显示redis信息
echo "redis信息如下:"
redis-cli -a ${PASSWORD} -h ${IPADDR} INFO Server 2> /dev/null
[root@redis ~]# chmod +x redis-install.sh
[root@redis ~]# ./redis-install.sh
redis配置文件详解
daemonize yes #以后台daemon方式运行redis
pidfile "/var/run/redis.pid" #redis以后台运行,默认pid文件路径/var/run/redis.pid
port 6379 #默认端口
bind 127.0.0.1 #默认绑定本机所有ip地址,为了安全,可以只监听内网ip
timeout 300 #客户端超时设置,单位为秒
loglevel verbose #设置日志级别,支持四个级别:debug、notice、verbose、warning
logfile stdout #日志记录方式,默认为标准输出,logs不写文件,输出到空设备/deb/null
logfile "/usr/local/redis/var/redis.log" #可以指定日志文件路径
databases 16 #开启数据库的数量
save 900 1
save 300 10
save 60 10000
#创建本地数据库快照,格式:save * *
#900秒内,执行1次写操作后触发快照
#300秒内,执行10次写操作
#60秒内,执行10000次写操作
rdbcompression yes #启用数据库lzf压缩,也可以设置为no
dbfilename dump.rdb #本地快照数据库名称
dir "/usr/local/redis/var/" #本地快照数据库存放目录
requirepass 123456 #设置redis数据库连接密码
maxclients 10000 #同一时间最大客户端连接数,0为无限制
maxmemory 1024MB #设定redis最大使用内存,值要小于物理内存,必须设置
appendonly yes #开启日志记录,相当于MySQL的binlog
appendfilename "appendonly.aof" #日志文件名,注意:不是目录路径
appendfsync everysec #设置日志同步的频率,每秒执行同步,还有两个参数always、no一般设置为everysec,相当于MySQL事物日志的写方式
Slaveof #设置数据库为其他数据库的从数据库
Masterauth #主数据库连接需要的密码验证
vm-enabled #是否开启虚拟内存支持 (vm开头的参数都是配置虚拟内存的)
vm-swap-file #设置虚拟内存的交换文件路径
vm-max-memory #设置redis使用的最大物理内存大小
vm-page-size #设置虚拟内存的页大小
vm-pages #设置交换文件的总的page数量
vm-max-threads #设置使用swap存储同时使用的线程数量,通常设置值为核心数相同,如果设置为0,则会以串行方式,对数据的完整性有着极大的保证
Glueoutputbuf #把小的输出缓存存放在一起
hash-max-zipmap-entries #设置hash的临界值
Activerehashing #重新hash
配置启动脚本
[root@redis ~]# cat <<END >>/etc/init.d/redis
#!/bin/sh
# chkconfig: 2345 80 90
# description: Start and Stop redis
#PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/redis/redis-server
REDIS_CLI=/usr/local/redis/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/usr/local/redis/redis.conf"
AUTH="123123"
LISTEN_IP=$(netstat -utpln |grep redis-server |awk '{print $4}'|awk -F':' '{print $1}')
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$REDIS_CLI -h $LISTEN_IP -p $REDISPORT -a $AUTH SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
END
[root@redis01 ~]# chmod 755 /etc/init.d/redis
[root@redis01 ~]# chkconfig --add redis
[root@redis01 ~]# /etc/init.d/redis start
Starting Redis server...
4483:C 28 Mar 21:14:47.437 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
4483:C 28 Mar 21:14:47.437 # Redis version=4.0.9, bits=64, commit=00000000, modified=0, pid=4483, just started
4483:C 28 Mar 21:14:47.437 # Configuration loaded
Redis is running...
[root@redis01 ~]# netstat -utpln | grep redis
tcp 0 0 192.168.10.1:6379 0.0.0.0:* LISTEN 4484/redis-server 1
调整Redis服务
[root@redis ~]# cp /root/redis-4.0.9/src/redis-benchmark /usr/local/redis/
[root@redis ~]# cp /root/redis-4.0.9/src/redis-check-rdb /usr/local/redis/
[root@redis ~]# cp /root/redis-4.0.9/src/redis-check-aof /usr/local/redis/
[root@redis ~]# cp /root/redis-4.0.9/src/redis-sentinel /usr/local/redis/
[root@redis ~]# ls /usr/local/redis/
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis.conf redis-sentinel redis-server
[root@redis ~]# ln -s /usr/local/redis/redis-cli /usr/bin/redis
[root@redis ~]# redis -h 192.168.10.1 -p 6379 -a 123123
[root@redis ~]# redis -a 123123 -h 192.168.10.1
192.168.10.1:6379> set name wuyifan
192.168.10.1:6379> keys *
1) "name"
192.168.10.1:6379> get name
"wuyifan"
192.168.10.1:6379> exit
[root@redis ~]# ln -s /usr/local/redis/redis-benchmark /usr/bin/redis-benchmark
[root@redis ~]# redis-benchmark -h 192.168.100.101 -p 6379 -c 1000 -n 10000
结合PHP测试Redis服务
[root@redis ~]# yum -y install httpd php php-devel
[root@redis ~]# php -v
PHP 5.4.16 (cli) (built: Apr 1 2020 04:07:17)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
#上传包
[root@redis ~]# tar zxvf phpredis-4.0.2.tar.gz
[root@redis ~]# cd phpredis-4.0.2
[root@redis phpredis-4.0.2]# /usr/bin/phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
[root@redis phpredis-4.0.2]# ./configure --with-php-config=/usr/bin/php-config
[root@redis phpredis-4.0.2]# make && make install
[root@redis phpredis-4.0.2]# echo $?
0
[root@redis phpredis-4.0.2]# cd
[root@redis ~]# echo -e "extension_dir = \"/usr/lib64/php/modules/\"\nextension = redis.so" >>/etc/php.ini
[root@redis ~]# systemctl start httpd
[root@redis ~]# netstat -utpln |grep 80
tcp6 0 0 :::80 :::* LISTEN 20572/httpd
[root@redis ~]# cat <<END >>/var/www/html/index.php
<?php
phpinfo();
?>
END
[root@redis ~]# cat <<END >>/var/www/html/test.php
<?php
\$redis = new Redis();
\$redis->connect('192.168.10.1',6379);
\$redis->auth('123123');
\$keys = \$redis->keys("*");
var_dump(\$keys);
?>
END
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/11960.html