一、Redis 介绍
介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
常用命令
- 启动
redis-server ./redis.conf
- 进入客户端
redis-cli -p 6379
- 关闭
redis-cli -p 6379 shutdown
- String 类型操作
- Hash 类型操作
- List 类型操作
- 事务
如果是6379默认端口可省略 -p 6379
二、Redis安装、使用(Centos 7)
在VMware虚拟机中安装以及测试
安装Centos 7
Centos官方站点: http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64/
阿里云站点:http://mirrors.aliyun.com/centos/7/isos/x86_64/
VMware 安装运行
创建新虚拟机导入镜像即可
安装常用插件
yum -y install vim # 安装vim编辑器
yum -y install wget # 用来下载网络资源
yum -y install gcc # 编译redis (c、c++ 等语言的编译器)
yum -y install lrzsz # 拖拽上传插件
配置为静态IP(方便连接测试等)
如过没有安装 vim 用 vi 命令 ens33 是设备名
vim /etc/sysconfig/network-scripts/ifcfg-ens33
添加:
ONBOOT=yes #开机启用网卡
BOOTPROTO=static # 使用静态Ip
IPADDR=192.168.22.100 #需要和设置VMware虚拟网卡的IP段统一
NETMASK=255.255.255.0
GATEWAY=192.168.22.2 #需要和VMware虚拟网卡设置的网关一致
DNS1=8.8.8.8 #这个必须设置 否则会导致能ping通外部IP,ping不通域名
重启 network 网络服务
service network restart
云实例可以跳过以上步骤
编译安装Redis
cd redis/ # 进入redis目录
make # 编译redis
make install # 安装redis
如果 make 时报错: zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
使用:
make MALLOC=libc
测试是否安装完成
cd redis/ # 进入redis目录
redis-server # 启动服务
结果:
Redis分片
通过分片可以提高redis的容量
修改redis配置文件
cd redis/
vim redis.conf
取消IP绑定
也可以设置为指定IP
为了方便我直接注释掉 大约在第69行
不取消绑定的话只能指定ip访问
关闭保护模式
不关闭需要需要设置 密码 配置文件第507行
取消注释设置密码requirepass password
设置后台运行
将虚拟机克隆三份 并运行
cd redis
redis-server ./redis.conf # 运行并指定配置文件
测试分片
关闭防火墙:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
添加依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
添加测试代码和数据:
@Test
public void testOne(){
//存放redis各个分片连接信息
List<JedisShardInfo> shardInfos = new ArrayList<>();
//存入连接数据
shardInfos.add(new JedisShardInfo("192.168.22.101",6379));
shardInfos.add(new JedisShardInfo("192.168.22.102",6379));
shardInfos.add(new JedisShardInfo("192.168.22.103",6379));
//创建分片连接
ShardedJedis shardedJedis = new ShardedJedis(shardInfos);
//存入数据
shardedJedis.set("test1","hello redis");
shardedJedis.set("test2","hello redis");
shardedJedis.set("test3","hello redis");
}
进入redis客户端,查看数据是否为分散分布 例如:
[root@localhost redis-5.0.7]# redis-cli
127.0.0.1:6379> get test1
(nil)
127.0.0.1:6379> get test2
"hello redis"
127.0.0.1:6379> get test3
(nil)
127.0.0.1:6379>
Redis哨兵实现高可用
Redis 分片实现了redis存储的扩容 但是一旦一台机器宕机数据就会丢失,从而导致数据不完整 从机会同步主机的数据 哨兵可以在主机宕机后进行新主机的选举
- 将三台主机进行
主从挂载
一台主机两台从机
- 在redis客户端中进行主从的挂载
# 1.进入redis客户端
redis-cli -p 6379 # 默认端口可省略
# 2.查看redis主从状态
INFO replication
# 3.不出意外都是主机 进行主从挂载 将102、103两台机器作为从机 101 作为主机
# 分别在两台从机客户端执行以下命令
# SLAVEOF 主机ip地址 主机port端口
SLAVEOF 192.168.22.101 6379
# 4.挂载完毕后查看机器状态 slave从机 master主机
INFO replication
- 搭建哨兵
- 复制一个虚拟机出来作为redis哨兵
- 修改哨兵配置文件
sentinel.conf
关闭保护模式、开启后台运行、指定哨兵监控的主机名和地址以及选举条件
测试哨兵
@Test
public void testTwo(){
//用来存放哨兵信息
Set<String> set = new HashSet<>();
//存入哨兵的连接信息
set.add("192.168.22.104:26379");
//创建哨兵连接池 mymaster 为配置文件中的主机名
JedisSentinelPool sentinels = new JedisSentinelPool("mymaster", set);
//取一条连接
Jedis resource = sentinels.getResource();
//进行存数据
resource.set("a","1324568");
}
查看主从机中是否有数据、数据是否一致
Redis集群
集群目的:实现扩容和高可用
搭建集群条件:
最少三台
主机数量最好为奇数 因为集群存活条件为
存活的服务器数量>总数量二分之一
本次集群为 3主 3从 一台主机配备一台从机
修改配置文件
- 取消ip绑定
- 关闭保护模式
- 修改配置文件路径
- 启用内存优化策略 volatile-lru
- 关闭AOF持久化模式
开启集群配置
配置为按业务需要配置,并不固定,上面只是例子 可以参考:
https://www.jianshu.com/p/41f393f594e8
将所有Redis节点启动
cd redis/
redis-server ./redis.conf
创建Redis集群
redis-cli --cluster create --cluster-replicas 从机数量 服务器地址(多个空格隔开)
redis-cli --cluster create --cluster-replicas 1 192.168.22.200:6379 192.168.22.201:6379 192.168.22.202:6379 192.168.22.210:6379 192.168.22.211:6379 192.168.22.212:6379
Redis测试
@Test
public void testThree(){
Set<HostAndPort> set = new HashSet<>();
set.add(new HostAndPort("192.168.22.200",6379));
set.add(new HostAndPort("192.168.22.201",6379));
set.add(new HostAndPort("192.168.22.202",6379));
set.add(new HostAndPort("192.168.22.210",6379));
set.add(new HostAndPort("192.168.22.211",6379));
set.add(new HostAndPort("192.168.22.212",6379));
JedisCluster jedisCluster = new JedisCluster(set);
jedisCluster.set("a","a");
jedisCluster.set("b","b");
jedisCluster.set("c","c");
jedisCluster.set("d","d");
}
可以将代码提取为配置类交给spring管理 地址和端口可以写在配置文件内 通过字符串切割获取 提高程序灵活性
Redis 的持久化策略
1、RDB方式
RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是Redis默认采用的持久化方式,在配置文件中已经预置了3个条件:
save 900 1
save 300 10
save 60 10000
save参数指定了快照条件,可以存在多个条件,条件之间是“或”的关系。如上所说,save900 1的意思是在15分钟(900秒钟)内有至少一个键被更改则进行快照。如果想要禁用自动快照,只需要将所有的save参数删除即可。
Redis默认会将快照文件存储在当前目录的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。
2、AOF方式
默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:
开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof
详细参考:https://juejin.im/entry/58ccb34a0ce4630057c9aa84
Redis 内存优化策略
- volatile-lru 在设定超时时间的数据中使用LRU算法删除数据
- allkeys-lru 所有数据都采用LRU算法删除.
- volatile-lfu 设定超时时间的数据中采用LFU算法(4.x 新增)
- allkeys-lfu 所以数据采用LFU(4.x 新增)
- volatile-random 设定超时时间的数据随机删除
- allkeys-random 所有数据随机删除
- volatile-ttl 根据剩余时间多少删除数据(先删除少的)
- noeviction(默认策略) 不会自动删除数据.内存溢出时报错返回