一起来学习Redis吧!

一、NoSQL概述

1.什么是NoSQL

NoSQL=Not Only SQL(不仅仅是SQL)
NoSQL泛指非关系型数据库,NoSQL的产生并不是要否定关系型数据库,而是作为关系型数据库的一个有效补充。

关系型和非关系型数据库的主要差异是数据存储的方式。关系型数据天然就是表格式的,因此存储在数据表的行和列中。数据表可以彼此关联协作存储,也很容易提取数据。
与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

2.NoSQL特点

1.方便扩展(数据之间没有关系,很好扩展!)
2.大数据量高性能(官方数据:Redis一秒写8万次,读取11万次)
3.数据类型是多样型的(不需要事先设计数据库!如果表的数据库十分大,很多人就无法设计了!)

简而言之即”三高“,高性能、高可扩展、高可用!!

二、Redis入门

1.什么是Redis

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

2.Redis的用途

1、内存存储、持久化,内存是断电即失、所以说持久化很重要( rdb、aof )
2、效率高,可以用于高速缓存
3、发布订阅消息(消息通知)
4、消息队列
5、计时器、计数器(浏览量)

3.Redis特点

1.Redis以内存作为数据存储介质,读写数据的效率极高。

2.Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启,数据也不会丢失。

3.Redis的存储分为内存存储、磁盘存储和log文件。

4.Redis可以从磁盘重新将数据加载到内存中,也可以通过配置文件对其进行配置,因此,redis才能实现持久化。

5.Redis支持主从模式,可以配置集群,更利于支撑大型的项目。

三、Redis安装

1.安装前准备

Redis官⽹
官⽅⽹站:http://redis.io
中⽂官⽹:http://redis.cn
官⽅⽹站下载:http://redis.io/download

2. Windows安装

这个到网上有教程,我自己就偷下懒不再写啦!!

3. Linux安装

同上!!

四、Redis基础知识

1.Redis默认有16个数据库,默认使用的是第0个

2.Redis默认监听端⼝为6379

3.Redis是单线程的
Redis所有的数据都是放在内存中的,对于一个内存系统来说,它没有上下文的切换就是效率最高的,所以就使用单线程来实现。

补充:上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程或线程切换到另一个进程或线程。

五、Redis常⽤数据类型

Redis⽀持五种数据类型:String(字符串),hash(哈希),list(列表),set(集合)以及zset(sorted set:有序集合) 等。
在这里插入图片描述

1.String

string是Redis最基本的类型,它可以包含任何数据,⽐如jpg图⽚或者序列化对象。⼀个key对应⼀个value,⼀个键最⼤能存储512MB。

单值缓存
•SET key value
将字符串值value关联到key 。
如果key已经持有其他值,SET就覆写旧值,无视类型。
•GET key

对象缓存
1)SET user:1 value(json格式数据)
2)MSET user:1:name zhuge user:1:balance 1888(批量操作)
MGET user:1:name user:1:balance

分布式锁
• SETNX product:10001 true //返回1代表获取锁成功
• SETNX product:10001 false //返回0代表获取锁成功
执行业务逻辑:
DEL product:10001 //执行完业务释放锁

补充:
setnx key value
将key的值设为value,当且仅当key不存在。
若给定的key已经存在,则SETNX不做任何动作。
SETNX是【SET if NOT exists】(如果不存在,则SET)的简写。

2.List

Redis的列表List允许⽤户从序列的两端推⼊或者弹出元素,列表由多个字符串值组成的有序可重复的序列,list 的实现为一个双向链表,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快。这意味着即使是⼀个有⼏千万个元素的列表,获取头部或尾部的10条记录也是极快的。
在这里插入图片描述

List常用操作:
LPUSH key value [value …] //将一个或多个值value插入到key列表的表头(最左边)
RPUSH key value [value …] //将一个或多个值value插入到key列表的表尾(最右边)
LPOP key //移除并返回key列表的头元素
RPOP key //移除并返回key列表的尾元素
LRANGE key start stop //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
BLPOP key [key…] timeout //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key …] timeout //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

List应⽤场景:
1.微博和微信公众号消息流。
2.消息队列,以完成多程序之间的消息交换。可以⽤push操作将任务存在list中(⽣产者),然后线程在⽤pop操作将任务取出进⾏执⾏。(消费者)

3.Hash (⼆维表)

Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到⼀个key中。每⼀个Hash可以存储4294967295个键值对。

Hash常用操作:
HSET key field value //存储一个哈希表key的键值
HSETNX key field value //存储一个不存在的哈希表key的键值
HMSET key field value [field value…] //在一个哈希表key中存储多个键值对
HGET key field //获取哈希表key对应的field键值
HMGET key field [field …] //批量获取哈希表key中多个field键值
HDEL key field [field …] //删除哈希表key中的field键值
HLEN key //返回哈希表key中field的数量
HGETALL key //返回哈希表key中所有的键值
HINCRBY key field increment //为哈希表key中field键的值加上增量increment

