Redis技术学习笔记

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

目录

Redis-benchmark

Redis基本知识说明

关于RedisKey的基本命令

五大数据类型

Redis-Key

String(字符串)

List(列表)

Set(集合)

Hash(哈希)

Zset(有序集合)

三种特殊数据类型

geospatial(地理位置)

Hyperloglog(地理位置)

Bitmaps(位存储)

事务

Jedis 

SpringBoot 集成 Redis

Redis.conf 详解

Redis 持久化

RDB(Redis DataBase)

AOF(Append Only File)

Redis 发布和订阅

Redis 主从复制

一主二从

哨兵模式(重要)

多哨兵模式

Redis 缓存穿透和雪崩(面试高频,工作常用)

缓存穿透(查不到)

缓存击穿(量太大,缓存过期!)

缓存雪崩


Redis-benchmark

redis-benchmark是一个压力测试工具!官方自带。

简单测试:

测试并发连接  100000请求

redis-benchmark -h localhost -p 6379 -n 100000

如何查看这些请求?Set、Get下面的内容。例如下图,

Redis基本知识说明

redis默认有16个数据库。默认使用的是第0个数据库。

基本命令

keys * 查看数据库所有的key。

flushdb把当前库清空。

getname得到数据库名称。

select ?选择数据库 ?为int类型。

flushall清楚所有数据库。

EXISTS name 判断name是否存在。

move 移动。

EXPIRE name 10 设置过期时间。单位为s

ttl name 查看name当前的剩余时间。

type name 查看name是什么类型。

思考:为什么redis是6379?(明星名字缩写对应9键)

Redis是单线程的!

明白Redis是很快的,官方表示Redis基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽。

Redis为什么单线程还这么快?

1. 误区1: 高性能的服务器一定是多线程的?

2. 误区2: 多线程(CPU上下文会切换)一定比单线程效率高?

CPU>内存>硬盘的速度。

