Redis数据存储

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则证实操作成功
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值