redis学习(一)

一、NoSql 四大分类

KV键值对

  • 新浪:Redis

  • 美团:Redis + Tair

  • 阿里、百度:Redis + memecache

文档型数据库(bson格式,类似json 格式)

  • MongoDB

    MongoDB是一个基于分布式文件存储的数据库,c++编写,主要用来处理大量的文档。

    MongoDB是一个介于关系型数据库和非关系型数据库之间的产品。

    MongoDB是非关系型数据库中功能最丰富,最像关系型数据库。

列存储数据库

  • HBase

  • 分布式文件系统

图关系数据库

  • 存储的是关系拓扑图,,,比如:朋友圈的社交网络
  • Neo4j

对比

在这里插入图片描述

二、redis 入门

概述

Redis 是什么?

  • Redis(Remote Dictionary Server),即远程字典服务!

  • 是一个开源的使用ANSI C语言编写、支持网络、可基于内存也可持久化的日志型、Key-Value数据库,它提供多种语言的api。

  • 免费和开源!是当下最热门的NoSql技术之一!又被称为结构化数据库!

  • redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis 能干嘛?

  • 1、内存存储、持久化到本地(rdb策略,aof策略)

  • 2、效率高,可以用于高速缓存

  • 3、发布订阅系统

  • 4、地图信息分析

  • 5、计时器、计数器(浏览量分析)

more 。。。。。。

特性

  • 1、多样的数据类型
  • 2、持久化
  • 3、集群
  • 4、事务

more。。。。。。。

基础知识

Redis 默认有16 个数据库(redis.conf),默认使用的是第 0个。可以使用 select n 进行数据库切换

select 3	# 切换到 3号数据库
dbsize		# 查看数据库已用空间
keys *		# 查看当前数据库的所有key,生产不建议使用(key太多),可使用scan 代替
redis-cli --scan --pattern "key前缀*" | xargs -L 1000 redis-cli del  # 批量删除,若使用keys,可能会阻塞造成雪崩
flushdb		# 清空当前数据库
flushall	# 清空所有数据库
exists key  # key是否存在
move key db # 移动key到db
expire key time  # 设置key的过期时间
ttl key		# 查看key的剩余时间
type key	# 查看key的类型

Redis是单线程的!它的性能瓶颈是机器内存和网络带宽(数据传输)。

三、五大数据类型

string(字符串)

常见命令:

append, strlen, incr, decr, incrby, decrby, getrange, setrange, setex, setnx, mset, mget,msetnx, getset

存储对象

set user:1 {name:hello,age:18}

mset user:1:name hello user:1:age:18

mget user:1:name user:1:age

list(类比堆、栈、队列)

常见命令

lpush, lrange, rpush, lpop, rpop, lindex, llen, lrem, ltrim, rpoplpush, lset, linsert

set(无序集合)

常见命令

sadd, smembers, sismember, scard, srem, srandmember, spop, smove, sdiff, sinter, sunion

hash

Map 集合,key-map。

hset,hget,hmset,hmget,hgetall,hdel,hlen,hexists,hkeys,hvalues,hincrby,hdecrby,hsetnx

Zset(有序集合)

常见命令

zadd,zrange,zrangebyscore,zrem,zcard,zrevrange,zcount

四、三大特殊数据类型

Bitmaps

Hyperloglog

Geospatial

五、redis事务

Redis单条命令是保证原子性的,但事务不保证原子性。即某条命令失败不影响后续操作。

multi	# 开启事务
exec	# 执行事务
discard	# 放弃事务

乐观锁(watch)

watch	# 监控
unwatch	# 取消监控

六、Jedis、lettuce、自定义redisTemplate

在Springboot 2.x后,,原来使用的jedis 被替换成了 letture

jedis VS letture

Jedis:采用直连方式,多个线程同事操作,是不安全的。若想避免不安全,需要使用 jedis pool连接池。类似 BIO 模式。

letture:采用netty(异步,事件驱动),实例可以在多个线程中进行共享,不存在线程不安全的情况。可以减少线程数据开销,类似 NIO 模式。

自定义 redisTemplate

@Configuration
public class RedisConfig {
    
    // 自定义 RedisTemplate
    @Bean
    public RedisTemplate<String, Object> redisTemplate (RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        templatte.setConnectionFactory(factory);
        
        // json序列化配置
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(om);
        
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        template.setValueSerializer(serializer);
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        
        return template;
    }
}

七、Redis持久化

RDB

1、简介

redis会单独创建(fork)一个子进程来进行持久化。子进程会先将数据写入一个临时rdb 文件中,待持久化过程都结束了,再用临时文件替换上次持久化好的文件。整个过程中,主进程不进行任何IO 操作。保证了极高的性能。如果需要进行数据恢复,且对于数据完整性不是十分敏感(rdb可能丢失数据),那 RDB 方式比 AOF 更加高效。RDB的缺点是最后一次持久化后的数据可能丢失。默认是配置RDB。