核心:redis是将所有数据全部放在内存中,所以说使用单线程去操作效率是最高的,多线程(CPU上下文会切换:耗时的操作!!!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这就是最佳的方案!

关于RedisKey的基本命令

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件MQ。它支持多种类型的数据结构,如字符串(strings),散列(hashes),列表( lists,集合(sets ),有序集合(sorted sets ) 与范围查询bitmaps,hyperloglogs 和地理空间( geospatial) 索引半径查询。Redis 内置了 复制(replication ),LUA脚本( Luascripting),LRU驱动事件(LRU eviction ),事务(transactions ) 和不同级别的 磁盘持久化( persistence ),并通过 Redis哨兵(Sentinel)和自动分区( Cluster) 提供高可用性( high availability)。

五大数据类型

Redis-Key

keys * 查看数据库所有的key。

flushdb把当前库清空。

getname得到数据库名称。

select ?选择数据库 ?为int类型。

flushall清楚所有数据库。

EXISTS name 判断name是否存在。

move 移动。

EXPIRE name 10 设置过期时间。单位为s

ttl name 查看name当前的剩余时间。

type name 查看name是什么类型。

后面如果遇到不会的命令,可以在官网查看帮助文档。

String(字符串)

90%的java程序员使用redis只会用一个String类型!

  

List(列表)

基本的数据类型,列表。

在Redis里面,可以把List玩成栈和队列、阻塞队列。

所有的List命令都是以L开头,Redis命令不区分大小写。

LPUSH、RPUSH命令

LPOP、RPOP命令

Lindex、Rindex命令

Llen命令

Lrem命令   (remove单词)  移除指定的值。

trim命令 修剪:List截断。但是List被截断后已经被修改。

rpoplpush命令  移除列表的最后一个元素,将他移动到新的列表中!

lset命令,将列表中指定下标的值替换为另一个值,更新操作。

linsert命令,将某个具体的value插入到列表中某个元素的前面或者后面。

小结:

* List其实是一个链表,before Node after, left, right 都可以插入值。

* 如果key不存在,创建新的链表。

* 如果key存在,新增内容。

* 如果移除了所有值,空链表,也代表不存在!

* 在两边插入值或者改动值,效率最高!在中间插入值,效率会低一点~

消息排队!消息队列(Lpush Rpop), 栈(Lpush Lpop)

Set(集合)

set中的值不能重复。

set中的命令都是s开头。

sadd命令

scard命令,获取集合中的内容元素个数。

rem命令,移除集合中的元素

Srandmember命令,随机选出一个元素。

spop命令,随机删除一些set集合中的元素。

smove命令,将一个指定的值,移动到另一个set集合中

微博、b站,共同关注!(并集)

数字集合类:差集、交集、并集。

应用:微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!

共同关注,共同爱好,二度好友,推荐好友!(六度分隔理论)

Hash(哈希)

Map集合,key-map!本质和String类型没有太大区别,还是一个简单的key-value!

hset、hmset、hgetall、hdel命令。

set myhash field kuangshen

hlen命令,获取hash表的字段数量。

hexists命令,判断hash中指定字段是否存在。

hkeys、hvalues命令。只获取key,只获取value。

incr、decr命令

应用:hash存储一些变更的数据。例如用户信息或者经常变动的信息。

hash更适合对象的存储,String类型更适合字符串的存储。

Zset(有序集合)

在set的基础上,增加了一个值,

set k1 v1, zset k1 score1 v1;

排序如何实现?

zrem命令,移除rem中的指定元素

zcount命令,获取指定区间的成员数量。

案例思路:set排序,存储班级成绩表,工资表排序!

普通消息,1, 重要消息,2,带权重进行判断!

排行榜应用实现,取Top N测试。

三种特殊数据类型

geospatial(地理位置)

朋友圈的定位、附件的人、打车距离的计算?

只有六个命令:

GEOADD

GEODIST

GEOHASH

GEOPOS

GEORADIUS

GEORADIUSBYMEMBER

GEOADD命令,添加地理位置。

GEOPOS命令,获取指定位置的经度和纬度。一定是一个坐标值!

GEODIST命令,返回两个给定位置之间的距离。

单位:m、km、mi(英里)、ft(英尺)

GEORADIUS命令,以给定的经纬度为中心,找出某一半径内的元素。

附近的人?(获取所有附近的人的地址,定位!)通过半径来查询!

指定数量。前提是把这些所有数据都录入。

Hyperloglog(地理位置)

什么是基数?(不重复的元素)

Redis更新了Hyperloglog数据结构!基数统计的算法!

优点:占用的内存是固定的,2的64次方不同的元素的技术,只需要废12KB内存!

网页的UV(一个访问一个网站多次,但还是算作一个人!)

传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为标准判断!

0.81%错误率,统计UV任务,可以忽略不计!

测试使用!

如果允许容错,那么一定可以使用Hyperloglog!

如果不允许容错,就使用set或者自己的数据类型即可!

Bitmaps(位存储)

统计疫情感染人数:01010

统计用户信息,活跃,不活跃;登录,未登录;打卡,365天打卡。

传统使用设计数据库表userid status day来存储,这样非常麻烦。

两个状态的都可以使用Bitmaps!

Bitmaps位图,数据结构!都是操作二进制位来记录,只有0和1两个状态。

365天= 365bit   1字节=1bit   46个字节左右!        

使用Bitmaps来记录周一到周日的打卡!

周一:1 周二:0 周三:0 周四:1 ......

getbit命令,查看某一天是否有打卡!

bitcount命令,统计打卡的天数!

事务

监控!Watch!

悲观锁:

-- 很悲观,认为什么时候都会出问题,什么问题都会加锁!

乐观锁:

-- 很乐观,认为什么时候都不会出问题,所以不会加锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据!

-- 获取version!

-- 更新的时候比较version

Redis测监视测试(面试常问!)

正常执行成功!

测试多线程修改值,使用watch可以当作redis的乐观锁操作!

如果修改失败,获取最新的值就好!

Jedis 

什么是Jedis?Jedis是官方推荐的java连接开发工具!使用java操作Redis中间件!如果你要使用java操作redis,那么一定要对jedis十分的熟悉!

1、在idea中,导入jedis坐标(依赖)。

2、编码测试:

        *连接数据库

        *操作命令

        *断开连接

输出:

常用的API

就是上面看的Sting、List、Set、Hash、Zset。Geospatial、Hyperloglog、Bitmaps。一模一样。

SpringBoot 集成 Redis

SpringBoot操作数据库:Spring-data、jpa、jdbc、mongodb、redis!

SpringData也是和SpringBoot齐名的项目。

源码分析:

说明:在SpringBoot2.x之后,原来使用的jedis被替换成了leettuce。

jedis:采用的直连,多个线程操作不安全,想要避免不安全问题,使用jedis pool连接池。

lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的问题!可以减少线程数据。

整合测试一下

1、导入依赖

2、配置连接

3、测试!

RedisUtils

在公司开发中,通常会写一个属于公司的工具类。

Redis.conf 详解

启动的时候,就通过配置文件来启动。

单位

1、配置文件对大小写不敏感。

2、可以写多个配置。就好比Import、include

网络

通用 GENERAL

快照

持久化,在规定时间内,执行了多少次操作,则会持久化到文件.rdb .aof

redis是内存数据库,如果没有持久化,那么数据断电就丢失!

REPLICATION 复制,后面redis主从复制再详细讲解。

SECURITY 安全

redis默认没有密码。可以设置密码。关键字是requirepass

限制 CLIENTS (客户端)

APPEND ONLY 模式 aof 配置

具体的配置,我们在Redis持久化中详细讲解。

Redis 持久化

工作和面试,持久化都是重点!

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

RDB(Redis DataBase)

什么是RDB?

在主从复制上面,rdb就是备用!从机上面!

rdb保存的文件是 dump.rdb 都是在配置文件中快照中进行配置的!

触发机制

1、save规则满足情况下,会触发rdb规则。

2、执行flushall命令,也会触发rdb。

3、推出redis,也会产生rdb。

备份就自动产生一个 dump.rdb文件

如何恢复RDB文件?

1、只需要把RDB文件放入redis的启动目录就可以,redis启动检查RDB文件恢复其中的数据。

2、查看需要存在的位置

优点:

1、适合大规模的数据恢复。

2、对数据的完整性要求不高。

缺点:

1、需要设置一定的时间间隔进行操作!如果redis意外宕机了,这个最后一次修改数据就没了。

2、fork进行的时候,会占用一定的内存空间!!

在实际生产环境中,通常会对RDB文件进行备份。

AOF(Append Only File)

将所有命令都记录下来,history,恢复的时候把这个文件全部执行一遍!

Aof保存的是 appendonly.aof

,默认是不开启的,需要手动开启。

以日志的形式来记录每个写操作,(读操作不记录)。

如果aof文件有错误,是启动不起来的,需要修复配置文件。

redis提供了一个工具 redis-check-aof --fix  

优点:

1、每一次修改都同步、文件的完整性更加好!

2、每秒同步一次,可能会丢失1s的数据。

3、从不同步,效率最高。

缺点:

1、对于数据文件来说,aof远大于rdb,修复的速度也慢于rdb。

2、Aof允许效率比rdb慢,所以redis默认是rdb持久化。

Redis 发布和订阅

通信  队列   发送者  订阅者

消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。微信、微博、关注系统。

消息队列:rabbit、rabbit mq、kafka。

Redis客户端可以订阅任意数量的频道。

第一个:消息发送者             第二个:频道               第三个:消息订阅者!

使用场景:

1、实时消息系统!

2、实时聊天!(频道当作聊天室,将消息回显给所有人即可!)

3、订阅、关注系统都是可以的。

稍微复杂的场景使用 消息中间件MQ

Redis 主从复制

数据是单向的,只能从主复制到从。

主从复制,读写分离!80%的情况下都是在进行读操作!减缓服务器的压力!架构中经常使用!

只要在公司中,主从复制是必须要使用的,因为在真实的项目中不可能单机使用redis!

1. 主从复制可以将数据备份到多个节点上,当主节点出现故障时,可以快速切换到从节点上,保证系统的高可用性和可靠性。

2. 主从复制可以实现读写分离,从节点可以承担一部分读操作的负载,减轻主节点的压力,提高系统的性能。

3. 主从复制可以将数据分布到多个节点上,实现数据的分布式处理,提高系统的并发性能和处理能力

4. 主从复制可以实现数据的实时同步,保证数据的一致性,提高系统的稳定性和可靠性。

一主二从

默认情况下,每个redis服务器都是主节点。 

哨兵模式(重要)

(自动选举老大模式)

概述

主从切换技术的方法是:当主服务器宕机之后,需要手动把从服务器设置为主服务器,需要人工干预,造成一段时间内服务器不可用。

哨兵模式根据投票数,自动将从库转换为主库。

哨兵模式通过发送命令,等待redis服务器响应,从而监控运行的多个redis实例。

多哨兵模式

master是主机,slave1和2是从机。假如master宕机掉了,3个哨兵就会向master发送请求,如果没有等待到master的响应,就表示master不可用了,就需要在从机中选取主机,根据投票来选取哪个从机转换成主机。(投票算法)

哨兵模式

优点:

1、哨兵集群,基于主从复制,所有主从复制优点,它全有。

2、主从可以切换,系统的可用性会更好。

3、哨兵模式从手动到自动,更加健壮。

缺点:

1、Redis不好在线扩充,集群容量一旦到达上限,在线扩容就十分麻烦。

2、哨兵模式的配置很麻烦。

Redis 缓存穿透和雪崩(面试高频,工作常用)

用户去redis缓存中查找数据,如果缓存中没有,就会去数据库中查找。查不到,就不停地向MySQL中查询,如果有人恶意发送大量消息,MySQL服务器就会受到攻击,容易崩溃。这就是标准的缓存穿透。

缓存穿透(查不到)

缓存穿透概念

用户想要查询一个数据,发现redis内存数据库中没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是全部都去访问持久层数据库。这会给持久层数据库造成很大的压力,这就是缓存穿透。

解决方案:布隆过滤器和缓存对象。

布隆过滤器

布隆过滤器是一种数据结构,对数据Hash化存储,在控制层先进行校验,不符合规则就丢弃。从而避免对底层系统的查询压力。

缓存空对象,但是空对象需要更多的空间来存储,因为当中有很多空值的键。

缓存击穿(量太大,缓存过期!)

微博热搜,关键词被集中请求。

解决方案:设置热点数据永不过期    加互斥锁

设置热点数据永不过期

从缓存层面来看,没有设置过期时间,所以不会出现热点key过期后产生问题。

加互斥锁

分布式锁:使用分布式锁,保证每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。

缓存雪崩

在某一时间段,缓存集中失效,Redis宕机,比如说停电了。

比如说,双12零点,很快迎来一波抢购,商品都被放入了缓存中,放了一个小时。1个小时后缓存过期,全部请求都砸到了数据库上,存储层调用量暴增,造成存储层挂掉。雪崩了!!

解决方案

双十一:停掉一些服务,(保证主要的服务可用)

数据预热,把可能的数据预先访问一遍,这些数据就会加载到缓存中,设置不同的过期时间。

区别总结:

缓存雪崩是指大量的 key 同时失效,导致大量请求无法击中缓存(这些请求大多都是来请求不同的key的),因为无法击中缓存,所以它们都会去访问后端数据库,导致数据库压力骤增;

缓存穿透是指热 key失效,导致大量请求无法击中缓存(注意这里的请求都是来请求同样的一个key或者是同样的几个key的),因为无法击中缓存,所以它们都会去访问后端数据库,导致数据库压力骤增;

缓存穿透是指有大量请求来访问 Redis 和 后端数据库都没有的 key,导致后端数据库压力过大。

  • 40
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值