认知
- 如何把一个技术点说清楚呢,这里我只能尽量给你呈现一个完整的Redis。
- 什么是Redis?Redis是一个基于内存的非关系型数据库,以键值对进行存储的数据库,因为存储数据是在内存中,不是磁盘空间,所以大大的提升了读写速度,当然读相较于写速度更高,读的速度大概是10万级别/每秒,写的速度2万级别/每秒。
- 使用场景?因为其强悍的读写速度,所以经常使用在缓存,抢票,用户登录信息存储等业务上。
具体使用
-
1、构建Vmware虚拟机,安装Centos7,并根据Centos7进行clone两台,使用奇数台节点做一个Redis的主从复制,再clone克隆一台,当做哨兵。
-
2、下载redis的安装包,ftp上传到4台机器上,分别解压,然后进入软件对应src目录进行编译make,安装install,vim编辑redis.conf配置文件,指定启动方式为后台启动。
-
3、启动Redis-server,指定启动的配置文件Redis.con。查看是否启动成功 ps-ef |grep 6379,启动客户端Redis-cli
-
4、R支持的5中数据类型,String,Hash,set,zset,list,鉴于java程序员,这几种数据类型与java中的哪些数据类型相对应呢?
-
String 对应Java中的String
- 例如:设置:set name ‘zhaoxw’ 值,获取值get name,删除值del name,查询值keys * keys name 以及setnx name zhaoxw等
-
Hash对应java中的hashMap,具体解决的是存储一张二维数据表场景,每一个key对应一条记录,一条记录中有很多字段以及值,
- 例如:Hset user name zhao,Hset user sex man,hmset key filed1 value1 … filedN valueN,hmget key filed1…fieldN等,当然二维表也可以将一条记录格式化为一个json串,然后以字符串的形式进行处理。
-
set与zset,set集合数据不可重复,zset支持不可重复性且有序,类似java中的栈先进后出。
- 例如:一个桶先放进去的东西肯定是最后拿出来,这个是栈的概念,zadd name zhao,zadd sex man
-
list类似于java中队列的先进先出,支持先进去的数据先出来。
- 例如:lpush key string,取出,可以做一个消息队列。类似于一个管道两边开口,先进去的肯定先出来.
熟悉了mybatis的基本操作之后,至于通过java进行操作的话,只需要通过SpringMVC或者SpringBoot集成Redis的相关组件,具体是在pom.xml中引入相关依赖,参考redis提供给java的API就可以实现Redis在项目中的使用等,这些都是比较简单的想法。
-
Redis持久化
- 什么是持久化呢?简而言之就是将内存中的数据持久化到机器磁盘空间,机器上的数据是以二进制存储的,Redis提供了两种持久话文件的机制,如何修改在redis.conf中进行修改
- 一、快照的方式(以rdb的格式文件存储到src目录下默认是这个目录,可以修改,每次写所有的,数据量非常大的话,肯定会有很大磁盘Io,影响性能)
- 二、添加日志方式(以aof的格式存储到src目录下默认是这个目录。可以修改 )
- 三、默认是开启的是快照的方式,redis.conf 中 默认save 900 1 save 300 10 save 60 10000
这种情况,存在数据丢失的情况,59秒变化了9999,redis意外宕机了,数据就算是丢失了。
为了避免数据丢失,手动开启日志追加的方式,appedonly标签 默认no 修改为yes,默认是appendfsync everysec 每秒持久化一次默认推荐,除此之外,还有always 消耗性能,不推荐。
Redis主从复制
- 一个主节点,两台从节点,主节点负责写,从节点负责读,关闭主节点的持久化,只放在从上进行数据持久化。
- 创建很简单,只保持三台机器网络互通,然后在从reidis节点上的redis.conf配置文件中 配置:slaveof 192.168.1.1 6379 就可以了。
- 启动:reids-cli 查看 info信息。就能看到信息。
哨兵机制
- 这个很简单,简单的理解,就是在配置一个redis,这个节点只是当做一个哨兵使用,启动方式是一样的,指定配置文件sentinel.conf,哨兵机制是在主从复制的基础上的。
- 当主节点挂了,内部实现了一个选举随机选举算法,会自动选举出来一个作为主节点。
虚拟内存淘汰机制
-
有两种类型,一是针对设置了过期key值过期时间的,一种是没有设置过期key值的。
-
allkeys-lru:在主键空间中,优先移除最近未使用的key。
-
volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
-
allkeys-random:在主键空间中,随机移除某个key。
-
volatile-random:在设置了过期时间的键空间中,随机移除某个key。
-
volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。
缓存穿透
- 什么是缓存穿透?一般缓存系统都是通过缓存中的key去查找的,如果redis缓存中不存在,就应该去后台系统中从数据库中查找,如果某个key是的value是一定不存在,又对该key发送大量的查询请求就会造成后端系统的大量压力,这个就是缓存穿透,
- 解决方案 redis中缓存空值,缓存时间设置短一点。
布隆过滤器
- 就是一个大的二进制数组,判断数值是否已经存在的功能,redis对布隆过滤器进行了相关整合,直接判断要查询的值是否存在就可了。由于其极高的空间利用率,时间利用率解决了缓存穿透的问题。具体一点就是将查询的key放入布隆过滤器中,再次查询的判断布隆过滤器中是否存在,存在就返回,不存在直接废弃,不在查询数据库。