在这里插入图片描述

2、触发规则

  • save
  • flushall
  • 退出redis

3、恢复数据

将rdb文件放到redis启动位置,启动时会自动读取。

4、优缺点

优点

  • 适合大规模的数据恢复
  • 对数据完整性要求不高

缺点

  • 需要一定时间操作。
  • 可能丢失数据。宕机时,最后一次修改可能丢失。
  • fork进程会消耗部分内存空间。

AOF(Append Only File)

1、简介

有点类似 mysql 的 binlog日志。

以日志的形式来记录每一个命令操作,将redis 执行过的所有指令记录下来(读操作不记录)。只许追加文件但不可以改写文件。redis启动之初会去读去文件,然后从头重新执行一遍。

在这里插入图片描述

2、redis-check-aof

当 aof 文件有错位(被更改),此时redis 无法启动,需要先修复 aof文件。

redis-check-aof  --fix  aof文件   # 修复命令

3、优缺点

优点

  • appendfsync always:每一次修改都记录,完整性好。
  • appendfsync everysec:每秒同步一次,可能会丢失一秒的数据。
  • appendfsync no:从不同步,效率高。

缺点

  • 从数据文件角度看,aof 远大于 rdb,修复速度也比 rdb慢

RDB 和 AOF 同时开启

此时,若redis 重启则会有限载入 AOF 文件来恢复数据。因为 AOF 比 RDB 数据集更加完整。

八、Redis主从复制

在这里插入图片描述

1、概念

  • 主从复制,是指将一台Redis 服务器的数据,复制到其他的 Redis 服务器。
  • 前者称为主节点(master/leader),后者称为从节点(slave/follower)。
  • 数据的复制是单向的,只能有主节点 复制到 从节点。
  • Master 以写为主,slave 以读为主。(读写分离)
  • 默认情况下,每台redis 服务器都是主节点。
  • 一主可以多从,但一丛只能一主;

2、作用

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:当主节点出现问题时,可以由从节点向外提供服务,实现快速的故障恢复。是一种服务的冗余。
  • 负载均衡:读写分离就是一种负载均衡。将请求分摊,大大提高 redis 服务的并发量。
  • 高可用:主从复制是哨兵模式和集群实施的基础,即它是高可用的基础。

info replication # 查看机器信息

3、复制原理

  • Slave 启动成功连接到 master 后会发送一个 sync 同步命令;
  • Master 接收到命令后,启动后台的 存盘进程,同时收集 所有接收到的用于修改数据集的命令,在后台进程执行完毕之后,master 将整个数据文件发到 slave,并完成一次全量同步。
  • 全量复制:slave在接收到数据文件后,将其存盘并加载到内存中。
  • 增量复制:master 继续将新的收集到的命令依次发送给slave,完成同步。
  • 只要是重新连接到 master,就会自动执行一次全量同步。

slaveof no one # 升级从节点为主节点

九、哨兵模式

1、简介

哨兵模式就是自动选取 master。

它是一种特殊模式。哨兵是一个*独立运行的进程

原理就是哨兵通过发送命令(类似心跳的健康检查),等待redis 服务器的响应,从而监控运行的多个redis实例。

在这里插入图片描述

2、优缺点

优点

  • 哨兵集群,基于主从复制
  • 主从可以切换,故障可以转移,服务的可用性更好

缺点

  • 配置多

十、Redis缓存穿透和雪崩

缓存穿透(查不到导致的)

1、简介

简单来说就是缓存中没有数据了,请求直接走到数据库。但当请求太多,对数据库压力也会随之增大。

2、解决方案

布隆过滤器

布隆过滤器是一种数据结构,对所有可能查询的参数以 hash形式存储。在控制层先进行校验,不符合则丢弃(请求不会走到后台),从而避免了对底层存储系统的查询压力。

缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来。同时会设置一个过期时间。既保护了后端系统,也能一定程度的处理数据一致性。

但是这个方法存在2个问题:

  • ​ 如果空值被缓存,也就意味着需要更多的内存空间取存储key,此时可能会产生过多的key;
  • ​ 即使对空值设置了过期时间,数据一致性还是会收到一定的影响。

缓存击穿(查询太多,缓存过期)

1、简介

简而言之,就是所有人访问同一个key,此时若key 突然失效,则会流量全部请求到后端数据库。此类数据一般是热点数据,比如微博热点,百度排行榜。

2、解决方案

设置热点数据永不过期

加互斥锁

分布式锁(setnx):使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,没有获取分布式锁的线程只能等待。本质是压力转移到分布式锁,所以分布式锁需要经得起考验。

缓存雪崩

1、简介

简而言之,某个时刻,缓存集中过期失效。或者 redis 宕机。

比如说双十一抢购,0-1点有效,1点过后失效。

2、解决方案

redis 高可用

限流降级

数据预热

将不同的数据设置不同的过期时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值