Redis
     分类:数据库     有: 0 条评论

Redis

     分类:数据库     有: 0 条评论

简介

告诉你Redis是一个牛逼货:https://www.jianshu.com/p/01b37cdb3f33


安装

Centos 源码编译安装

要有基本编译环境。

yum install -y tcl gcc
# 测试报I/O error reading reply下载新版tcl编译http://core.tcl.tk/tcl/download
# cd tcl/unix/
# ./configure && make && make install

wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar xzf redis-4.0.1.tar.gz
cd redis-4.0.1
make
make test
make install
cp redis.conf /etc/redis.conf
cd ..
rm-rf redis-4.0.1

测试通过后安装,安装后会自动把/usr/local/redis/bin目录下的redis-server,redis-cli,redis-benchmark,redis-check-aof,redis-check-dump软链接到/usr/local/bin目录下。

编辑redis.conf文件,vim redis.conf修改daemonize no改成yes。

复制redis.conf到/etc目录下cp redis.conf /etc

Centos 6 自启动

编辑服务管理文件(包含chkconfig自启动)vim /etc/init.d/redis

###########################
#chkconfig: 2345 10 90
#description: Start and Stop redis
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
   
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
   
PIDFILE=/var/run/redis.pid
CONF="/etc/redis.conf"
   
case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        if [ "$?"="0" ] 
        then
              echo "Redis is running..."
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $REDIS_CLI -p $REDISPORT SHUTDOWN
                while [ -x ${PIDFILE} ]
               do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
   restart|force-reload)
        ${0} stop
        ${0} start
        ;;
  *)
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
        exit 1
esac
##############################
#修改权限
chmod +x /etc/init.d/redis

#设置开机自动启动服务
chkconfig redis on
 
#启动服务:
service redis start

#停止服务:
service redis stop

#检查Redis是否正在工作
redis-cli

Centos 7 自启动

在Centos 7中自启动改用systemctl管理

