Redis数据库

时间:2023-01-30 13:54:50

1.Redis简介

1.1Redis简介

Redis 是当前互联网世界最为流行的 NoSQL(Not Only SQL)数据库。NoSQL 在互联网系统中的作用很大,因为它可以在很大程度上提高互联网系统的性能。

Redis 具备一定持久层的功能,也可以作为一种缓存工具。对于 NoSQL 数据库而言,作为持久层,它存储的数据 是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。

对于那些结构化、多范式规则的数据库系统而言,它更具性能优势。作为缓存,它可以支持大数据存入内存中,只 要命中率高,它就能快速响应,因为在内存中的数据读/写比数据库读/写磁盘的速度快几十到上百倍

1.2.Redis特点

Redis:Remote Dictionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的,遵守BSD协议,是一 个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的 NoSQL数据库之一,也被人们称为数据结构服务器。

Redis与其他key - value缓存产品有以下三个特点: 1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 2. Redis不仅仅支持简单的key - value类型的数据,同时还提供list、set、zset、hash等数据结构的存储。 3. Redis支持数据的备份,即master - slave模式的数据备份。

1.3.为什么要用Redis

高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在 缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相 当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可! 高并发: 直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存 中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

1.4.Redis与memcached的区别

Redis数据库

2.Redis安装

2.1.yum安装

yum install epel-release --下载fedora的epel仓库 yum install redis -- 安装redis数据库

2.2.源码安装

首先需要安装tcl8.5版本以上,以解决 make test报错问题

TCL8.6安装

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz

tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/

cd /usr/local/tcl8.6.1/unix/

./configure

make

make install 

安装完成后,再安装redis 

安装源码编译支持库:yum install gcc gcc-c++
下载包:wget https://download.redis.io/releases/redis-6.2.3.tar.gz
解压包:tar xzf redis-6.2.3.tar.gz
进入redis目录:cd redis-6.2.3
编译安装:make
编译测试:make test
编译安装历史清除:make distclean

 3.Redis启动和停止

3.1.Redis的启动和关闭

不指定配置文件启动

src/redis-server

会产生启动警告:

Redis数据库 解决办法如下:

echo 1024 > /proc/sys/net/core/somaxconn

在/etc/sysctl.conf 下添加如下内容:

net.ipv4.ip_forward = 1
vm.overcommit_memory=1

指定配置文件启动

src/redis-server redis.conf

        前端启动后,终端页面会进入redis控制台,无法进行其他操作,可以在redis.conf文件中修改为后台启动。

将文件中的daemonize no 修改为yes即可

daemonize yes

前台启动的关闭操作 

强制关闭:Ctrl+c

                   kill -9 进程

正常关闭:src/redis-cli shutdown

•强制关闭只需在Redis控制台直接执行即可(redis可能会丢失部分数据)。

•正常关闭需要另开一个终端窗口才可执行(redis不会丢失数据,推荐使用)。

一旦前端启动的关闭命令执行,则redis控制台关闭,redis服务也会停掉。

3.2.redis基础知识

1、单进程:单进程模型来处理客户端的请求。对读写等事件的相应。是通过epoll函数的包装来做到的。Redis的 实际处理速度完全依靠主进程的执行效率。Epoll是linux内核为处理大批量文件描述符而作了改进的epoll,是 linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的下 同CPU利用率。

2、默认16个库,类似数组下标从零开始,初始默认使用零号库。

3、select 命令切换数据库。

4、dbsize 查看当前数据库keys的数量

5、flushdb 清空当前数据库

6、flushall 清空全部数据库内容

7、redis索引都是从0开始的

4.Redis主从复制

4.1.主从复制架构准备

IP地址 环境
192.168.75.142 MySQL
192.168.75.144 Web服务器
192.168.75.145 redis

关闭防火墙:

systemctl stop firewalld

systemctl disable firewalld

sed -i ‘s/enforcing/disabled/’/etc/selinux/config

setenforce 0

同步时间:

yum -y install ntp ntpdate

ntpdate cn.pool.ntp.org

hwclock --systohc

4.2.web服务器准备

1.PHP安装

yum install php php-fpm php-cli php-common php-gd php-mbstring php-mysql php-pdo php-devel phpxmlrpc php-xml php-bcmath php-dba php-enchant 

2.安装php的redis扩展

wget http://pecl.php.net/get/redis-2.2.7.tgz

tar -zxvf redis-2.2.7.tgz

cd redis-2.2.7/

phpize

./configure

make && make install

编译完成后,可以看到安装目录下的文件

Redis数据库

 在文件/etc/php.ini 末尾添加内容

Redis数据库

重启Web服务器的httpd服务

systemctl restart httpd 

 在httpd发布目录下编辑php页面

Redis数据库

查看phpinfo是否显示成功:

Redis数据库 

 安装redis

wget -c -t 0 http://download.redis.io/releases/redis-2.8.19.tar.gz

tar xvf redis-2.8.19.tar.gz

#安装很简单、直接make就可以了

cd redis-2.8.19

make

 安装完毕后,如下图所示:

Redis数据库

 修改文件 redis.conf 中的daemonize no 改为yes。让redis变为后台启动。

启动redis(redis服务器)

src/redis-server redis.conf

编写php测试代码(web服务器)

 vim redis.php

<?php
$redis=new Redis();
$redis->connect('192.168.75.143',6379) or die ("could net connect redis server");
//此处修改自己的redis服务器地址,确保已经启动
# $query = "select * from test limit 9";
$query = "select * from dog1";
for ($key = 0; $key < 10; $key++)
{
if (!$redis->get($key))
{
$connect = mysql_connect('192.168.75.142','redis','Nebula@123');
mysql_select_db(mytest);

mysql_query("SET CHARACTER SET UTF8");
mysql_query("SET CHARACTER_SET_RESULTS=UTF8");
mysql_query("SET NAMES ‘GBK'");
mysql_query("SET NAMES ‘UTF8′");

$result = mysql_query($query);
$arr = [];
while ($row = mysql_fetch_assoc($result))
{
$redis->setex($row['id'],1,$row['name']);
$arr[] = $row;
}
$myserver = 'mysql';
$data = $arr;
break;}
else
{
$myserver = "redis";
$data[$key] = $redis->get($key);
}
}
echo $myserver;
echo "<br>";
for ($key = 0; $key < 10; $key++)
{
echo "number is <b><font color=#FF0000>$key</font></b>";
echo "<br>";
if ($myserver == "mysql") {
$arr2 = array_map('end',$data);
echo "name is <b><font color=#FF0000>$arr2[$key]</font></b>";
echo "<br>";
}
else{
echo "name is <b><font color=#FF0000>$data[$key]</font></b>";
echo "<br>";
}
}

第一次测验,redis中没有对应的keys:

Redis数据库

当再次访问时,redis中已经存在数据 

Redis数据库