欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Redis】相关的面试问题

程序员文章站 2022-07-01 19:56:04
...

1.什么是Redis?

一款高性能的key-value缓存数据库。

优势:一款基于内存的key-value数据库,整个数据库都在内存中运行操作,每秒可以支持10W左右的读写操作,而且支持数据持久化,还可以支持多种数据结构。

缺点:容量受到物理内存的限制。不能做海量数据的高性能读写。适合较少数据的高性能读写。

Redis的数据类型及底层数据结构

二、数据类型

数据类型 可以存储的值 操作
STRING 字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作
对整数和浮点数执行自增或者自减操作
LIST 列表 从两端压入或者弹出元素
对单个或者多个元素
进行修剪,只保留一个范围内的元素
SET 无序集合 添加、获取、移除单个元素
检查一个元素是否存在于集合中
计算交集、并集、差集
从集合里面随机获取元素
HASH 包含键值对的无序散列表 添加、获取、移除单个键值对
获取所有键值对
检查某个键是否存在
ZSET 有序集合 添加、获取、删除元素
根据分值范围或者成员来获取元素
计算一个键的排名

STRING

【Redis】相关的面试问题

 

> set hello world
OK
> get hello
"world"
> del hello
(integer) 1
> get hello
(nil)

LIST

【Redis】相关的面试问题

Redis列表是简单的字符串列表,可以类比到C++中的std::list,简单的说就是一个链表或者说是一个队列。可以从头部或尾部向Redis列表添加元素。列表的最大长度为2^32 - 1,也即每个列表支持超过40亿个元素。

Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

List 数据结构,lpush为头,rpush为尾。左头右尾。

lrang key start end 表示显示 从start 到end 范围内所有元素。

lindex key index 显示某一个index的元素 (index从0开始)

> rpush list-key item
(integer) 1
> rpush list-key item2
(integer) 2
> rpush list-key item
(integer) 3

> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"

> lindex list-key 1
"item2"

> lpop list-key
"item"

> lrange list-key 0 -1
1) "item2"
2) "item"

SET

【Redis】相关的面试问题

  • 可以理解为一堆值不重复的列表,类似数学领域中的集合概念,且Redis也提供了针对集合的求交集、并集、差集等操作。
  • set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

包含几个重要功能:

sadd key value 添加元素

srem key value 删除元素

sismember key value 检查是否存在,存在返回1 不存在返回0

smembers key 显示所有元素。

> sadd set-key item
(integer) 1
> sadd set-key item2
(integer) 1
> sadd set-key item3
(integer) 1
> sadd set-key item
(integer) 0

> smembers set-key
1) "item"
2) "item2"
3) "item3"

> sismember set-key item4
(integer) 0
> sismember set-key item
(integer) 1

> srem set-key item2
(integer) 1
> srem set-key item2
(integer) 0

> smembers set-key
1) "item"
2) "item3"

HASH

【Redis】相关的面试问题

  • Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
HASH


> hset hash-key sub-key1 value1
(integer) 1
> hset hash-key sub-key2 value2
(integer) 1
> hset hash-key sub-key1 value1
(integer) 0

> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"

> hdel hash-key sub-key2
(integer) 1
> hdel hash-key sub-key2
(integer) 0

> hget hash-key sub-key1
"value1"

> hgetall hash-key
1) "sub-key1"
2) "value1"
ZSET

ZSET

【Redis】相关的面试问题

  • Redis有序集合类似Redis集合,不同的是增加了一个功能,即集合是有序的。一个有序集合的每个成员带有分数,用于进行排序。
  • Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,无论里面包含的元素集合的数量)。列表的最大长度为2^32- 1元素(4294967295,超过40亿每个元素的集合)。
  • Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
  • 使用场景

  • Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
  • 又比如用户的积分排行榜需求就可以通过有序集合实现。还有上面介绍的使用List实现轻量级的消息队列,其实也可以通过Sorted Set实现有优先级或按权重的队列。

相关命令

 

> zadd zset-key 728 member1
(integer) 1
> zadd zset-key 982 member0
(integer) 1
> zadd zset-key 982 member0
(integer) 0

> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"

> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"

> zrem zset-key member1
(integer) 1
> zrem zset-key member1
(integer) 0

> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"

Redis底层数据结构

转自:http://www.cnblogs.com/jaycekon/p/6227442.html

          https://www.cnblogs.com/jaycekon/p/6277653.html

 

Redis 底层数据结构有一下数据类型:

    1.  简单动态字符串
    2.    链表
    3.    字典
    4.    跳跃表
    5.    整数集合
    6.    压缩列表
    7.    对象

2.Redis 和memcache 的区别:

第一:数据类型:Redis支持五种数据类型。String ,list,set,sorted set ,hash。

String 的操作: get set ,keys *...

list:Lpush, Lpop .

hash : hset key field value. hget 

set: sadd , spop 

sorted set( zset): zadd 

第二:Redis支持持久化。memcache 不支持持久化,一旦断电,数据丢失。

第三:Redis 速度快于memcache.

 

3.Redis 持久化方式

1.快照方式

默认的持久化方式,Redis默认将数据快照的二进制文件写入磁盘中,文件名叫做dumps.rdb。

可以设置N秒操作几次后快照持久化一次,或者调用save命令。

原理:1.redis fork一个子进程  2.子进程将数据写入到临时rdb 文件中 3 写完后用新文件代替老文件 4 copy and write

缺点:当在两次快照执行期间丢失数据,将不会被记录,这也是快照的缺点。

2.AOF 方式(append only)

记录指令日志的方式。,将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部。保存在硬盘上

优势:1.灵活设置持久化时间,若将持久化时间间隔为1s,那么最多丢失1s的数据。

2.支持日志重写和修复。

缺点:文件要比RDB大许多,恢复速度慢。

AOF默认关闭,开启方法,修改配置文件reds.conf:appendonly yes

 

Redis是单线程的

redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销

 

(7)分布式

redis支持主从的模式。原则:Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。

这是一个典型的分布式读写分离模型。我们可以利用master来插入数据,slave提供检索服务。这样可以有效减少单个机器的并发访问数量

(8)读写分离模型

通过增加Slave DB的数量,读的性能可以线性增长。为了避免Master DB的单点故障,集群一般都会采用两台Master DB做双机热备,所以整个集群的读和写的可用性都非常高。
读写分离架构的缺陷在于,不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力还是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。

 

                                                                 

(9)数据分片模型

为了解决读写分离模型的缺陷,可以将数据分片模型应用进来。

可以将每个节点看成都是独立的master,然后通过业务实现数据分片。

结合上面两种模型,可以将每个master设计成由一个master和多个slave组成的模型。