目录
五、测试安装
我们常用Redis干什么?
在公司中经常用redis来做数据库的缓存,用来缓存一些经常被客户端访问到的数据,从而减轻后端数据库的压力。
常见的缓存数据库有哪些?他们的相同点与不同点是什么?
常见的缓存数据库包括 Redis、Memcached、Ehcache、Couchbase、Hazelcast 等。
它们的相同点是,都是为了提高系统性能而被使用的缓存数据库;都可以存储和操作数据,支持键值对存储方式,提供高效的读写能力,同时都支持多语言的 API 接口调用。
它们的不同点在于,存储方式、数据处理和功能特性等方面略有不同。例如,Redis 支持多种数据类型,具有较好的扩展性和高可用性;Memcached 相对于 Redis 功能较为简单,但是性能更好,适用于对读写速度有极高要求的场景;Ehcache 支持分布式缓存、本地缓存和持久化缓存等多种方式,同时支持缓存数据的自动过期和自动更新;Couchbase 支持面向文档的数据存储方式,具有类 SQL 的查询能力和数据同步功能;Hazelcast 则支持分布式缓存和数据分区,具有高扩展性和高并发性。
此外,这些缓存数据库在集群和高可用性方面的实现也不同,需要根据具体需求进行选择。
一、Redis数据库概述
redis是一个可持久化的单进程单线程key-value类型高速内存缓存系统,和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(列表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。
与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB,并且在此基础上实现了master-slave(主从)同步,当前 Redis的应用已经非常广泛,国内像新浪、淘宝,国外像 Flickr、Github等均在使用Redis的缓存服务。Redis官网地址:https://redis.io/ ,目前由redis项目的开发和维护由vmware厂商负责提供支持。
Redis 是一种性能快、功能丰富的内存缓存数据库,其优缺点如下:
优点:
-
高性能:Redis 存储在内存中,读写速度非常快,可以高效地处理大规模数据。
-
支持多种数据结构:Redis 不仅支持键值对存储方式,还支持多种数据结构,如字符串、哈希表、列表、集合等,便于存储和处理不同类型的数据。
-
支持事务:Redis 支持事务,可以保证某一连续的操作过程是一个原子性操作。
-
支持持久化:Redis 支持数据持久化到磁盘上,避免了进程异常退出或机器宕机导致数据丢失的问题。
-
支持集群:Redis 支持搭建分布式集群,提高系统的性能和可靠性。
-
丰富的功能:Redis 还支持发布/订阅、Lua 脚本、过期时间设置、自动过期等丰富的功能,便于处理各种复杂的任务。
缺点:
-
内存消耗:Redis 数据全部存储在内存中,如果数据量过大,会占用大量的内存资源,需要注意内存消耗问题。
-
持久化性能:Redis 的持久化性能相对较差,可能会影响 Redis 的性能表现。
-
对 CPU 的消耗:Redis 在高并发的情况下,会对 CPU 的消耗较大。
-
功能局限性:虽然 Redis 支持多种数据结构和功能,但对于复杂数据操作和分析能力较弱,不适合作为大数据分析的存储介质。
二、Redis应用场景概述
Redis是一种快速、内存型的键值数据库,被广泛应用于多种场景。以下是Redis常见的应用场景概述:
-
缓存系统:Redis最常见的应用场景是作为缓存系统。由于Redis是内存数据库,相较于磁盘数据库,它的读写速度更快。Redis能够快速响应读请求,减小数据库负载,提高性能。
-
队列系统:Redis可以实现快速的消息队列,它支持多种数据类型,如list、set、sorted set,能够从不同的维度对队列进行优化。同时Redis的一些特性,如发布-订阅模式、事务支持,使得它可以为队列系统提供更多灵活的应用场景。
-
分布式锁:Redis的SETNX命令是实现分布式锁的常用手段之一。通过Redis实现分布式锁,可以避免多个客户端同时修改同一资源造成的冲突。
-
计数器系统:Redis的INCR和INCRBY命令可以快速实现计数器功能,适用于多种应用场景,如网站PV/UV统计、秒杀系统的库存控制等。
-
地理位置应用:Redis的地理位置功能可以在某些场景中发挥作用,如附近的人、实时交通状况等。
-
数据库应用:Redis可以担任一些存储小数据的应用场景,如缓存新闻URL,只存储URL的Hash值,能够满足快速查找的需求。
总的来说,Redis的应用非常广泛,其出色的性能、丰富的数据类型和多样化的功能特性使得它成为了分布式系统和高并发系统中的重要组成部分。
三、Reids的回收策略有哪些?
Redis的内存是有限的,当内存不足时,需要一些机制来回收内存。Redis的回收策略;使用的算法是LRU算法,Redis有以下几种回收策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰;
Set name dgf 10;
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高性能数据库。
系统 | 主机名 | IP地址 | 软件 |
centos7 | Redis | 192.168.58.128 | redis-7.0.8.tar.gz phpredis-4.0.2.tar.gz |
1、安装并配置Redis服务
1.1 挂载镜像
[root@redis ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
1.2 配置网络yum源(wget显示没有,使用yum下载一个)
[root@redis ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
--2023-09-22 10:39:12-- https://mirrors.aliyun.com/repo/Centos-7.repo
正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)... 103.151.149.12, 103.151.149.6, 103.151.149.8, ...
正在连接 mirrors.aliyun.com (mirrors.aliyun.com)|103.151.149.12|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2523 (2.5K) [application/octet-stream]
正在保存至: “/etc/yum.repos.d/CentOS-Base.repo”
100%[==================================================================================================>] 2,523 --.-K/s 用时 0s
2023-09-22 10:39:12 (758 MB/s) - 已保存 “/etc/yum.repos.d/CentOS-Base.repo” [2523/2523])
1.3 下载Redis
[root@redis ~]# wget http://download.redis.io/releases/redis-7.0.8.tar.gz
--2023-09-22 10:42:16-- http://download.redis.io/releases/redis-7.0.8.tar.gz
正在解析主机 download.redis.io (download.redis.io)... 45.60.125.1
正在连接 download.redis.io (download.redis.io)|45.60.125.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2981212 (2.8M) [application/octet-stream]
正在保存至: “redis-7.0.8.tar.gz”
100%[==================================================================================================>] 2,981,212 1.13MB/s 用时 2.5s
2023-09-22 10:42:19 (1.13 MB/s) - 已保存 “redis-7.0.8.tar.gz” [2981212/2981212])
1.4 预编译与编译后做相关操作
[root@redis ~]# tar -zxvf redis-7.0.8.tar.gz
[root@redis ~]# cd redis-7.0.8.tar.gz
[root@redis redis-7.0.8]# make && make install
[root@redis redis-7.0.8]# echo $?
0
[root@redis redis-7.0.8]# sed -i '/^bind 127.0.0.1$/s/127.0.0.1/192.168.58.128/g' /root/redis-7.0.8/redis.conf
[root@redis redis-7.0.8]# sed -i '/protected-mode/s/yes/no/g' /root/redis-7.0.8/redis.conf
[root@redis redis-7.0.8]# sed -i '/requirepass/s/foobared/123123/g' /root/redis-7.0.8/redis.conf
[root@redis redis-7.0.8]# sed -i '/requirepass 123123/s/^#//g' /root/redis-7.0.8/redis.conf
Redis.conf主配置文件详细解释
附:redis.conf主配置文件详解
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
1.5 启动Redis,并查看端口
[root@redis ~]# mv redis-7.0.8 /usr/local/redis/
[root@redis ~]# redis-server /usr/local/redis/redis.conf
这条命令是把Redis放前台运行
查看端口
[root@redis ~]# netstat -utpln |grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6356/redis-server 1
tcp6 0 0 ::1:6379 :::* LISTEN 6356/redis-server 1
1.6 登陆Redis
[root@redis redis]# redis-cli -h 127.0.0.1 -p 6379 -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379>
五、测试安装
1. 安装httpd、php、php-devel
[root@redis ~]# yum -y install httpd php php-devel
已加载插件:fastestmirror
2.查看php的版本
[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
3. 使用wget下载phpReids
[root@redis ~]# wget https://codeload.github.com/phpredis/phpredis/tar.gz/4.0.2
--2023-09-22 14:50:34-- https://codeload.github.com/phpredis/phpredis/tar.gz/4.0.2
正在解析主机 codeload.github.com (codeload.github.com)... 20.205.243.165
正在连接 codeload.github.com (codeload.github.com)|20.205.243.165|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:未指定 [application/x-gzip]
正在保存至: “4.0.2”
[root@redis ~]# ls
4.0.2 anaconda-ks.cfg redis-7.0.8.tar.gz
[root@redis ~]# tar -zxvf 4.0.2
[root@redis ~]# ls
4.0.2 anaconda-ks.cfg phpredis-4.0.2 redis-7.0.8.tar.gz
[root@redis ~]#
4. 编译解压
[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 && make && make install
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
5. 编译并启动httpd
[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 26763/httpd
udp 0 0 127.0.0.1:323 0.0.0.0:* 680/chronyd
udp6 0 0 ::1:323 :::* 680/chronyd
6. 写入两个测试文件,到时访问看能否显示
[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.58.128',6379);
> \$redis->auth('123123');
> \$keys = \$redis->keys("*");
> var_dump(\$keys);
> ?>
> END
显示 index.php. http://192.168.58.128
查看test.php。 http://192.168.58.128/test.php