Redis 持久化策略
1. RDB(默认的持久化策略)
每隔一定时间后把内存中数据持久化到 dump.rdb 文件中
缺点:1.数据过于集中
2. 可能导致最后的数据没有持久化到 dump.rdb 中
解决办法:使用命令:SAVE 或BGSAVE 手动持久化
2.AOF
监听 Redis 的日志文件,监听如果发现执行了修改,删除, 新增命令立即根据这条命令把数据持久化
缺点: 效率降低
Redis常用命令
Redis 数据类型
String
Hash
List
Set
SortedSet 有序集合
Redis几个概念
Redis 默认有 16384 solts(槽),每个槽可以存储多个 hash 值。
Jedis
Jedis 是 Redis 客户端工具 jar
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
使用非集群版示例代码
public class Demo {
@Test
public void text1(){//测单机
Jedis jedis = new Jedis("192.168.124.130",6379);
//新增、修改
// String result = jedis.set("address","dachun");
//查询
// String result1 = jedis.get("address");
// System.out.println(result1);
//删除
// Long index = jedis.del("address");
}
}
伪集群测试代码
@Test
public void text2(){//测集群
Set<HostAndPort> set = new HashSet<HostAndPort>();
set.add(new HostAndPort("192.168.124.130",7001));
set.add(new HostAndPort("192.168.124.130",7002));
set.add(new HostAndPort("192.168.124.130",7003));
set.add(new HostAndPort("192.168.124.130",7004));
set.add(new HostAndPort("192.168.124.130",7005));
set.add(new HostAndPort("192.168.124.130",7006));
JedisCluster cluster = new JedisCluster(set);
String result = cluster.get("a");
System.out.println(result);
}
}
配置jedis连接池(applicationContext-jedis.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 配置jedis连接池 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- jedisCluster -->
<bean id="jedisClients" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.124.130"/>
<constructor-arg name="port" value="7001"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.124.130"/>
<constructor-arg name="port" value="7002"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.124.130"/>
<constructor-arg name="port" value="7003"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.124.130"/>
<constructor-arg name="port" value="7004"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.124.130"/>
<constructor-arg name="port" value="7005"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.124.130"/>
<constructor-arg name="port" value="7006"/>
</bean>
</set>
</constructor-arg>
</bean>
</beans>
单机版安装步骤
-
yum install -y gcc-c++
由于是 c 语言编写,所以需要安装支持组件
-
把压缩包上传到 linux 服务器上 (示例位置: /usr/local/tmp/ 下 )
-
cd /usr/local/tmp
tar zxvf redis-3.0.6.tar.gz
3.1 进入到/usr/local/tmp 下 运行解压命令
- make
4.1 进入到解压后的目录编译
- make install PREFIX=/usr/local/redis
5.1 安装,设置安装路径为/usr/local/redis 下
5.2 进入到 src 下安装
- ./redis-server
6.1 前端启动,安装后不能进行其他操作
6.2 Ctrl+c 退出
6.3 命令要在 bin 目录下执行
打开守护进程:
- cp /usr/local/tmp/redis-3.0.0/redis.conf /usr/local/redis/bin
7.1 把解压目录下配置文件拷贝到安装目录的 bin 下
- vi redis.conf
8.1 修改 bin 下 redis.conf
8.2 把 daemonize 由 no 修改成 yes,守护进程启动
- ps aux|grep redis
9.1 查看 redis 启动情况
- ./redis-server redis.conf
10.1 启动 redis 服务
- ./redis-cli shutdown
11.1 如果希望关闭,运行上面命令,不关闭不运行即可
- ./redis-cli
12.1 进入到自带客户端工具,测试 redis 是否可用
12.2 set name "smallchun" 添加一个 string ,key 为 name,value 为 smallming
12.4 get name 取出 name 中内容
Redis集群
集群的概念:
-
集群的概念:
多个业务单元协同工作组成的整体称为集群
每个业务单元都是相同的
-
当集群中业务单元中超过或等于 1/2 个 down 掉时整个集群不可用
建议使用奇数个,整体 down 机率小
-
一主一备模式
给每个业务单元创建一个备份业务单元
原来的业务单元(master)后产生的叫做(slave)
-
集群和伪集群
集群: 每个业务单元都安装到单独的服务器上
伪集群: 所有业务单元都安装到同一个服务器上,通过端口区分不同的业务单元
Redis集群步骤
-
yum install ruby -y
后面需要用到 ruby 脚本
-
yum install rubygems -y
安装 ruby 包管理器
-
gem install redis-3.0.0.gem(ruby脚本用来操作Redis的压缩包)
脚本需要 ruby 其他包,所以安装这个 redis.gem
-
mkdir reids-cluster
4.1 在/usr/local 中新建 redis-cluster 文件夹
-
cp -r bin ../redis-cluster/redis01
5.1 把之前安装好的 redis/bin 复制到 redis-cluster 中并起名为 redis01
-
rm -rf dump.rdb
6.1 删除掉 redis01 中 dump.rdb 数据库文件
-
vi redis.conf
7.1 修改 redis01 中端口号为 7001, 找到 port 后面修改为 7001
7.2 去掉 cluster-enabled(集群生效) yes 前面的注释
7.3 如果之前设置过密码,注释掉密码,如果没有设置过过略 7.3 这步骤
-
cp -r redis01 redis02
cp -r redis01 redis03
cp -r redis01 redis04
cp -r redis01 redis05
cp -r redis01 redis06
8.1 把 redis01 文件夹在复制 5 份,分别起名为 redis02,redis03,redis04,redis05,redis06
-
vi redis02/redis.conf
9.1 此命令需要在 redis-cluster 下执行
9.2 把 其 他 5 个 文 件 夹 中 redis.conf 中 port 修 改 成 不 同 的 值 , 分 别 为7002,7003,7004,7005,7006
-
cp *.rb /usr/local/redis-cluster/
10.1 去 redis 解压目录中 src 下执行此命令
10.2 把 redis-trib.rb 复制到 reids-cluster 中
-
vi startall.sh
11.1 创建一个批量启动文件
11.2 把下面内容粘贴到文件中
cd redis01 ./redis-server redis.conf cd .. cd redis02 ./redis-server redis.conf cd .. cd redis03 ./redis-server redis.conf cd .. cd redis04 ./redis-server redis.conf cd .. cd redis05 ./redis-server redis.conf cd .. cd redis06 ./redis-server redis.conf cd ..
-
chmod a+x startup.sh
12.1给脚本文件设置可执行权限
-
./startall.sh
13.1 执行脚本,启动所有 redis 服务
-
ps aux|grep redis
14.1 查看所有服务是否启动成功
-
./redis-trib.rb create --replicas 1 192.168.124.130:7001 192.168.124.130:7002 192.168.124.130:7003 192.168.124.130:7004 192.168.124.130:7005 192.168.124.130:7006
15.1 创建集群
15.2 在执行时按照提示输入yes
-
./redis01/redis-cli -h 192.168.124.130 -p 7001 -c
16.1 进入任意节点测试
-
redis01/redis-cli -p 7001 shutdown
17.1 关闭其中一个 redis
-
vi shutdown.sh
18.1 在 redis-cluster 中创建文件,并添加下面内容
./redis01/redis-cli -p 7001 shutdown ./redis02/redis-cli -p 7002 shutdown ./redis03/redis-cli -p 7003 shutdown ./redis04/redis-cli -p 7004 shutdown ./redis05/redis-cli -p 7005 shutdown ./redis06/redis-cli -p 7006 shutdow