文章目录
1 概述
- 一种内存型的数据库,优点是快,但是需要占用大量内存,常用来做数据库缓存,目的是缓解从库的读压力,
- 数据存储方法为键值型(key-value),key为字符串,value类型支持字符串,列表,哈希等多种类型
- redis是单进程,单线程服务
- 若redis提供缓存服务,可以关闭所有持久化存储,如此一来redis重启后所有数据都会丢失,开启rdb或aof持久化存储,能把redis中的数据持久化到磁盘中,持久化及数据备份,建议在从库上进行
- 安装环境为CentOS 7.5.1804
内核版本:3.10.0-862.e17.x86_64
2 编译安装4.0版本Redis及初始优化
redis下载:https://redis.io/download
2.1 redis源码编译
yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
tar xf redis-4.0.11.tar.gz -C /usr/src/
cd /usr/src/redis-4.0.11/
make
make MALLOC=jemalloc
make PREFIX=/usr/local/redis install
echo $?
cd /usr/local/redis/
mkdir -p /usr/local/redis/conf
cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/
cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/
ln -s /usr/local/redis/bin/* /usr/local/bin/
#服务端,客户端连接命令
redis-server --version
redis-cli --version
2.2 redis服务启动和系统参数调整
2.2.1 简化redis配置文件,并优化一些参数
#创建redis数据目录
mkdir -p /data/redis/
cd /usr/local/redis/conf/
cp redis.conf{,.bak}
egrep -v "^$|^#" redis.conf.bak > redis.conf
#修改以下行的参数
1 bind 0.0.0.0 #修改监听地址
3 port 6379 #端口
4 tcp-backlog 1024 #tcp连接数
7 daemonize yes #以守护进程启动
9 pidfile /data/redis/redis.pid
11 logfile "/data/redis/redis.log"
21 dir /data/redis/
2.2.2 redis启动和关闭(指定配合文件启动,可以多实例)
#开启
redis-ssrver /usr/local/redis/conf/redis.conf
netstat -antup | grep redis
#关闭,括号中不写指定默认端口和本地
redis-cli (-p 6379 -h 127.0.0.1) shutdown
#登录本地redis
redis-cli (-h 127.0.0.1)
2.2.3 参数优化调整
启动redis后,查看系统日志会有几个WARNING提示:
统文件描述符过小,需要调整到10032或之上
#调整系统文件描述符
echo "* - nofile 10240" >> /etc/security/limits.conf
#其中“*”可以指定某个用户,“-”代表适用于软硬操作,
#exit退出再连接bash,可以用ulimit -n查看文件描述符
对redis这样的高负载环境来说,tcp设置128太小
#查看系统tcp连接数设定值net.core.somaxconn
sysctl -a | grep soma
#修改
echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf
sysctl -p
overcommit_memory=0为不允许超额抢占内存,这种情况rdb可能失败,造成数据丢失,改为1,则需要保证内存足够大,避免操作系统崩溃
#查看该参数的值vm.overcommit_memory
sysctl -a | grep commit
#调整系统内存分配策略
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl -p
内核中启用了巨大内存也支持,和redis的延迟内存使用冲突
#关闭系统内核的巨大内存页支持
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
#这个调优没办法永久性调整,所以加入到个人配置脚本
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local
重启redis-server验证上述4项优化是否成功
redis-cli shutdown
> /data/redis/redis.log
redis-server /usr/local/redis/conf/redis.conf
cat /data/redis/redis.log
#没有之前的WARNING提示就是优化成功
3 Redis客户端使用和数据录入
#登录
redis-cli或redis-cli -h localhost -p 6379
#redis共16个表,从0~15,使用select切换
select 0/1/2.../15
3.1 (非)交互式情况下录键值
A. 交互式
#commond 键名 值
set name chen #录入
get name #获取
set name yunjisuan #重复录入为修改
del name #删除,返回1代表删除成功
B. 非交互
只是在登录情况下,在命令行前面加上登录命令
如:redis-cli set name welcome
3.2 列表简单操作
列表是有顺序的,可重复的一些值的组合
A.交互式
#建一个列表,录入,录入规则是从左边推入,会提示
lpush names yun1
lpush names yun
lpush names yun2
lpush names yun
...
#从右边录入使用rpush命令
#查看列表的值
lrange names 0 -1 #查看names从索引0到最后的值
lrange names 0 3 #查看names从索引0到索引3的值
#删除元素
lrem names 1 yun #从左边数删除第一个yun
lrem names 0 yun #从左边数删除所有yun元素
#删除列表最左边的元素
lpop names
#移除最右边的元素
rpop names
#修改左起第一个元素为yun
lset names 0 yun
3.3 集合录入
集合中,元素唯一,不能重复,但是没有固定顺序
A.交互式
#向集合中添加元素,
sadd ages 25
sadd ages 30
...
#查看集合里的元素
smembers ages
#移除集合中的元素25
srem ages 25
#随机移除集合里的一个元素
spop ages
#查找集合里是否有30的元素
sismember ages 30
4 Redis的hash和订阅简单操作
4.1 redis的hash操作
hash就是可以存多个键值对的组合(类似python字典),在交互下,可进行以下操作
#增加一个hash,增加一个键值,key为name value为yunjisaun
hset info name 'yunjisuan'
hset info age 25
#可以同时增加几个键值对
hmset info name 'yunjisuan' age 25
#查看hash所有键值信息
hgetall info
#查看单个键值信息
hget info name
#删除单个或多个键值信息,通过指定key
hdel info name age
#删除hash中所有键值
del info
4.2 redis订阅
#登录状态下开启频道yunjisuan,并订阅
subscribe yunjisuan
#向频道yunjisuan推送信息为“welcome”
publish yunjisuan 'welcome'
#会输出推送信心成功接收的人数
5 使用shell批量添加数据到Redis
非交互式
#写入50个键值,key为name_150,值为value_150
for line in `seq -w 50`;do redis-cli set name_$(line) value_$(line);done
#keys * 查看所有key,不建议使用,大量key会占用过多内存
#随机返回一个key
randomkey
#分页查看key
scan 0
6 Redis服务器info状态信息查看
非交互式输入redis-cli info,交互式输入info可查看
内存信息
\# Memory
used_memory: #由redis分配器分配的内存总量,单位字节
used_memory_human: #可复方石显示redis以分配的内存总量
user_memory_rss: #从操作系统角度,返回redis已分配内存总量
user_memory_rss_human: #已可读方式返回上条信息
...
mem_fragmentation_ratio:
#这条信息是used_memory_rss和user_memory的比值,小于1代表适用swap,redis实际占用内存已经大于系统分配,大于1代表产生碎片,redis进行增加或删除的动作,会一起内存碎片化
...
\# Kyespace
db0:... #最后一条信息,db0的key数量以及带有生存周期的key的个数,平均存货时间
7 Redis的两种持久化储存方式
7.1 RDB存储
snapshot快照技术,redis默认开启,根据默认的save参数,对高并发情况下,save执行频率高
优点:周期时间快,对系统性能影响小;
缺点:无法做到数据完全不丢失,且当触发save时,会阻塞前台用户数据输入
7.2 配置RDB
与RDB相关的几个参数
dir /data/redis/ #rdb存储路径
dbfilename dump.rdb #rdb文件名
save 60 10000
save 300 10
save 900 1 #900s内改变1个key,触发rdb储存
rdbcompression no #rdb压缩,最好关闭,影响CPU
平滑开启关闭rdb
#关闭
redis-cli config set save ""
#开启,参数自定义
redis-cli config set save "180 1 120 10 60 10000"
#配置保存
redis-cli config rewrite
#写入10000个key,观察日志变化
for line in `seq -w 10000`;do redis-cli set key_${line} value_${line};done
cat /data/redis/redis.log
命令触发rdb存储
save会阻塞前段客户数据输入
bgsave后台启动新进程进行rdb存储
7.3 AOF存储
appendonly持久化,默认关闭,开启情况下,会把用户每次操作都记录在文件appendonly.aof
中(可以设置aof的记录方式)
优点:操作实时写入文件,从而实现数据也实时写入磁盘
缺点:实时写入文件,对redis性能影响大,高并发状态下,aof存储文件持续增大,占用过多磁盘
7.4 配置AOF
动态关闭,开启aof
#开启
redis-cli config set appendonly yes
#关闭
redis-cli config set appendonly no
#保存配置
config rewrite
重写aof文件,整理相同的key,写入最后的有效值
aof存储,会将所有操作记录,导致aof文件越来大,使用bgrewriteaof命令,可以执行重写操作,创建一个aof文件的体积优化版本,重写过程失败,也不丢失数据,旧文件在重写过程成功之前,不会被修改
重写操作只会在没有其他持久化工作在后台执行时被触发
从redis2.4开启,当aof文件达到一定大小,redis自行触发重写
配置aof自动rewrite,在配置文件中,有关的两条参数
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
第一个,当aof文件增加一倍后,触发rewrite,第二个,当aof文件达到64mb后,触发rewrite,两个条件同事满足才触发
8 Redis最大内存及删除算法
redis-cli flushall 或者 flushdb,手动清空redis所有数据
8.1 设置key有效期
#查看key有效期,-1为永久有效,-2代表失效,正整数代表剩余有效时间
ttl key
#设定有效时间(例:有效期10s)
expire key 10
8.2 设置最大内存
#查看最大内存,0代表没有限制
config get maxmemory
#设置限制(例:1M)
redis-cli config set maxmemory 1M
#rewrite保存操作
8.3 可选择的删除算法
- volatile-lru
使用lru算法删除键,key需要设置过期时间,当内存到最大值,优先删除有过期时间的key
- volatile-random
随机删除key,key需要设置过期时间 - volatile-ttl
删除ttl最小的键,key需要设置过期时间 - allkeys-lru
使用lru算法删除键,对象是所有key - allkeys-random
随机删除key - noeviction
报错,不执行新的key写入,默认使用此算法 - 设置删除算法为volatile-lru
redis-cli config set mammemory-policy volation-lru
redis-cli rewrite
9 Redis性能及安全优化
9.1 性能优化:
安装时的四项性能优化
9.2 安全优化:
9.3 给redis增加密码
通过redis配置文件增加密码
echo 'requirepass "yunjisuan"' >> /usr/local/redis/conf/redis.conf
#重启redis,再登录,需要验证才能进行操作
redis-cli登录
#通过auth+密码的方式验证
auth yunjisuan
#非交互输入密码登录(命令行使用密码不安全)
redis-cli -a yunjisuan
使用交互式给redis增加密码,无需重启redis
#登录情况下,用config相关命令修改配置
redis-cli
config set requirepass yunjisuan
#一设置就会生效,所以下一步需要验证,不然报错
auth yunjisuan
config get requirepass
#查看是否有密码配置
#交互式,可以进行配置修改,不用重启redis,修改后,可以将新的配置重写到配置文件中
config rewrite
tail -2 /usr/local/redis/conf/redis.conf
9.4 禁用危险命令
将以下内容写入配置文件,禁用三个危险命令
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""
10 Redis主从环境搭建
10.1 部署主从同步
redis从库,环境,优化措施要求和主库一致,可以支持20台左右从库
redis主从同步,只需要修改从库配置,主库不需要修改任何参数
#开启主库,从库关闭的情况下,在slave上进行操作
redis-cli shutdown
echo "SLAVEOF IP PORT" >> /usr/local/redis/conf/redis.conf
redis-server /usr/local/redis/conf/redis.conf
#清空日志,方便分析主从同步记录的日志
> /data/redis/redis.log
这样的主从同步为全同步Full,当从发起连接及同步请求,主库会执行bgsave,将最新数据保存快照,同步至从库
若从库已有部分数据,会根据偏移量,进行部分同步partial,具体操作,可以通过关闭从库,然后在主库写入新数据,再开启从库,查看日志辨认
10.2 停止,恢复,加密主从同步
在从库上执行redis-cli slaveof no one
从而停止主从同步,
在从库上执行redis-cli slaveof IP PORT
重新指向主库,则恢复
若主库设置了密码,需要在从库上提供同步密码验证
redis-cli config set masterauth “yunjiusuan(主库密码)”
redis-cli config rewrite
11 利用Python操作Redis单例
python安装redis拓展
yum -y install epel-release
yum -y install python2-pip
pip install redis
利用python进行redis数据读写
#进入python环境
python
#导入redis支持函数
import redis
#设置redis登录及验证信息
r = redis.Redis(host='127.0.0.1',port=6379,password='yunjisuan',db=0)
#写入键值
r.set('key_test','value_test')
#将值定义给变量
value = r.set('key_test')
#输出为value_test则成功
print (value)
#exit退出python环境,在redis上做验证
redis-cli -a yunjisuan get key_test
#输出value_test则证实操作成功