赞
踩
KV键值
文档型数据库(bson格式比较多)
列存储数据库
图关系数据库
官网:https://redis.io/
中文网:http://www.redis.cn/
是什么
特点
能干吗
redis-benchmark :性能测试工具,可以在自己本子运行,看看自己本子性能如何
redis-check-aof :修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump :修复有问题的dump.rdb文件
redis-cli :客户端,操作入口
redis-sentinel :redis集群使用
redis-server :Redis服务器启动命令
./redis-server redis.conf文件
./redis-server /opt/redis/redis-5.0.5/redis.conf
./redis-cli -p 端口号
./redis-cli -p 6379
Select 0-15
select 4
:切换到数据库 4Dbsize
Flushdb
Flushall
NETWORK(网络配置)
绑定的主机地址
bind 127.0.0.1
保护模式,一层安全保护,以避免Redis实例在互联网上开放被访问和利用。默认保护模式是启用的yes。你应该禁用它只有当你确定你想要其他主机的客户端连接到Redis即使没有配置身份验证,也没有特定的一组接口使用bind指令显式列出
protected-mode no
指定Redis监听端口,默认端口为6379
port 6379
当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 300
GENERAL(基本配置)
daemonize yes
pidfile /var/run/redis_6379.pid
loglevel notice
logfile stdout
databases 16
SNAPSHOTTING(快照配置)
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
save <seconds> <changes>
指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
指定本地数据库存放目录
dir ./
REPLICATION(复制配置)
replicaof <masterip> <masterport>
slaveof <masterip> <masterport>
masterauth <master-password>
SECURITY(安全配置)
requirepass foobared
CLIENTS(客户端配置)
maxclients 128
MEMORY MANAGEMENT(内存管理配置)
指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>
删除策略,达到最大内存后的,对被挑选出来的数据进行删除的策略。
volatile-lru -> 在具有过期集的键中挑选最近最少使用的数据淘汰(推荐使用)
allkeys-lru -> 在所有数据集中挑选最近最少使用的数据淘汰
volatile-lfu -> 在具有过期集的键中挑选最近使用次数最少的数据淘汰
allkeys-lfu -> 在所有数据集中挑选最近使用次数最少的数据淘汰
volatile-random -> 在具有过期集的键中挑选任意选择数据淘汰
allkeys-random -> 在所有数据集中挑选任意选择数据淘汰
volatile-ttl -> 挑选将要过期的数据淘汰
noeviction -> 禁止驱逐数据(redis4.0中默认策略), 在写操作时返回一个错误OOM (OutOf Memory)
maxmemory-policy volatile-lru
每次选取待删除数据的个数。默认是5产生足够好的结果。10非常接近正确的LRU,但花费更多的CPU。3比较快,但是不太准确
maxmemory-samples 5
APPEND ONLY MODE(AOF文件配置)
指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
指定更新日志文件名,默认为appendonly.aof
appendfilename "appendonly.aof"
指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
重写时是否可以运用Appendfsync(配合aof使用),用默认no即可,保证数据安全性
no-appendfsync-on-rewrite no
设置重写的基准值(配合aof使用),默认:AOF文件大小是上次rewrite后大小的一倍且文件大于64M时重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
REDIS CLUSTER(集群配置)
集群节点。默认未开启 no,开启:yes
cluster-enabled yes
集群配置文件。这个文件不是需要手工编辑。它由Redis节点创建和更新。每个Redis集群节点需要不同的集群配置文件。确保在同一系统中运行的实例不存在重叠集群配置文件名。
cluster-config-file nodes-6379.conf
群集节点超时时间,默认是15000(15秒)
cluster-node-timeout 15000
端口
port 26379
工作路径,sentinel一般指定/tmp比较简单
dir /tmp
哨兵监控这个master,在至少quorum个哨兵实例都认为master down后把master标记为odown。slaves是自动发现,所以你没必要明确指定slaves。
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2
设置master和slaves验证密码
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
sentinel auth-pass mymaster 123456
master或slave多长时间(默认30秒)不能使用后标记为sdown状态
sentinel down-after-milliseconds mymaster 30000
如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢
sentinel parallel-syncs mymaster 1
该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
不允许使用SENTINEL SET设置notification-script和client-reconfig-script
sentinel deny-scripts-reconfig yes
#配置复合的快照触发条件,默认是:1分钟内改了1万次,或5分钟内改了10次,或15分钟内改了1次。
save 900 1
save 300 10
save 60 10000
#存储到磁盘中的快照,是否进行压缩存储。如果是的话,采用LZF算法进行压缩。如果不想消耗CPU来压缩,可以设置为关闭
rdbcompression yes
#在存储快照后,可以使用CRC64算法进行数据校验,这样会增加约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭
rdbchecksum yes
#指定本地数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb
#指定本地数据库存放目录,默认为 ./
dir ./
save
bgsave
lastsave
命令获取最后一次成功执行快照的时间config get dir
来获取目录)redis-check-dump --fix 需要修复的rdb文件
redis-check-dump --fix dump.rdb
appendfsync always
,同步持久化,数据变更会被立即记录到磁盘,性能较差但数据完整性比较好appendfsync everysec
异步操作,每秒记录 如果一秒内宕机,有数据丢失appendfsync no
从不同步bgrewriteaof
#是否开启AOF,默认 no
appendonly yes
#指定更新日志文件名,默认为appendonly.aof
appendfilename "appendonly.aof"
#指定更新日志条件,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
#重写时是否可以运用Appendfsync,用默认no即可,保证数据安全性
no-appendfsync-on-rewrite no
#设置重写的基准值,默认:AOF文件大小是上次rewrite后大小的一倍且文件大于64M时重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
config get dir
来获取目录)redis-check-aof --fix 需要恢复的aof文件名称
redis-check-aof --fix appendonly.aof
save 900 1
这条规则。MULTI
开始一个事务EXEC
命令触发事务监控了key,如果key被修改了,后面一个事务的执行失效
一旦执行了exec之前加的监控锁都会被取消掉了
进程间的一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
建立连接 + 数据同步 + 命令传播
建立连接
数据同步
数据同步 + 命令传播
使用三台主机,一台主机两台从机
192.168.37.131 : 主机,master
192.168.37.132 : 从机,slave
192.168.37.133 : 从机,slave
192.168.37.131机器的 redis.conf 文件配置(不知道配置意思可以在目录的 4、解析配置文件(redis.conf) 中查看)
# 192.168.37.131 机器 bind 192.168.37.131 port 6379 daemonize yes pidfile "/var/run/redis_6379.pid" loglevel notice logfile "log_6379.log" databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes rdbchecksum yes dbfilename "dump_6379.rdb" dir "./" appendonly yes appendfilename "appendonly_6379.aof" appendfsync everysec # master密码 masterauth "123456" # 本机密码 requirepass "123456"
192.168.37.132机器的 redis.conf 文件配置(不知道配置意思可以在目录的 4、解析配置文件(redis.conf) 中查看)
# 192.168.37.132 机器 bind 192.168.37.132 port 6379 daemonize yes pidfile "/var/run/redis_6379.pid" loglevel notice logfile "log_6379.log" databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes rdbchecksum yes dbfilename "dump_6379.rdb" dir "./" appendonly yes appendfilename "appendonly_6379.aof" appendfsync everysec # 连接master实行主从复制 replicaof 192.168.37.131 6379 # master密码 masterauth "123456" # 本机密码 requirepass "123456"
192.168.37.133机器的 redis.conf 文件配置(不知道配置意思可以在目录的 4、解析配置文件(redis.conf) 中查看)
# 192.168.37.133 机器 bind 192.168.37.133 port 6379 daemonize yes pidfile "/var/run/redis_6379.pid" loglevel notice logfile "log_6379.log" databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes rdbchecksum yes dbfilename "dump_6379.rdb" dir "./" appendonly yes appendfilename "appendonly_6379.aof" appendfsync everysec # 连接master实行主从复制 replicaof 192.168.37.131 6379 # master密码 masterauth "123456" # 本机密码 requirepass "123456"
./redis-server redis.conf配置文件
./redis-cli -p 端口号
info replication
命令来查看主从复制是否搭建成功
搭建主从复制环境
192.168.37.131机器的 sentinel.conf 文件配置(不知道配置意思可以在目录的 4、解析配置文件(sentiment.conf) 中查看)
port 26379
daemonize no
dir "/tmp"
# 监控本机ip
sentinel monitor mymaster 192.168.37.131 6379 2
# master密码
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
192.168.37.132机器的 sentinel.conf 文件配置(不知道配置意思可以在目录的 4、解析配置文件(sentiment.conf) 中查看)
port 26379
daemonize no
dir "/tmp"
# 监控本机ip
sentinel monitor mymaster 192.168.37.132 6379 2
# master密码
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
192.168.37.133机器的 sentinel.conf 文件配置(不知道配置意思可以在目录的 4、解析配置文件(sentiment.conf) 中查看)
port 26379
daemonize no
dir "/tmp"
# 监控本机ip
sentinel monitor mymaster 192.168.37.133 6379 2
# master密码
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
./redis-sentinel sentinel.conf配置文件
搭建三主三从:master=7000,7001,7002 slave=7003,7004,7005
第一步: 进入一个新目录, 并创建六个以端口号为名字的子目录
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
第二步:将redis.conf文件复制到7000路径下
第三步:修改redis.conf文件
#本机ip
bind 127.0.0.1
#端口号
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
logfile "7000.log"
masterauth 123456
requirepass 123456
#开启集群模式
cluster-enabled yes
#配置文件
cluster-config-file nodes-7000.conf
#超时时间
cluster-node-timeout 5000
第四步:将redis.conf文件复制到7001、7002、7003、7004、7005目录下并修改
第五步:依次启动7000、7001、7002、7003、7004、7005
第六步:创建集群
命令:
./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
缓存雪崩
缓存击穿
缓存穿透
第一步:导入Jedis包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
第二步:编写配置文件(application.yml)
spring:
redis:
host: 192.168.37.130
port: 6379
password: 123456
jedis:
pool:
max-idle: 6 # 最大空闲数
max-active: 10 # 最大连接数
min-idle: 2 #最小空闲数
timeout: 2000 # 连接超时
第三步:编写配置类(JedisConfig.java)
@Configuration @Slf4j public class JedisConfig { //主机ip @Value("${spring.redis.host}") private String host; //端口号 @Value("${spring.redis.port}") private int port; //redis密码 @Value("${spring.redis.password}") private String password; //最大空闲数 @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; //最大连接数 @Value("${spring.redis.jedis.pool.max-active}") private int maxActive; //最小空闲数 @Value("${spring.redis.jedis.pool.min-idle}") private int minIdle; //超时 @Value("${spring.redis.timeout}") private int timeout; /** * Jedis线程池配配置 */ @Bean public JedisPool jedisPool(){ JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(maxIdle); //最大空闲数 jedisPoolConfig.setMinIdle(minIdle); //最大连接数 jedisPoolConfig.setMaxTotal(maxActive); //最小空闲数 JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password); //配置 log.warn("connect success ..."); return jedisPool; } }
第四步:编写实现类(接口和实现类)
Jedis的调用方法和Redis的命令是一样的,下面只展示string的使用方法,其他类型都是一样的
/** * 实现类接口 */ public interface UserService { public String getString(String key); public void setString(String key, String value); } /** * 实现接口类 */ @Service @Slf4j public class UserServiceImpl implements UserService { //jedis连接池 @Resource private JedisPool jedisPool; /** * 获取Redis中的数据(get命令) * @param key Redis中的key值 * @return 返回数据 */ @Override public String getString(String key) { String val; //1、获取资源 Jedis jedis = jedisPool.getResource(); //2、判断key是否存在 if(jedis.exists(key)){ log.warn("存在key:" + key); val = jedis.get(key); }else{ log.warn("不存在key:" + key); val = "error"; } //3、关闭连接 jedis.close(); return val; } /** * 向Redis中写入String类型的数据(set命令) * @param key Redis中的key * @param value Redis中的value */ @Override public void setString(String key, String value) { Jedis jedis = jedisPool.getResource(); jedis.set(key, value); jedis.close(); } }
第五步:测试
@Resource
private UserService userService;
@Test
public void getStringTest(){
String name = userService.getString("name");
System.out.println(name);
}
@Test
public void setStringTest(){
userService.setString("fff", "fff123");
}
第一步:引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
第二步:编写配置文件(application.yml)
spring:
redis:
host: 192.168.37.130
port: 6379
password: 123456
lettuce:
pool:
max-idle: 8 # 最大空闲数
max-active: 8 # 最大连接数
min-idle: 0 #最小空闲数
max-wait: 1000 # 最大阻塞等待时间
shutdown-timeout: 100 # 连接超时
第三步:编写配置类
@Configuration public class RedisConfig { /** * retemplate相关配置 */ @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, String> template = new RedisTemplate<>(); // 配置连接工厂 template.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式) Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jacksonSeial.setObjectMapper(om); // 值采用json序列化 //template.setValueSerializer(jacksonSeial); template.setValueSerializer(new StringRedisSerializer()); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); // 设置hash key 和value序列化模式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(jacksonSeial); template.afterPropertiesSet(); return template; } /** * 对hash类型的数据操作 @Bean public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForHash(); } */ /** * 对redis字符串类型数据操作 @Bean public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForValue(); } */ /** * 对链表类型的数据操作 @Bean public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForList(); } */ /** * 对无序集合类型的数据操作 @Bean public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForSet(); } */ /** * 对有序集合类型的数据操作 @Bean public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) { return redisTemplate.opsForZSet(); } */ }
第四步:编写实现类
下面只展示string的使用方法
@Service
public class RedisServiceImpl {
@Resource
private RedisTemplate<String, Object> redisTemplate;
public String get(String key){
Object string = redisTemplate.opsForValue().get(key); //string类型
return (String) string;
}
public void set(String key, String value){
redisTemplate.opsForValue().set(key, value);
}
}
第五步:测试
@Resource
private RedisServiceImpl redisService;
@Test
public void getStringTest(){
String fzk = redisService.get("test");
System.out.println(fzk);
}
@Test
public void setStringTest(){
redisService.set("test", "123");
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。