Reids高速缓存数据库

  • Post author:
  • Post category:其他


Reids高速缓存数据库

Redis 是一个高性能的key-value(键值对)存储系统,是跨平台的非关系型数据库。Redis 能读的速度是11万次/s,写的速度是8.1万次/s。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。这就是Redis支持的五种数据类型

Redis是单进程单线程,Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行 控制的开销。

一:Redis 是什么?都有哪些使用场景?

1:Redis 是一个使用 C 语言开发的高速缓存数据库。

2:Redis 使用场景:

1、记录帖子点赞数、点击数、评论数;

2、缓存近期热帖;

3、缓存文章详情信息;

4、记录用户会话信息。

二:Redis 有哪些功能?

1:数据缓存功能

2:分布式锁的功能

3:支持数据持久化

4:支持事务

5:支持消息队列

三:Redis的数据类型:

1:Redis支持5种数据类型:

string


( 字符串),


hash


( 哈希),


list


( 列表),


set


( 集合) 及


zset


(有序集合


)。


2:如果是Redis的中高级用户,还有以下几种数据结构:HyperLogLog





Geo





Pub/Sub。还有


Redis Module


,像


BloomFilter





RedisSearch





Redis-ML

四: Redis 支持的 Java 客户端都有哪些?

1:支持的 Java 客户端有 Redisson、jedis、lettuce 等。

五: jedis 和 Redisson 有哪些区别?

1:jedis:提供了比较全面的 Redis 命令的支持。

2:Redisson:实现了分布式和可扩展的 Java 数据结构,与 jedis 相比 Redisson 的功能相对简单,不支持排序、事务、管道、分区等 Redis 特性。

六:怎么保证缓存和数据库数据的一致性?

1:合理设置缓存的过期时间。

2:新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。

七:Redis 持久化有几种方式?

Redis 的持久化有两种方式,或者说有两种策略:

1:RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。

2:AOF(Append Only File):每一个收到的写命令都通过 write 函数追加到文件中。

八:Redis 的持久化机制是什么?各自的优缺点?

Redis 提供两种持久化机制 RDB 和 AOF 机制:


一:RDBRedis DataBase

(持久化方式: 是指用数据集快照的方式半持久化模式)

记录 redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件, 持久化结束后, 用这个临时文件替换上次持久化的 文件, 达到数据恢复。

优点:

1、只有一个文件 dump.rdb, 方便持久化。

2、容灾性好, 一个文件可以保存到安全的磁盘。

3、性能最大化, fork 子进程来完成写操作, 让主进程继续处理命令, 所以是 IO 最大化。使用单独子 进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能)

4、相对于数据集大时, 比 AOF 的启动效率更高。

缺点:

1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障, 会发生数据丢 失。所以这种方式更适合数据要求不严谨的时候)


二:AOFAppend-only fifile

(持久化方式: 是指所有的命令行记录以 redis 命令请求协议的格式完全持久 化存储)保存为 aof 文件。

优点:

1、数据安全, aof 持久化可以配置 appendfsync 属性, 有 always, 每进行一次命令操作就记录到 aof 文件中一次。

2、通过 append 模式写文件, 即使中途服务器宕机, 可以通过 redis-check-aof 工具解决数据一致性 问题。

3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前( 文件过大时会对命令进行合并重写), 可 以删除其中的某些命令( 比如误操作的 flflushall))

缺点:

1、AOF 文件比 RDB 文件大, 且恢复速度慢。

2、数据集大的时候, 比 rdb 启动效率低。

九:Redis 相比其他的key_value缓存产品有三个特点:

1:支持数据的持久化

2:不仅仅支持key_value数据类型,同时还提供 list, set, zset, hash 等数据结构的存储

3:支持数据的备份

十:Redis 优点:

1:速度快,因为存在内存中,类似hashMap,

2:支持丰富的数据类型,支持string,list,set,sorted set,hash

3:支持事务,操作都是原子性

4:丰富的特性,可用于缓存,消息,按key设置过期时间,过期后自动删除


十一:一个字符串类型的值能存储最大容量是多少?

答:512M

十二:Mysql里面有500万数据量,redis只能存20万数据,如何保证redis中的数据都是热点数据?

答:Redis内存数据集大小上升到一定大小的时候,就是实行数据淘汰策略。Redis提供6种数据淘汰策略。

volatile-lru:从已设置过期时间的数据集




server.db[i].expires)中挑选最近最少使用的数据淘汰。


volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。


volatile-random:从已设置过期时间的数据集(


server.db[i].expires


) 中任意选择数据淘汰。

allkeys-lru:从数据集




server.db[i].dict


) 中挑选最近最少使用的数据淘汰。


allkeys-random:从数据库(server.db[i].dist)中任意选择数据淘汰。


no-enviction(驱逐):禁止驱逐数据

十二:为什么Redis 需要把所有数据放到内存中?

答:Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 redis 的性 能。在内存越来越便宜的今天, redis 将会越来越受欢迎。

如果设置了最大使用的内存, 则数据已有记 录数达到内存限值后不能继续插入新值。

十三:Redis 事务

1) 事务是一个单独的隔离操作: 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程 中, 不会被其他客户端发送来的命令请求所打断。

2) 事务是一个原子操作: 事务中的命令要么全部被执行, 要么全部都不执行。

Redis 事务相关的命令有哪几个?答: MULTI、EXEC、DISCARD、WATCH (multi,exec,discare,watch)

MULTI:标记一个事务的开始、

EXEC:执行所有事务块的命令、

DISCARD:放弃事务,放弃执行所有事务块的命令、

WATCH:监控

十四:Redis如何做内存优化?

1:尽量使用散列表( hashes),散列表使用内存小,把相关信息放到散列表里面存储,而不是把每个字段单独存储,这样可以有效减少内存的使用

2:比如Web系统又一个用户对象,不要为用户的用户名,密码,手机号,邮箱设置单独的 key,而是应该把用户的所有信息放到散列表里, 然后再整体存储到Redis中。

十五:Rdis为什么这么快?

1:完全基于内存,绝大部分请求是纯粹的内存操作,非常快速(类似于HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O)

2:数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;

3:采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。(不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;)

4:使用多路 I/O 复用模型,非阻塞 IO;

5:使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

十六:Redis 怎么实现分布式锁?

1:Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。

2:占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁。

十七:Redis 分布式锁有什么缺陷?

1:Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。

十八: Redis 常见的性能问题有哪些?该如何解决?

1:主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以主服务器最好不要写内存快照。

2:Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域网内。

十九:为什么要用 Redis / 为什么要用缓存

主要从“高性能”和“高并发”这两点来看待这个问题。

1:高性能:

假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获

取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

2:高并发:

直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

二十:为什么要用 Redis 而不用 map/guava 做缓存?

1:缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。

2:使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂

二十一:Redis 和 memcache 有什么区别?

1:存储方式不同:memcache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小;Redis 有部份存在硬盘上,这样能保证数据的持久性。

2:数据支持类型:memcache 对数据类型支持相对简单;Redis 有复杂的数据类型。

3:使用底层模型不同:它们之间底层实现方式,以及与客户端之间通信的应用协议不一样,Redis 自己构建了 vm 机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4:value 值大小不同:Redis 最大可以达到 1gb;memcache 只有 1mb。

二十二:Redis 为什么是单线程的?

1:因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。

2:关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表。

二十三:什么是缓存穿透?怎么解决?

1:缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

2:解决方案:最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。



版权声明:本文为u014250663原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。