Redis-NoSQL数据库


Redis

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

Redis-NoSQL数据库_第1张图片


一、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 <>/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 <>/var/www/html/index.php
<?php
phpinfo();
?>
END
[root@redis ~]# cat <>/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

Redis-NoSQL数据库_第2张图片


你可能感兴趣的:(Nosql数据库,redis,centos,数据库,nosql数据库)