Redis

it2023-07-06  71

介绍

Redis是完全开源的,是一个高性能的Key-value数据库。 Redis具有三个特点: 1,Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 2,Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储 3,Redis支持数据的备份,即master-slave模式的数据备份

Redis的数据类型

Redis支持五种数据类型:string(字符串)、hash(哈希)、list(列表),set(集合)及zset(sorted set即有序集合) 1,String包含一个key,一个value。string类型是二进制安全的,redis的String可以包含任何数据,比如jpg图片或者序列化过的对象。String类型是Redis最基本的数据类型,string类型最大能存储512MB。 2,Hash(哈希)是一个键值(key=>value)对集合,hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。每个hash可以存储2的32次方-1个键值对。 3,List列表,Redis是最简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部或者尾部。列表最多可以存储2的32次方-1个元素 4,Set集合,Redis的set是String类型的无序不重复集合,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。sadd添加一个String元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0。集合中最大的成员数为2的32次方-1 5,zset集合(sorted set:有序集合),zset和set一样也是String类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但是分数可以重复。zadd添加元素到集合中,元素在集合中存在则更新对应的score.

Redis事务

Redis事务可以一次执行多个命令,并且带有以下三个保证: 1,批量操作可以在发送EXEC命令前被放入队列缓存 2,收到EXEC命令后进入到事务执行,事务中任意命令执行失败,其余的命令依然被执行 3,在事务执行过程中,其他客户端提交的命令请求不会插入到事务执行命令队列中

单个Redis命令的执行是原子性的,但Redis没有在事务上增加任何维持原子性的机制,所以Redis事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不影响前面已经执行的指令,也不影响后续的指令。

悲观锁和乐观锁

悲观锁:执行操作前,假设当前的操作肯定(或有很大几率)被打断(悲观)。基于这个假设,我们在做操作前就会把相关资源锁定,不允许自己执行期间有其他操作被干扰。 乐观锁:执行操作前假设当前操作不会被打断(乐观),基于这个假设,我们做操作前不会锁定资源,万一发生了其他操作的干扰,那么本次操作将被放弃。Redis使用的就是乐观锁。

主从复制,读写分离

info replication:查看当前节点的集群信息slaveof ip port:认老大当集群中的主机宕机后,为了保证集群的可用性,我们要让其中的一个从机变成主机,其他的从机连接新主机。主机负责读写操作,从机负责读操作和备份。

哨兵模式

Redis的Sentinel系统用于管理多个Redis服务器,该系统主要执行三个任务:

监控(Monitoring):Sentinel会不断地检查主服务器和从服务器是否运作正常提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知自动故障转移(Automatic failover):当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个服务器升级为新的主服务器,并让失效服务器的其他从服务器改为新主服务器工作;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器带起失效服务器。

启动哨兵模式:redis-server /opt/apps/redis/conf/sentinel.conf --sentinel

持久化机制

1,RDB:周期性备份 RDB持久化方式能够在指定的时间间隔对你的数据进行快照存储

# In the example below the behaviour will be to save: # 15分钟之内保存1次就会持久化 # 5分钟之内保存10次就会持久化 # 1分钟之内保存10000次就会持久化 save 900 1 save 300 10 save 60 10000 # rdb持久化的文件名称 dbfilename dump.rdb # 保存你的RDB文件到哪个目录下 dir /opt/apps/redis-3.2.8/backup

2,AOF:提升数据容灾性 AOF持久化方式记录每次对服务器写操作,当服务器重启的时候会重新执行这些命令,来恢复最原始的数据

# 开启AOF模式 appendonly yes # aof备份配置文件的名称 appendfilename "appendonly.aof" # 配置aof写日志的3种模式: # always.性能最差,但是最安全 # everysec.性能和安全的结合,一般都是用此模式 # no. 性能最强,但是很不安全,一般不用 # appendfsync always appendfsync everysec # appendfsync no # 自动日志重写 no-appendfsync-on-rewrite yes # 自动重写日志的节点 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb

面试题总结(来自大数据私房菜微信公众号):

1、缓存穿透、缓存雪崩、缓存击穿 1)缓存穿透是指查询一个一定不存在的数据,由于缓存中无法查到,导致这个不存在的数据每次都要去数据库中查询,造成缓存穿透。 解决方案: ①将空对象也缓存起来,被给它设置很短的过期时间 ②采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一定不存在的数据会被bitmap拦截,从而避免对底层存储系统的查询压力 2)缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成缓存雪崩 解决方案:尽量让失效的时间点不分布在同一个时间点 3)缓存击穿,是指一个key非常热点,在不停的接收大并发,当这个key在失效的瞬间持续的大并发请求到数据库,造成缓存击穿。 解决方案:可以设置key永不过期 2,数据类型

类型描述string字符串list可以重复的集合set不可以重复的集合hashkey=>valuezset有序不重复带分数的set

3,持久化 1)RDB 持久化 ①在指定的时间间隔内持久化 ②服务shutdown会自动持久化 ③输入bgsave也会持久化 2)AOF:以日志形式记录每个更新操作 Redis重新启动读取这个文件,重新执行新建、修改数据的命令恢复数据 保存策略:推荐也是默认每秒持久化一次,兼顾安全和速度 4)悲观锁和乐观锁 悲观锁:在执行操作前假设当前的操作会被打断,基于这个假设,锁定相关的资源,不允许执行期间有其他操作干扰。 乐观锁:执行操作前假设当前操作不会被打断,基于这个假设,在做操作前不会锁定资源。万一发生了其他操作的干扰,本次操作将会被放弃,redis使用的是乐观锁。 5、redis是单线程的,为什么执行起来那么快? 1)完全基于内存,绝大部分请求都是存粹的内存操作 2)数据结构简单,对数据的操作简单,Redis中的数据结构是进行专门设计的 6、如何解决redis的热键问题?

最新回复(0)