关于redis:2022年Redis最新面试题第9篇-Redis运维和部署

33次阅读

共计 3428 个字符,预计需要花费 9 分钟才能阅读完成。

大家好,我是散步 coding, 最近在整顿 2022 年 Redis 最新面试题, 大家也能够通过我上面的博客地址在线浏览, 明天讲讲第 9 篇 – Redis 运维和部署。本文首发于公众号: 散步 coding

2022 年 Redis 最新面试题目录

  • Redis 基础知识
  • Redis 数据结构
  • Redis 事务
  • Redis 数据长久化
  • Redis 集群
  • Redis 淘汰策略
  • Redis 分布式锁
  • Redis 缓存问题
  • 运维和部署
  • 运维和部署

  • Redis 如何设置明码及验证明码?
  • Redis 如何做内存优化?

Redis 如何设置明码及验证明码?

呈现概率: ★★★

redis 没有实现访问控制这个性能,然而它提供了一个轻量级的认证形式,能够编辑 redis.conf 配置来启用认证。

1、初始化 Redis 明码:

在配置文件中有个参数:requirepass 这个就是配置 redis 拜访明码的参数;

比方 requirepass test123;(Ps: 需重启 Redis 能力失效)

redis 的查问速度是十分快的,内部用户一秒内能够尝试多达 150K 个明码;所以明码要尽量长(对于 DBA 没有必要必须记住明码);

2、不重启 Redis 设置明码:

在配置文件中配置 requirepass 的明码(当 redis 重启时明码仍然无效)。

redis 127.0.0.1:6379> config set requirepass test123

查问明码:

redis 127.0.0.1:6379> config get requirepass
(error) ERR operation not permitted

明码验证:

redis 127.0.0.1:6379> auth test123
OK

再次查问:

redis 127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "test123"

PS:如果配置文件中没增加明码 那么 redis 重启后,明码生效;

3、在 Redis 集群中应用认证明码

如果 Redis 服务器,应用了集群。除了在 master 中配置明码外,也须要在 slave 中进行相应配置。在 slave 的配置文件中找到如下行,去掉正文并批改与 master 雷同的明码即可:

# masterauth master-password

Redis 如何做内存优化?

呈现概率: ★★★

在思考如何做内存优化之前, 咱们先看看 redisObject 对象的构造

  • type 代表数据类型,比方 list, set, hash, 因为一共是 4 bits, 所以 redis 最多能反对 16 种
  • encoding 代表底层编码类型,比方 ziplist, intset, EMBSTR, raw 等等
  • refcount 援用计数,对象创立时为 1, 当值为 0 时开释
  • ptr 指向实在数据,尽管是个指针,但有时为了高效应用内存,间接存储整型

对象有如下个性:

  • redis 在执行命令之前,依据对象的类型就能够判断命令是否能够执行。
  • 依靠对象,能够针对不同的应用场景,为对象设置不同的数据结构实现,从而优化对象在不同场景下的应用效率。
  • redis 对象零碎实现了基于援用计数技术的内存回收机制,当程序不再应用某个对象的时候,这个对象所占用的内存就会被主动开释。
  • redis 应用援用计数技术实现了对象共享机制,肯定场景下,能够通过让多个数据库键共享同一个对象来节约内存。
  • redis 对象带有拜访工夫记录,能够用来计算数据库键的空转工夫,在服务器启用 maxmemory 的状况下,空转时长较大的键可能被优先删除。

1、缩减键值对象

缩减键(key)和值(value)的长度

key 长度:如在设计键时,在残缺形容业务状况下,键值越短越好。
value 长度:值对象缩减比较复杂,常见需要是把业务对象序列化成二进制数组放入 Redis。

相似如果想在 Redis 存用户的简介:

这样如果一个用户的

{gender: 'male', name: '散步 coding'} 

能够做一些映射

keyMap = {
  'gender': 'a'
  'sex': 'b',
  ...
  'profile': 'a1',
  'name': 'b1',
}

存在 redis 映射后就是

{'a': 'male', 'b1': '散步 coding'}