对象缓存:
HMSET user {userId}:name zhuge {userId}:balance 1888
HMSET user 1:name zhuge 1:balance 1888
HMSET user 1:name 1:balance
在这里插入图片描述
Hash应用场景:
电商购物车:
1)用户id为key
2)商品id为field
3)商品数量为value

4.Set(⽆序集合)

Set常用操作:
SADD key member [member …] //往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member …] //从集合key中删除元素
SMEMBERS key //获取集合key中所有元素
SCARD key //获取集合key的元素个数
SISMEMBER key member //判断member元素是否存在于集合key中
SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除
SPOP key [count] //从集合key中选出count个元素,元素从key中删除

Set应⽤场景:
1.利⽤交集求共同好友。
2.利⽤唯⼀性,可以统计访问⽹站的所有独⽴IP。
3.好友推荐的时候根据tag求交集,⼤于某个threshold(临界值的)就可以推荐。

5.SortedSet(有序集合)

和set相比,sorted set 增加了一个double类型的权重参数score,使得集合中的元素能够按score进行有序排列,还可以通过 score 的范围来获取元素的列表。

ZSet常用操作:
ZADD key score member [score member]…] //往有序集合key中加入带分值元素
ZREM key member [member …] //从有序集合key中删除元素
ZSCORE key member //返回有序集合key中元素member的分值
ZINCRBY key increment member //为有序集合key中元素member的分值加上increment
ZCARD key //返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素
,ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素

ZSet应⽤场景:
可以⽤于⼀个⼤型在线游戏的积分排⾏榜,每当玩家的分数发⽣变化时,可以执⾏zadd更新玩家分数(score),此后在通过zrange获取⼏分top ten的⽤户信息。

六、Jedis(待补充)

1.什么是Jedis

Jedis是Redis官方推荐的Java连接工具,是使用Java操作Redis的中间件。
如果要使用Java操作Redis,那么一定要做Jedis十分熟悉。

七、 Redis持久化

Redis是内存数据库,如果不能将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化功能!

Redis提供了2种持久化方式,分别为:
1.RDB持久化
2.AOF持久化

RDB持久化:
RDB:是Redis默认的持久化机制。RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。RDB相当于照快照,保存的是⼀种状态。
⼏⼗GB的数据 ------> ⼏KB的快照

优点:快照保存数据极快、还原数据极快
适⽤于容灾备份
缺点:⼩内存机器不适合使⽤,RDB机制符合要求就会照快照,可能会丢失数据
快照条件:
1、服务器正常关闭时 ./bin/redis-cli shutdown
2、key满⾜⼀定条件,会进⾏快照

AOF持久化
由于快照⽅式是在⼀定时间间隔内做⼀次的,那么如果Redis意外down掉的话,就会丢失最后⼀次快照后的所有修改。如果应⽤要求不能丢失任何修改的话,可以采取aof持久化⽅式。
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中。AOF⽐快照⽅式有更好的持久化性。
当redis重启时会通过执⾏⽂件中保存的写命令来在内存中重建整个数据库的内容。

八、Redis缓存穿透、缓存击穿和雪崩

0.缓存处理流程

前端用户要访问获取数据时,后端先从Redis缓存查询,若能查到数据,直接返回结果给用户,流程结束;若在缓存中没有查询到数据,则到数据库中查询,若数据库查到,返回结果给用户,同时将查询结果写入缓存,流程结束;若数据库也没查到,那直接返回空结果,流程结束。

1.缓存穿透(查不到导致)

1.1什么是缓存穿透

一些恶意的请求会故意查询缓存不存在的key且请求量很大,这样就会对后端数据库造成很大的压力。这就叫做缓存穿透。
在这里插入图片描述

1.2如何解决缓存穿透

1.布隆过滤器
布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力;
在这里插入图片描述2.缓存空对象(这个有点不懂)
当存储层不命中后,把这个key缓存起来,值可以设为空值或者一个特定的值,设置一个合理的缓存时间(5分钟左右)那么在下一个请求过来之后,先去查找redis,如果拿到的这个值是我们之前设置的那么值,那么就直接返回空
在这里插入图片描述
但是这种方法会存在两个问题∶
1、如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

2.缓存击穿(量太大,缓存过期导致)

1.什么是缓存击穿

缓存击穿是指大并发集中地一个人热点key进行访问,当这个key在过期的瞬间,持续的高并发就穿破缓存,直接请求数据库,就像在屏障上凿了一个洞。

2.如何解决缓存击穿

1.设置热点数据永不过期
从缓存层面来看,没有设置过期时间,所以不会出现热点 key过期后产生的问题。
2.加互斥锁
分布式锁∶使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

3.缓存雪崩

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
1, 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2, 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3, 设置热点数据永远不过期。

九、Redis主从复制

1.什么是主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(masterleader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。一般情况下只需配置从机。

2.主从复制的作用

主从复制的作用主要包括︰
1.数据冗余︰主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

2.故障恢复︰当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

3.负载均衡∶在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务〈即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载﹔尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

4.高可用基石︰除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

3.哨兵模式

主从切换技术的方法是︰当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel (哨兵)架构来解决这个问题。
谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
在这里插入图片描述
这里的哨兵有两个作用
•通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
•当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值