目录
1.Redis简介
redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。
2.Redis安装
Window 下安装,下载地址:https://github.com/MSOpenTech/redis/releases 解压即可。
Linux 下安装,下载地址(官网):http://redis.io/download
安装:
$ wget http://download.redis.io/releases/redis-x.x.x.tar.gz
$ tar xzf redis-x.x.x.tar.gz
$ cd redis-x.x.x
$ make MALLOC=libc # (或者直接make,不用./configure,我这里直接用make报错了,所以..)
$ make test
$ make install # (安装到指定目录:make PREFIX=/usr/local/redis install,不指定的话默认安装到/usr/local/bin目录下,也可以执行该步骤,也就是安装)
# 不安装的话命令执行文件路径是:/usr/local/src/redis-5.0.4/src
# 配置文件:/usr/local/src/redis-5.0.4/redis.conf
make完后 redis-x.x.x/src目录下会出现编译后的可执行文件:redis服务程序redis-server,还有用于测试的客户端程序redis-cli,程序位于安装目录 src 目录下:
$ find . -type f -executable
./redis-benchmark # 用于进行redis性能测试的工具
./redis-check-dump # 用于修复出问题的dump.rdb文件
./redis-cli # redis的客户端
./redis-server # redis的服务端
./redis-check-aof # 用于修复出问题的AOF文件
./redis-sentinel # 用于集群管理
==============
扩展:
/usr/local 层级以某种方式复制了根目录,
你可以
在 /usr/local/bin 这里找到可执行程序,
在 /usr/local/lib 中找到库,
在 /usr/local/share 中找到架构无关的文件,
==============
问题1:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
解决方案:
执行命令:make MALLOC=libc
问题2:
You need tcl 8.5 or newer in order to run the Redis test
解决方案:
安装一下tcl:yum install -y tcl
3.Redis启动和停止
(1)默认方式(前端启动)启动redis服务(默认redis服务端口是6379):
$ cd src
$ ./redis-server
(2)指定配置文件启动redis服务(windows下需要指定redis.windows.conf):
$ cd src
$ ./redis-server ../redis.conf
(3)--port 来启动指定端口的redis服务:
redis-server --port 6380 &
redis-server --port 6381 &
redis-server --port 6382 &
(4)后台运行
$ cd redis-5.0.4
$ nohup src/redis-server redis.conf > /home/redis.log 2>&1 &查看运行的redus:ps -ef | grep redis
(5)Redis5 关闭服务
# 1.第一种关闭方式
# 正常关闭,数据保存
redis-cli shutdown # 关闭redis服务,通过客户端进行shutdown
# 如果redis设置了密码,则需要先用客户端登录,然后再进行shutdown
redis-cli -a password
127.0.0.1:6379> shutdown
# 2.第二种关闭方式
# 断电,非正常关闭,容易导致数据丢失
ps -ef | grep redis
kill -9 pid
4.测试_redis客户端的使用
使用测试客户端程序redis-cli和redis服务交互:
本地连接,默认无密码直接连接:# ./src/redis-cli
$ cd src
$ ./redis-cli # 打开终端,有时候会有中文乱码。要在 redis-cli 后面加上 --raw
127.0.0.1:6379> ping # 通过ping测试连接是否存活
PONG # 表示存活
127.0.0.1:6379> set foo bar # 127.0.0.1 是本机 IP ,6379 是 redis 服务端口,s设置一个key-value
OK
redis> get foo
"bar"
127.0.0.1:6379> select index # index 是数据库索引号,用数字值指定,默认为0到15
127.0.0.1:6379> quit # 退出客户端
127.0.0.1:6379> shutdown # 通过客户端关闭redis,注:shutdown有两个可选的修饰符,nosave会阻止数据库执行保存操作,save会强制让数据库执行保存操作。
127.0.0.1:6379>
密码连接,一般用于远程连接:# redis-cli -h host -p port -a password
$ redis-cli -h 192.168.246.154 -p 6379 -a password # 注:-h:指定Redis服务所在主机IP,-p:指定Redis服务端口,-a:指redis服务密码
5.Redis配置
Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。
redis.conf常用配置说明
bind:允许访问该redis的主机
protected-mode:保护模式,默认开启。若设置外部网络连接redis服务,设置方式如下:
1、关闭protected-mode模式,此时外部网络可以直接访问
2、开启protected-mode保护模式,需配置bind ip或者设置访问密码,或者bind ip和密码都设置
requirepass:设置密码
databases:Redis默认有16个数据库,寻址角标从0开始。默认连接db0。客户端使用select命令,切换数据库
port :指定redis的服务端口,默认6379.
daemonize:Redis默认关闭后台进程模式,改成yes,redis服务在后台启动。
loglevel :日志等级
logfile:Redis日志输出目录,默认不输出日志到文件。
dbfilename:指定数据持久化的文件名
dir :指定数据持久化的文件存放目录,也是集群node.con文件存放目录
cluster-enabled:是否启用集群
cluster-config-file:集群文件
修改配置文件方式一:直接修改配置文件。
# 1.复制redis配置文件,将redis目录的redis.conf复制到/etc/redis目录下,以备使用
cp /usr/local/redis-x.x.x/redis.conf /etc/redis/redis.conf
# 2.修改默认端口6379,编辑/etc/redis/redis.conf配置文件,找到port 6379这一行,修改端口为6380或注释掉添加一行port 6380
port 6380
# 3.同时修改pidfile,将其改为pidfile /var/run/redis_6380.pid,修改目的是为了文件名上的端口和实际端口保持一致,方便通过服务方式启动、停止,如后面设置开机启动
pidfile /var/run/redis_6379.pid
# 4.设置redis服务后台运行,编辑/etc/redis/redis.conf配置文件,将daemonize设置为yes
daemonize yes
# 5.设置访问密码,编辑/etc/redis/redis.conf配置文件,去掉requirepass行的注释或添加一行
requirepass 123456
# 6.启动redis并指定配置文件为我们刚才修改的/etc/redis/redis.conf配置文件,服务启动后就不像前面那样输出redis图形信息的内容了。
[root@localhost redis]# redis-server /etc/redis/redis.conf
14737:C 07 Apr 2020 12:32:40.025 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
14737:C 07 Apr 2020 12:32:40.025 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=14737, just started
14737:C 07 Apr 2020 12:32:40.025 # Configuration loaded
注意:由于redis性能非常好,为防止暴力破解,密码需要配置的一大长串足够复杂的字符串,不考虑人是否能记住
# 再次测试
[root@localhost redis]# redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> exit
[root@localhost redis]# redis-cli -p 6380
127.0.0.1:6380>
127.0.0.1:6380> ping
(error) NOAUTH Authentication required.
127.0.0.1:6380> auth 123456
OK
127.0.0.1:6380> ping
PONG
127.0.0.1:6380>
# redis-cli -p 6380 ## -p 指定端口
# auth 123456 ## auth 进行密码验证
修改配置文件方式二:使用Config命令配置:
Get获取配置项命令格式:
127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
实例:
127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
127.0.0.1:6379> CONFIG GET * # 使用 * 号可获取所有配置项
Set编辑配置项命令格式
127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
实例:
127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
=========================================================================
优化配置
# 优化配置,使用root账号操作
# vim /etc/sysctl.conf
vm.overcommit_memory = 1
net.core.somaxconn = 2048
# sysctl -p
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# vim /etc/rc.d/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
# chmod +x /etc/rc.d/rc.local
# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
6.Redis开机启动设置
(1)复制开机启动脚本,在redis目录的utils包下,有一个redis_init_script文件,我们复制到/etc/init.d/目录下,并将文件名改为redis
[root@localhost redis]# cp /usr/local/redis-5.0.5/utils/redis_init_script /etc/init.d/redis
(2) (非必须)修改/etc/redis/redis.conf
文件名为/etc/redis/6379.conf
,此修改非必须,不修改的话可以在步骤3指定配置文件路径,默认端口是6379,如何修改默认端口参考下文
[root@localhost ~]# mv /etc/redis/redis.conf /etc/redis/6379.conf
(3)编辑/etc/init.d/redis启动脚本,脚本说明如下:
#!/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
REDISPORT=6379 #redis的默认端口, 要和下文中的redis.conf中一致
EXEC=/usr/local/bin/redis-server #redis-server路径,redis服务端的命令
CLIEXEC=/usr/local/bin/redis-cli #redis-cli路径,redis客户端的命令
PIDFILE=/var/run/redis_${REDISPORT}.pid #redis的配置文件所在的目录
CONF="/etc/redis/${REDISPORT}.conf" #redis的配置文件所在的目录
# redis配置文件路径,默认/etc/redis/端口号.conf,所以我们步骤2修改了配置文件的名字,不要步骤2可以直接修改这里路径
AUTH="123456" #密码验证,下文添加此-a参数,如果没设置密码,这句没什么用可以不要
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
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
# 因为设置了密码,所以此处增加 -a 密码
$CLIEXEC -p $REDISPORT -a $AUTH shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
修改文件的权限为 可执行的 chmod 775 /etc/init.d/redis
测试一下redis 的启动
/etc/init.d/redis start
打开redis命令:service redis start
关闭redis命令:service redis stop
设为开机启动:chkconfig redis on
设为开机关闭:chkconfig redis offcentos7或RedHat7:
启动服务:systemctl start redis
停止服务:systemctl stop redis设为开机启动:chkconfig --add redis
方法二:(centos7推荐)
1.在系统服务目录里创建redis.service文件
vim /etc/systemd/system/redis.service
写入如下配置,如果是yum安装则自动生成此文件
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
注意:ExecStart配置成自己的路径
配置描述:
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
重载系统服务:systemctl daemon-reload
2. 测试并加入开机自启
先关闭redis-server
systemctl stop redis.service
开启redis-server
systemctl start redis.service #如果服务是开启状态,使用此命令会启动失败。
3. 开启成功,将服务加入开机自启
systemctl enable redis.service #注意后面不能跟空格
4. reboot #重启
5. 查看服务运行状态:systemctl status redis.service
6. 全部命令
systemctl start redis.service #启动redis服务
systemctl enable redis.service #设置开机自启动
systemctl disable redis.service #停止开机自启动
systemctl status redis.service #查看服务当前状态
systemctl restart redis.service #重新启动服务
systemctl list-units --type=service #查看所有已启动的服务
7.测试代码
1.导入jar:jedis-2.7.2.jar
2.代码:
public class JedisTest {
@Test
public void testJedisSingle() {
//创建一个jedis的对象。
Jedis jedis = new Jedis("172.20.10.7", 6379);
//调用jedis对象的方法,方法名称和redis的命令一致。
jedis.set("key1", "jedis test");
String str = jedis.get("key1");
System.out.println(str);
//关闭jedis。
jedis.close();
}
/**
* 使用连接池
*/
@Test
public void testJedisPool() {
//创建jedis连接池
JedisPool pool = new JedisPool("172.20.10.7", 6379);
//从连接池中获得Jedis对象
Jedis jedis = pool.getResource();
String str = jedis.get("key1");
System.out.println(str);
//关闭jedis对象
jedis.close();
pool.close();
}
}