irpas技术客

Redis-NoSQL数据库_小狱!

大大的周 8181


Redis 一、Redis概述二、Redis特性1、特点2、Redis单线程3、Redis数据回收策略 三、Redis对比Memcached四、Redis典型应用场景五、搭建Redis服务


一、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.1redisCentos7.4redis-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



1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #RedisNoSQL数据库 #是一个开源的使用 #ansi #C #语言编写遵守 #BSD