同时也能够对 female, male 这些枚举值做一次映射。

同时值对象除了存储二进制数据之外,通常还会应用通用格局存储数据比方:json,xml 等作为字符串存储在 Redis 中。这种形式长处是不便调试和跨语言,然而同样的数据相比字节数组所需的空间更大,在内存缓和的状况下,能够应用通用压缩算法压缩 json,xml 后再存入 Redis,从而升高内存占用,例如应用 GZIP 压缩后的 json 可升高约 60% 的空间。

2、共享对象池

对象共享池指 Redis 外部保护 [0-9999] 的整数对象池。创立大量的整数类型 redisObject 存在内存开销,每个 redisObject 内部结构至多占 16 字节,甚至超过了整数本身空间耗费。所以 Redis 内存保护一个 [0-9999] 的整数对象池,用于节约内存。除了整数值对象,其余类型如 list,hash,set,zset 外部元素也能够应用整数对象池。因而开发中在满足需要的前提下,尽量应用整数对象以节俭内存。

 127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> object refcount a
(integer) 2147483647
127.0.0.1:6379> set b 1
OK
127.0.0.1:6379> object refcount b
(integer) 2147483647
127.0.0.1:6379> set c 10000
OK
127.0.0.1:6379> object refcount c
(integer) 1
127.0.0.1:6379>

object refcount bobject refcount a为什么是 2147483647, 查看源码,发现新版本的 redis 中 OBJ\_SHARED\_INTEGERS 变量定义了共享整数 10000(0-9999),并且定义不被销毁的全局对象的援用数量 OBJ\_SHARED\_REFCOUNT 为 INT\_MAX,INT\_MAX = 2^31 – 1 =2147483647。

然而如果对象超出 9999 范畴等于 10000 的时候,比方 object refcount c 返回的是 (integer) 1,就不会应用对象内存。另外,这些共享对象不单单只有字符串键能够应用,那些在数据结构中嵌套了字符串对象的对象(linkedlist 编码的列表对象、hashtable 编码的哈希对象、hashtable 编码的汇合对象、以及 zset 编码的有序汇合对象)都能够应用这些共享对象。

为什么 Redis 不共享蕴含字符串的对象?

redis 之所以只能应用数字共享,因为数字的复用概率最大,其次就是对于应用对象共享的关键问题就是判断相等性,只有在共享对象和指标对象齐全相等的状况下,redis 才会应用共享对象。数字的比拟算法复杂度是 o (1),如果判断的是字符串,那么比拟的复杂度是 o (n),特地是长字符串更耗费性能。对于更简单的数据结构,比方 hash、list 等,相等比拟复杂度须要 o (n ^ 2)。对于单线程的 reids 来说,这显然不合理。其中只保留 10000 个对象共享也是避免对象池节约。

3、字符串优化

Redis 本身实现的字符串构造有如下特点:

  • O(1)工夫复杂度获取:字符串长度,已用长度,未用长度。
  • 可用于保留字节数组,反对平安的二进制数据存储。
  • 外部实现空间预分配机制,升高内存再调配次数。
  • 惰性删除机制,字符串缩减后的空间不开释,作为预调配空间保留。

在高并发写入场景中,条件容许的状况下倡议字符串长度管制在 39 字节以内,缩小创立 redisObject 内存调配次数从而进步性能。

4、管制 key 的数量

当应用 Redis 存储大量数据时,通常会存在大量键,过多的键同样会耗费大量内存。Redis 实质是一个数据结构服务器,它为咱们提供多种数据结构,如 hash,list,set,zset 等构造。应用 Redis 时不要进入一个误区,大量应用 get/set 这样的 API,把 Redis 当成 Memcached 应用。对于存储雷同的数据内容利用 Redis 的数据结构升高外层键的数量,也能够节俭大量内存。如下图所示,通过在客户端预估键规模,把大量键分组映射到多个 hash 构造中升高键的数量。

也欢送关注我的公众号: 散步 coding。一起交换, 在 coding 的世界里散步, 回复: redis, 收费获取最新 Redis 面试题(含答案)。

正文完
 0