首页 > 技术文章 > Redis

da-chun 2021-06-08 22:35 原文

Redis 持久化策略

1. RDB(默认的持久化策略)

每隔一定时间后把内存中数据持久化到 dump.rdb 文件中

缺点:1.数据过于集中

​ 2. 可能导致最后的数据没有持久化到 dump.rdb 中

解决办法:使用命令:SAVE 或BGSAVE 手动持久化

2.AOF

监听 Redis 的日志文件,监听如果发现执行了修改,删除, 新增命令立即根据这条命令把数据持久化

缺点: 效率降低

Redis常用命令

http://doc.redisfans.com/

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>

单机版安装步骤

  1. yum install -y gcc-c++

    由于是 c 语言编写,所以需要安装支持组件

  2. 把压缩包上传到 linux 服务器上 (示例位置: /usr/local/tmp/ 下 )

  3. cd /usr/local/tmp

​ tar zxvf redis-3.0.6.tar.gz

​ 3.1 进入到/usr/local/tmp 下 运行解压命令

  1. make

​ 4.1 进入到解压后的目录编译

  1. make install PREFIX=/usr/local/redis

​ 5.1 安装,设置安装路径为/usr/local/redis 下

​ 5.2 进入到 src 下安装

  1. ./redis-server

​ 6.1 前端启动,安装后不能进行其他操作

​ 6.2 Ctrl+c 退出

​ 6.3 命令要在 bin 目录下执行

打开守护进程:

  1. cp /usr/local/tmp/redis-3.0.0/redis.conf /usr/local/redis/bin

​ 7.1 把解压目录下配置文件拷贝到安装目录的 bin 下

  1. vi redis.conf

​ 8.1 修改 bin 下 redis.conf

​ 8.2 把 daemonize 由 no 修改成 yes,守护进程启动

  1. ps aux|grep redis

​ 9.1 查看 redis 启动情况

  1. ./redis-server redis.conf

​ 10.1 启动 redis 服务

  1. ./redis-cli shutdown

​ 11.1 如果希望关闭,运行上面命令,不关闭不运行即可

  1. ./redis-cli

​ 12.1 进入到自带客户端工具,测试 redis 是否可用

​ 12.2 set name "smallchun" 添加一个 string ,key 为 name,value 为 smallming

​ 12.4 get name 取出 name 中内容

Redis集群

集群的概念:

  1. 集群的概念:

    多个业务单元协同工作组成的整体称为集群

    每个业务单元都是相同的

  2. 当集群中业务单元中超过或等于 1/2 个 down 掉时整个集群不可用

    建议使用奇数个,整体 down 机率小

  3. 一主一备模式

    给每个业务单元创建一个备份业务单元

    原来的业务单元(master)后产生的叫做(slave)

  4. 集群和伪集群

    集群: 每个业务单元都安装到单独的服务器上

    伪集群: 所有业务单元都安装到同一个服务器上,通过端口区分不同的业务单元

Redis集群步骤

  1. yum install ruby -y

    ​ 后面需要用到 ruby 脚本

  2. yum install rubygems -y

    ​ 安装 ruby 包管理器

  3. gem install redis-3.0.0.gem(ruby脚本用来操作Redis的压缩包)

    ​ 脚本需要 ruby 其他包,所以安装这个 redis.gem

  4. mkdir reids-cluster

    ​ 4.1 在/usr/local 中新建 redis-cluster 文件夹

  5. cp -r bin ../redis-cluster/redis01

    ​ 5.1 把之前安装好的 redis/bin 复制到 redis-cluster 中并起名为 redis01

  6. rm -rf dump.rdb

    ​ 6.1 删除掉 redis01 中 dump.rdb 数据库文件

  7. vi redis.conf

    ​ 7.1 修改 redis01 中端口号为 7001, 找到 port 后面修改为 7001

    ​ 7.2 去掉 cluster-enabled(集群生效) yes 前面的注释

    ​ 7.3 如果之前设置过密码,注释掉密码,如果没有设置过过略 7.3 这步骤

  8. 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

  9. vi redis02/redis.conf

    ​ 9.1 此命令需要在 redis-cluster 下执行

    ​ 9.2 把 其 他 5 个 文 件 夹 中 redis.conf 中 port 修 改 成 不 同 的 值 , 分 别 为7002,7003,7004,7005,7006

  10. cp *.rb /usr/local/redis-cluster/

    ​ 10.1 去 redis 解压目录中 src 下执行此命令

    ​ 10.2 把 redis-trib.rb 复制到 reids-cluster 中

  11. 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 ..
    
  12. chmod a+x startup.sh

    ​ 12.1给脚本文件设置可执行权限

  13. ./startall.sh

    ​ 13.1 执行脚本,启动所有 redis 服务

  14. ps aux|grep redis

    ​ 14.1 查看所有服务是否启动成功

  15. ./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

  16. ./redis01/redis-cli -h 192.168.124.130 -p 7001 -c

    ​ 16.1 进入任意节点测试

  17. redis01/redis-cli -p 7001 shutdown

    ​ 17.1 关闭其中一个 redis

  18. 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
    

推荐阅读