vim /etc/systemd/system/redis-server.service
# 写入以下代码,版本一比较通用,版本2在某些版本的redis上会失效。
# 版本1(记得注释掉配置文件中的bind和设置protected-mode为no)
[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecReload=/bin/kill -USR2
ExecStop=/bin/kill -SIGINT

[Install]
WantedBy=multi-user.target

######################################################
# 版本2(记得注释掉配置文件中的bind)
[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target

[Service]
Type=simple
CONF=/etc/redis.conf
PIDFile=/var/run/redis_6379.pid         #一般是这个路径,改成自己的路径
ExecStart=/usr/local/bin/redis-server   #改成自己的路径(可以带参数关闭保护模式--protected-mode no)
ExecReload=/bin/kill -USR2 $PIDFile
ExecStop=/bin/kill -SIGINT $PIDFile

[Install]
WantedBy=multi-user.target

然后ps aux|grep redis查看pid号(如果没有启动redis就随便指定一个pid号4-5位数)vim /var/run/redis_6379.pid第一行写入pid号,保存退出。

systemctl daemon-reload 
systemctl start redis-server.service 
systemctl enable redis-server.service
#检查Redis是否正在工作
netstat -lntp
redis-cli

配置防火墙打开对应的端口:vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT

重启防火墙service iptables restart


Ubuntu

apt-get update 
apt-get install redis-server

#检查Redis是否正在工作
redis-cli

外网访问

编辑配置文件,搜索:bind
在原有的127.0.0.1(redis默认只能本地访问) IP前加上本机的局域网IP,多IP以空格隔开.
保存重启redis服务即生效.
protected-mode yes 保护模式请开启

如果设置为0.0.0.0,可以同时配置密码,并把保护模式关闭;开启保护模式容易导致客户端无法连接。

如果是多个IP,且是不同网段,bind绑定也依然无法访问的,直接注释掉所有的bind,并把protected-mode设置为no;这样就允许任何主机访问了。


单机多实例、主从配置

http://www.cnblogs.com/super-d2/p/3855229.html
多机主从注意防火墙放行端口


Redis常用命令

参考:
http://www.centoscn.com/image-text/config/2015/0728/5928.html
http://doc.redisfans.com/


Redis快速入门

http://www.yiibai.com/redis/redis_quick_guide.html


一些杂项,只是怕自己会忘记,请忽略

关于Redis异常down掉后,不会自动重启(当然是因为还没有设置啦,不过一般不会死,也就没去理它)
出现问题后,首先检查是不是down掉了,真的down掉了再运行nohup redis-server &启动服务就好了。

关于Redis的启动:http://www.tuicool.com/articles/aQbQ3u


一些常用配置、优化

redis-cli连接之后输入info可以看到目前的配置信息。
修改了配置文件,重启redis生效。

优化原则:

1:key的名称尽量使用简单明了的关键字,比如stu代表学生不要太长。
2:如果只是使用redis充当缓存就请关闭持久化功能。
3:redis为每种数据类型都提供了两种内部编码方式,生成时redis自己会自动根据数据类型调整使用那种编码方式。
4:slowlog慢日志查询

发现redis命令执行慢时可以通过slowlog来找出这些命令。在redis.conf中有两个参数slowlog-log-slower-than10000和slowlog-max-len 128。


设置密码

requirepass 123456

持久化

持久化工作原理参考:
Redis过期键的删除策略:https://www.cnblogs.com/lukexwang/p/4694094.html
RDB、AOF和复制时对过期键的处理:https://www.cnblogs.com/lukexwang/p/4710333.html
RDB和AOF持久化一:https://www.cnblogs.com/lukexwang/p/4699354.html
RDB和AOF持久化二:https://www.cnblogs.com/lukexwang/p/4705393.html


RDB快照

在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。
可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。也可以通过调用 SAVE 或者 BGSAVE , 手动让 Redis 进行数据集保存操作。这种持久化方式被称为快照(snapshot)。就是我们常说的备份,数据不是最新的,只是备份那一刻的数据。

save 900 1        #900秒内如果超过1个key被修改,则发起快照保存
save 300 10       #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000     #60秒内容如超过10000个key被修改,则发起快照保存

AOF持久化

使用 AOF 持久化会让 Redis 变得非常耐久(much more durable):你可以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)。AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进行 seek , 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题。

# 修改配置文件
appendonly yes
# 临时开启(重启后失效),登录redis,CONFIG SET appendonly yes

# 同步方式有3种
appendfsync no         #不主动同步,依赖系统同步,性能最好,持久化没保证
appendfsync everysec   #每秒写入一次(推荐)
appednfsync always     #每执行一条命令就写入,数据很安全,但是速度慢一点

# 其他一些配置默认是已经开启了,或者使用默认值就行了。

参考:
http://doc.redisfans.com/topic/persistence.html
http://oldblog.antirez.com/post/redis-persistence-demystified.html
http://blog.csdn.net/freebird_lb/article/category/1087302
http://blog.csdn.net/jackpk/article/details/30073097
https://www.jianshu.com/p/8aa619933ebb


日志级别

loglevel项,设置为:notice (默认也就是此)
共有4种级别:

timeout

客户端空闲N秒后关闭连接(0禁用)
默认是禁用的,根据自己的需要设置。

守护进程

更改redis的启动方式为后台守护进程启动
daemonize 项设置为yes

日志文件位置

默认是空,
logfile "/home/redis_logs/redis.log"

持久化文件

默认是当前目录下
dir /home/redis_data/redisData

最大占用内存、内存置换策略

最大内存一般是最大物理内存的45%(开启持久化,子进程在复制所有数据时内存使用量会增加一倍,所以不建议超过45%),不要超过75%(没有开启持久化),其他程序占用大量内存,再适量减少,预留一部分做其他程序的缓冲。

找到maxmemory <bytes>这一行注释,在下一行增加一行

# 45G*1024*1024*1024转换为bytes;也可以直接用46080mb 的方式书写。
# 在线字节转换:https://calc.itzmx.com

maxmemory 48318382080

设置了最大内存一定要设置 最大内存置换策略
当redis使用的内存超过设置的最大值时的处理方式
LRU算法:(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

volatile-lru : 根据LRU算法生成的过期时间来删除。
volatile-random : 对具有生存周期的key进行随机置换。
volatile-ttl : 对具有生存周期的key随机进行抽样, 置换出抽样中生存周期最短的(辅以TTL)。
allkeys-lru : 对整个db进行LRU算法置换(根据LRU算法删除任何key)。
allkeys-random : 对整个db进行随机置换,无差别随机删。
noeviction : 不进行置换,只是在写操作时返回错误。

maxmemory-policy volatile-ttl

设置密码

打开redis.conf配置文件,找到requirepass,然后修改(重启才能生效):

requirepass yourpassword
# yourpassword就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了,不支持特殊字符,比如@#!之类的。


redis-cli -h IP -p yourPort
keys *                            #输出服务器中的所有key
报错如下:
(error) ERR operation not permitted

# 这时候你可以用授权命令进行授权,就不报错了
auth youpassword

# 另外,在连接服务器的时候就可以指定登录密码,避免单独输入上面授权命令
redis-cli -h IP -p yourPort -a youPassword

已经启动的redis服务器通过命令行设置密码,但这种方式是临时的,当服务器重启了密码必须重设。命令行设置密码方式如下:

config set requirepass yourPassword

有时候我们不知道当前redis服务器是否有设置验证密码,或者忘记了密码是什么,我们可以通过命令行输入命令查看密码,命令如下:

config get requirepass

如果redis服务端没有配置密码,会得到nil,而如果配置了密码,但是redis客户端连接redis服务端时,没有用密码登录验证,会提示:operation not permitted,这时候可以用命令:auth yourpassword 进行验证密码,再执行 config set requirepass,就会显示yourpassword

由于redis并发能力极强,仅仅搞密码,攻击者可能在短期内发送大量猜密码的请求,很容易暴力破解,所以建议密码越长越好,比如20位。(密码在 conf文件里是明文,所以不用担心自己会忘记)


参考:Redis配置文件详解
reids配置参数详解


Redis+MySQL冷热数据交换

https://blog.csdn.net/baochao95/article/details/60761397


界面管理

可以用Redis Live(类似phpmyadmin的系统)
参考:https://www.cnblogs.com/Leo_wl/p/5870006.html


调试

也适合Codis集群

清除所有数据

redis-cli -p 19000   #连接主就行了,从会自动同步过去
auth 123456
flushall

把文本数据写入redis(大量数据)

cat /root/123.log | redis-cli -p 19000 -x set leokey
get leokey

Redis性能问题排查

参考:https://www.cnblogs.com/mushroom/p/4738170.html


报错

(error) OOM command not allowed when used memory > 'maxmemory'.

这是Codis内存不够了,

注意,此函数是在执行特定命令之前进行调用的,并且在当前占用内存低于限制后即返回OK。因此可能在后续执行命令后,redis占用的内存就超过了maxmemory的限制。因此,maxmemory是redis执行命令所需保证的最大内存占用,而非redis实际的最大内存占用。(在不考虑slave buffer和aof buffer的前提下)

参考:https://zhidao.baidu.com/question/1885669884720283268.html



进阶应用

Redis 命令参考:http://doc.redisfans.com/
Redis快速入门:https://www.yiibai.com/redis/redis_quick_guide.html
Redis-Cluster、Redis坑:http://carlosfu.iteye.com/blog/2240426


参考:

Redis的应用场景:https://mp.weixin.qq.com/s/nc3u82zQ2jOO7R52w8UPNw
Redis 设计与实现:http://redisbook.com/
使用redis遇到过的坑:http://www.lmyw.net.cn/?p=278
深入了解Redis:https://mp.weixin.qq.com/s/xB5K0ScxAWIk5Bo5vtUujw

(●゚ω゚●)