1 Redis高级
1.1 Redis中持久化策略
1.1.1 Redis持久化规则
说明:根据redis的配置文件中所配置的持久化策略,定期持久化.将redis内存中的数据最终写入到持久化文件中.当redis意外关闭内存数据清空了.当redis重新启动时,根据配置文件中持久化文件的路径/名称,读取持久化文件.
从持久化文件中恢复内存数据.
1.2 RDB模式
说明:
- RDB模式是redis中默认的持久化策略.该模式能够定期(有时间间隔)将内存中的数据持久化到XXX.rdb文件中.
- 该模式的效率是最高的.相当于对内存做快照处理.
- 同时数据加密保存.
- 如果允许少量的数据丢失则首选RDB模式
- 持久化时间间隔
1.2.1 RDB模式持久化配置
save 900 1 900秒内执行一次set操作 则持久化1次
save 300 10 300秒内执行10次set操作,则持久化1次
save 60 10000 60秒内执行10000次set操作,则持久化1次
- 持久化文件名称
- 持久化文件存储路径
如果需要修改持久化文件保存位置,则修改该文件 /绝对路径.
1.3 AOF模式
说明:
- AOF模式通过持久化文件记录了用户的全部的操作过程.该模式可以实现数据的实时备份.
- AOF模式中持久化文件会很庞大.不易于解析.
- AOF文件没有加密处理.
特点:
如果对数据完整性有特殊要求,则采用AOF模式.
1.3.1 AOF模式配置
- 开启AOF模式 如果改为yes后,redis持久化策略采用AOF模式.
- AOF持久化文件名称
- 持久化策略
appendfsync always 该配置表示如果用户执行set操作,就持久化1次
appendfsync everysec 每秒持久化一次
appendfsync no 持久化化
- 文件存储
通过dir文件,执行持久化文件位置.
1.4 Redis中内存策略
1.4.1 需求描述
Redis中的数据都保存在内存中.如果内存中一直添加数据,则可能会造成内存填满,内存溢出的现象.需要控制redis的内存大小.
1.4.2 LRU算法
内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。
1.4.3 内存策略介绍
volatile-lru 在已经设定了超时时间的数据中,选择最少使用的数据进行删除.
allkeys-lru 选择全部值,采用LRU算法进行删除.
volatile-random 在设定了超时时间的数据中随机删除.
allkeys-random 在所以的key中随机删除.
volatile-ttl 在设定了超时时间的数据中,按照超时时间倒叙排列,删除马上过期的数据.
Noeviction(默认策略) 如果选择该模式,在不删除数据,则直接报错给用户.
1.4.4 内存策略修改
560行
1.5 Redis分片技术
1.5.1 业务需求
- 如果需要动态的扩展内存,单个redis节点上有上限(10M默认-512M-1GB)
- 如果将数据保存到一个redis节点中,可能会出现丢数据的风险.所以尽可能分开保存.
1.5.2 Redis分片机制介绍
特点:
- 多台redis节点将内存扩大N倍
- 多台redis共同唯一所有的数据.每个节点中所保存的数据都不一样的.
1.5.3 Redis分片配置步骤
- 复制配置文件
- 修改端口号
1.5.4 启动多台redis
redis-server redis-6379.conf
[root@localhost shards]# redis-server redis-6380.conf
[root@localhost shards]# redis-server redis-6381.conf
[root@localhost shards]# ps -ef |grep redis
root 9789 1 0 19:41 ? 00:00:00 redis-server *:6379
root 9794 1 0 19:41 ? 00:00:00 redis-server *:6380
root 9798 1 0 19:41 ? 00:00:00 redis-server *:6381
root 9804 7057 0 19:41 pts/2 00:00:00 grep redis
1.5.5 Redis分片入门案例
@Test
public void test01(){
List<JedisShardInfo> shards = new ArrayList<>();
shards.add(new JedisShardInfo("192.168.126.166", 6379));
shards.add(new JedisShardInfo("192.168.126.166", 6380));
shards.add(new JedisShardInfo("192.168.126.166", 6381));
ShardedJedis shardedJedis =
new ShardedJedis(shards);
shardedJedis.set("1807","学习redis分片");
System.out.println("获取数据:"+shardedJedis.get("1807"));
}