文章目录
Redis高缓存数据库
1.Redis介绍
Redis是一个开源,使用c语言编写的,支持网络交互,采用BSD协议,可基于内存也可持久化的Key-Value数据库
value支持类型有string(字符串),list(列表),set(集合)hash(哈希)
为了保证效率,数据都是缓存在内存中(memcached),redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件中,并且此基础上实现了master-slave(主从同步)
BSD协议:开源协议,自由使用,修改源代码,可以将修改后的开源码再发布
但是必须满足3个要求:
1.发布的产品必须包含之前的源代码
2.如果发布是二进制类库,需要在类库/软件声明原来代码的BSD协议
3.不可以用开源作者机构名字做市场推广
2.Redis单线程+多路IO复用技术
多路复用是一个线程检查多个文件描述符(socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,有一个文件描述符即返回,否则超时。
3.Redis特点
支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用
不仅支持key-value类型,还提供list,set,zset,hash等数据结构的存储
支持数据备份,master-slave模式的数据备份
4.Redis优势
- 性能极高,读的速度达110000次/s,写的速度达81000次/s
- 丰富的数据类型,如srtings(字符串),lists(列表),sets,Ordered Sets 数据类型操作
- 操作都是原子性,要么全部成功执行,要么全部不执行
- 丰富的特性:用于缓存,信息,以key设置过期时间,过后自动删除
5.Redis和memcache存储对比
- 存储方式:Redis部分的数据储存在硬盘上,因为内存不能大于物理硬盘,保证数据的持久性。
memcache会把数据全部存储在内存上,断电会挂掉。
2.数据支持类型:Redis有复杂的数据类型(string,list,set等)
memcache支持的数据类型少
3.使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
6.redis安装
中文下载地址:http://www.redis.cn/download.html
官网:https://redis.io/
1.redis最新包下载
[root@master ]# wget http://download.redis.io/releases/redis-6.0.6.tar.gz
2.解压包
[root@master ]# tar -xf redis-6.0.6.tar.gz
3.安装依赖包 gcc gcc-c++ tcl-devel make
[root@master src]# yum -y isntall gcc gcc-c++ tcl-devel make
4.放置相应位置
[root@master ]# mv redis-6.0.6 /usr/local/redis
5.编译安装redis(安装的路径可以指定)
[root@master ]# cd /usr/local/redis/
[root@master redis]# make && make install PREFIX=/usr/local/redis
6.复制配置文件
[root@master redis]# cp redis.conf bin/conf/
7.创建俩个文件夹,logs存储日志,redisdata存储数据持久化的数据
[root@master bin]# pwd
/usr/local/redis/bin
[root@master bin]# mkdir logs
[root@master bin]# mkdir redisdata
[root@master bin]# ls
conf logs redis-benchmark redis-check-aof redis-check-rdb redis-cli redisdata redis-sentinel redis-server
#redis安装帮助文档:/usr/local/redis/README.md /usr/local/redis/INSTALL
#redis启动文件: /usr/local/redis/bin/redis-server
#redis数据目录·:/usr/local/redis/bin/redisdata
#redis控制端文件:/usr/local/redis/bin/redis-cli
#redis日志目录:/usr/local/redis/bin/logs
#redis主配置文件:/usr/local/redis/bin/conf/redis.conf
7redis主配置文件修改
主配置:/usr/local/redis/bin/conf/redis.conf
#69行主机名访问:
#bind 127.0.0.1
bind 0.0.0.0
#223行守护后台运行:
daemonize yes
#245行redis放后台运行后会产生pid文件(路径):
pidfile /usr/local/redis/bin/logs/redis_6379.pid
#258行日志文件路径
logfile "/usr/local/redis/bin/logs/redis_log"
#363行数据目录路径
dir /usr/local/redis/bin/redisdata/
#786行设置redis密码
requirepass 123456
8.redis启动
第一种默认前台启动的方式
[root@xm bin]# pwd
/usr/local/redis/bin
[root@master bin]# ./redis-server
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.0.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 210213
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
210213:M 29 Jan 2022 09:34:06.983 # Server initialized
210213:M 29 Jan 2022 09:34:06.983 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
#以上信息是俩处出现的问题警告以及解决的方案
TCP积压的值默认为128,应该设置为511
内存设置为0,内存不足的情况下,保存会出错,将vm.overcommit_memory = 1保存在/etc/sysctl.conf内,进行重启
问题解决
echo '511' > /proc/sys/net/core/somaxconn
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
#加载一下
sysctl -p
第二种最常见的方式:指定配置文件启动
[root@xm ~]# /usr/local/redis/bin/redis-server /usr/local/redis/bin/conf/redis.conf
[root@xm ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.1:9000 0.0.0.0:*
LISTEN 0 128 127.0.0.1:6379 0.0.0.0:*
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 32 192.168.122.1:53 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 5 127.0.0.1:631 0.0.0.0:*
LISTEN 0 80 *:3306 *:*
LISTEN 0 128 [::]:111 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 5 [::1]:631 [::]:*
9.redis自启动
在生产环境中推荐使用redis初始化脚本,随着系统的启动而启动,在Redis的utils文件夹中有一个redis_init_script的初始化脚本文件
redis脚本文件路径:/usr/local/redis/utils/redis_init_script
linux系统服务管理启动路径:/etc/init.d/
#复制脚本文件到/etc/init.d下
[root@redis ~]# cp /usr/local/redis/utils/redis_init_script /etc/init.d/redis_6379
#配置redis_6379文件
[root@redis ~]# cat /etc/init.d/redis_6379
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
### BEGIN INIT INFO
# Provides: redis_6379
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Redis data structure server
# Description: Redis data structure server. See https://redis.io
### END INIT INFO
PASSWD=123456 #指定redis密码
REDISPORT=6379 #指定redis端口
EXEC=/usr/local/redis/bin/redis-server #指定redis启动服务
CLIEXEC=/usr/local/redis/bin/redis-cli #指定redis控制端
PIDFILE=/usr/local/redis/bin/logs/redis_6379.pid #指定redis进程文件
CONF="/usr/local/redis/bin/conf/redis.conf" #指定redis配置文件
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "redis 已经开启了"
else
echo "redis 开启成功"
$EXEC $CONF #指定配置文件的启动方式
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "redis 暂停中"
$CLIEXEC -p $REDISPORT -a $PASSWD shutdown #停止redis
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis 暂停成功"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
以上就是一个简单的传参数的一个case循环脚本
重点是$CLIEXEC -p $REDISPORT -a $PASSWD shutdown
一般redis正在将内存的数据同步到硬盘时突然关闭进程可能导致数据丢失,所以我们优先是向redis发送一个shutdown命令,redis收到shutdown命令后,会先断开所有客户端连接,然后根据配置持久化,完成退出。
kill redis_pid进程的效果和shutdown效果一样。