目 录CONTENT

文章目录

redis基础

简中仙
2023-01-31 / 0 评论 / 0 点赞 / 71 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2023-10-08,若内容或图片失效,请留言反馈。 本文如有错误或者侵权的地方,欢迎您批评指正!

一、Redis基础

1、 Redis介绍

官网:https://redis.io/

(1)Redis是一个key-value存储系统。是我们目前大规模使用的缓存中间件。和Memeached类似,它支持存储的value类型相对更多,包括string (字符串)、list(列表)、 set (集合)、zset (sortedset--有序集合)和hash (哈希类型)、字典Hash。与memcached一样,为了保证效率,数据都是缓存在内存中。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便。

(2)众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候直接从内存取,极大的提高了速度和节约了服务器的开销。

(3)可以把它作为数据库,缓存和消息中间件来使用

(4)哨兵(Sentinel)和复制(Replication)

Redis服务器毫无征兆的罢工是个麻烦事。那么怎么办?答曰:备份一台,你挂了它上。那么如何得知某一台Redis服务器挂了,如何切换,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要Sentinel和Replication出场了。 Sentinel可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能;Replication则是负责让一个Redis服务器可以配备多个备份的服务器。Redis也是利用这两个功能来保证Redis的高可用的。此外,Sentinel功能则是对Redis的发布和订阅功能的一个利用。

(5)单个value限制是1GB, memcached为1M数据

2、与memcache 的区别

(1)和memcached一样,为了保证效率,数据都是缓存在内存中

(2) Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

(3) Redis支持数据的备份,即master-slave模式的数据备份。

(4) Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用

(5)在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。 Redis只会缓存所有的key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作

(6)网络IO模型:Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程。

Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架

(7)内存管理方面:Memcached使用预分配的内存池的方式,,Redis使用现场申请内存的方式来存储数据

(8)Redis是一个非关系型的数据库;memcache是一个纯缓存和键值数据库

3、如何保持session会话

在集群系统下实现session统一的有如下几种方案:

(1)请求精确定位:sessionsticky,例如基于访问ip的hash策略,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机则等同于单点部署,会丢失,会话不复制。

(2) session复制共享:sessionreplication,如tomcat自带session共享,主要是指集群环境下多台应用服务器之间同步session,使session保持一致,对外透明。如果其中一台服务器发生故障,根据负载均衡的原理,调度器会遍历寻找可用节点,分发请求,由于ssion已同步,故能保证用户的session信息不会丢失,会话复制。此方案的不足之处:必须在同一种中间件之间完成(如:tomcat-tomcat之间)。

(3)基于cache DB缓存的session共享:即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cacheDB中,当应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不在本机内存时,则去cacheDB中查找,如果找到则复制到本机,这样实现session共享和高可用。

4、Redis 有哪些适合的场景?

(1)会话缓存(Session Cache)

最常用的一种使用 Redis 的情景是会话缓存(sessioncache),用 Redis 缓存会话比其他存储(如Memcached)的优势在于:Redis 提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗? 幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用 Redis 来缓存会话的文档。甚至广为人知的商业平台 Magento 也提供 Redis 的插件。

(2)全页缓存(FPC)

除基本的会话 token 之外,Redis 还提供很简便的 FPC 平台。回到一致性问题,即使重启了 Redis 实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似 PHP 本地FPC。

再次以 Magento 为例,Magento 提供一个插件来使用 Redis 作为全页缓存后端。 此外,对 WordPress 的用户来说,Pantheon 有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

(3)队列

Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis 能作为一个很好的消息队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言(如 Python)对 list 的 push/pop 操作。

如果你快速的在 Google 中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用 Redis 创建非常好的后端工具,以满足各种队列需求。例如,Celery 有一个后台就是使用Redis 作为 broker,你可以从这里去查看。

(4)排行榜/计数器

Redis 在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。

所以,我们要从排序集合中获取到排名最靠前的 10 个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到。

(5)发布/订阅

最后(但肯定不是最不重要的)是 Redis 的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用 Redis 的发布/订阅功能来建立聊天系统!

二、Redis主流版本对比

1、Redis 5.0 版本介绍

Redis 5.0(2018 年 10 月正式发布)引入了新的流数据类型、排序集阻塞弹出操作、RDB 中的 LFU/LRU 信息、redis-cli 中的集群管理器、主动碎片整理 V2、更好的 HyperLogLogs 以及许多其他改进。

  • 新的Stream数据类型。

  • 新的 Redis 模块 API:Timers、Cluster 和 Dictionary API。

  • RDB现在存储LFU和LRU信息。

  • 集群管理器从Ruby(Redis-trib.rb)移植到C代码,在 Redis-cli 里面。查看 Redis-cli --cluster help 了解更多信息。

  • 新的排序集命令:ZPOPMIN/MAX 和阻塞变体。

  • 主动碎片整理版本2。

  • HyperLogLog 实现中的改进。

  • 更好的内存报告功能。

  • 许多带有子命令的命令现在都有一个 HELP 子命令。

  • 当客户端经常连接和断开连接时性能更好。

  • 许多错误修复和其他随机改进。

  • Jemalloc升级到5.1版本

  • 客户端解锁和客户端 ID。

  • 增加了LOLWUT命令。

  • 如果不是为了 API 向后兼容,我们不再使用“从”这个词。

  • 网络层的Differnet优化。

  • Lua 改进:

    • 更好地将 Lua 脚本传播到从站/AOF。

    • Lua 脚本现在可以超时并在从站中进入 -BUSY 状态。

  • 动态 HZ 以平衡空闲 CPU 使用率和响应能力。

  • 对Redis内核进行了多方面的重构和改进。

2、Redis 6.0 版本介绍

Redis 6.0(2021 年 10 月正式发布)引入了 SSL、新的 RESP3 协议、ACL、客户端缓存、无盘副本、I/O 线程、更快的 RDB 加载、新模块 API 以及更多改进。

  • 模块系统现在有许多新的 API,允许模块作者使过去不可能的事情成为可能。有可能在 RDB 文件中存储任意模块私有数据,以挂接不同的服务器事件,捕获和重写命令执行,阻止客户端钥匙等等。
  • Redis 活动过期周期被重写以更快地驱逐键已经过期了。现在努力是可调的。
  • Redis 现在支持所有渠道的 SSL。
  • ACL 支持,您可以定义只能运行某些命令和/或只能访问某些键模式。
  • Redis 现在支持一种称为 RESP3 的新协议,它返回更多语义回复:使用此协议的新客户只能理解从回复什么类型返回到调用程序。
  • 服务器端支持键值的客户端缓存。这个功能仍处于试验阶段,将在接下来的时间里进行更多更改发布候选人,但你已经可以测试它并在这里阅读它:https://Redis.io/topics/client-side-caching
  • Redis 现在可以选择使用线程来处理 I/O,允许服务单个实例每秒操作数的 2 倍不能使用流水线。
  • 现在甚至在副本上也支持无盘复制:现在有一个副本能够,在特定条件下用户可以配置,加载 RDB在第一次同步时直接从socket到内存。
  • Redis-benchmark 现在支持 Redis 集群模式。
  • SRANDMEMBER 和类似的命令有更好的分布。
  • Redis-cli 改进。
  • Systemd 支持重写。
  • 这里发布了一个 Redis Cluster 代理:https://github.com/artix75/Redis-cluster-proxy
  • 此处发布了用于 Redis 的 Disque 模块:https://github.com/antirez/disque-module

3、Redis 6.2 版本介绍

Redis 6.2 包含许多新命令和改进。Redis 6.2 改进了Redis 的完备性,解决了很多用户经常或长时间要求的问题。

1、新命令/参数

  • 添加检查多个成员的 SMISMEMBER 命令
  • 添加返回分数数组的 ZMSCORE 命令
  • 添加任意弹出和推送的 LMOVE 和 BLMOVE 命令
  • 添加重置客户端连接状态的 RESET 命令
  • 添加复制密钥的 COPY 命令
  • 添加 ZDIFF 和 ZDIFFSTORE 命令
  • 添加 ZINTER 和 ZUNION 命令
  • 为边界框空间查询添加 GEOSEARCH/GEOSEARCHSTORE 命令
  • 为 SET 命令添加 GET 参数,以获得更强大的 GETSET
  • 为 XPENDING 添加独占范围查询
  • X[REV]RANGE 添加独占范围查询
  • 将 GT 和 LT 选项添加到 ZADD 以进行条件分数更新
  • 为特定 ID 添加客户信息和客户列表
  • 为 XPENDING 命令添加 IDLE 参数
  • 将本地地址添加到 CLIENT LIST,以及一个 CLIENT KILL 过滤器
  • 添加 NOMKSTREAM 选项到 XADD 命令
  • 向 Sentinel 添加命令自省
  • 添加 SENTINEL MYID 子命令

2、新功能

  • 转储有效载荷清理:防止损坏的有效载荷导致崩溃,具有启用完整 O(N) 验证的标志(默认情况下禁用)。
  • Pub/Sub 频道的 ACL 模式
  • 支持 Sentinel 模式的 ACL
  • 支持同时从标准输入和文件获取配置,让您避免在磁盘上存储秘密。

3、CLI 工具的新特性

  • redis-cli RESP3 推送支持
  • redis-cli 集群导入支持需要身份验证的源和目标
  • redis-cli URI 能够提供用户名和密码
  • redis-cli/redis-benchmark 允许指定首选密码/密码套件
  • redis-cli 添加 -e 选项以在命令执行失败时使用代码退出

4、命令行为更改

  • EXISTS 不应改变 LRU,在 Redis 5.0 和 6.0 中,它会触及键的 LRU/LFU。
  • OBJECT 不应显示逻辑上过期的密钥,现在将表现出相同的 TYPE 或任何其他非 DEBUG 命令。
  • 改进 SELECT 和 MOVE 的 db id 范围检查,更改错误数据库索引上的错误消息文本。
  • 修改 AUTH / HELLO 错误信息,当用户未找到或被禁用时更改错误消息文本。
  • BITOPS 长度限制为 proto_max_bulk_len 而不是 512MB,该限制现在可以像在 SETRANGE 和 APPEND 中一样进行配置。
  • 如果 Redis 超过内存限制,GEORADIUS[BYMEMBER] 可能会失败并显示 -OOM

5、其他行为变化

  • 可选(默认)如果请求的绑定地址不可用则无法启动,如果依赖 Redis 启动成功即使其中一个绑定地址不可用,您需要调整新配置。

  • 限制主数据库字典扩展以防止键驱逐,在过去,大字典重新散列可能会导致大量数据被驱逐。现在这个重新散列被延迟(达到一个限制),这可能会导致性能哈希冲突造成的损失。

  • CONFIG REWRITE 是原子的且更安全,但需要对配置文件的文件夹进行写访问,此更改已存在于 6.0.17 中,但在发行版中缺失笔记。

  • 一种新的增量驱逐机制,可减少驱逐尖峰的延迟,在病理情况下,这会导致记忆力不受控制地增长,并且可能需要具体调整。

  • 当使用命令行参数启动 Redis 时,不重置“保存”配置。如果您提供没有“保存”的命令行参数并依靠它被禁用,现在默认的“保存”配置将启动。

  • 在加载期间更新 INFO 的内存指标

  • 当启用“监督”配置时,它优先于“守护进程”。

  • 断言和恐慌,打印崩溃日志而不生成 SIGSEGV

  • 添加了关于 SIGABRT 的崩溃日志报告,而不是静默退出

  • 如果启用则禁用 THP(透明大页面),如果您故意启用它,则需要配置 Redis 以保留它。

4、Redis 7.0 版本介绍(稳定版)

Redis 7.0 包括几个面向用户的新功能、重要的性能优化和许多其他改进。它还包括可能破坏与旧版本的向后兼容性的更改。

1、新功能

  • Redis 函数:一种使用服务器端脚本扩展 Redis 的新方法
  • ACL:基于密钥的细粒度权限,允许用户支持多个带选择器的命令规则集
  • 集群:分片(节点特定)发布/订阅支持
  • 在大多数情况下对子命令的一流处理(影响 ACL类别、信息命令统计等)
  • 命令元数据和文档
  • 命令键规范。一种更好的方式让客户找到关键论点和他们的意见读/写用途
  • 避免 AOF 重写开销的多部分 AOF 机制
  • 集群:支持主机名,而不仅仅是 IP 地址
  • 改进了对网络缓冲区消耗的内存的管理,以及一个选项当总内存超过限制时删除客户端
  • Cluster:一种断开集群总线连接的机制,以防止不受控制的缓冲区增长
  • AOF:时间戳注释和对时间点恢复的支持
  • Lua:支持 EVAL 脚本中的函数标志
  • Lua: 支持 Verbatim 和 Big-Number 类型的 RESP3 回复
  • Lua: 通过 redis.REDIS_VERSION, redis.REDIS_VERSION_NUM 获取 Redis 版本

2、新的用户命令或命令参数

  • ZMPOP、BZMPOP 命令
  • LMPOP, BLMPOP 命令
  • SINTERCARD、ZINTERCARD 命令
  • 发布、SSUBSCRIBE、SUNSUBSCRIBE、PUBSUB SHARDCHANNELS/SHARDNUMSUB
  • EXPIRETIME 和 PEXPIRETIME 命令
  • EXPIRE 命令组支持 NX/XX/GT/LT 选项
  • SET 命令支持组合 NX 和 GET 标志
  • BITPOS, BITCOUNT 接受 BIT 索引
  • EVAL_RO、EVALSHA_RO 命令变体,在只读副本上运行
  • SORT_RO 命令,在只读副本上运行
  • 关机参数:现在,强制,中止
  • 功能 *、FCALL、FCALL_RO - https://redis.io/commands/function-load
  • CONFIG SET/GET 可以在一次调用中自动处理多个配置
  • QUIT 提升为正确的命令,HOST: 和 POST 降级
  • XADD 通过 -* 支持自动序列号

3、安全改进

  • 默认情况下阻止(保护)敏感配置和命令
  • 改进绑定和保护模式配置处理
  • Sentinel:避免记录 auth-pass 值
  • redis-cli:敏感命令绕过历史文件

三、Redis安装部署

1、yum安装

centos7默认安装版本为3.2.12(不推荐)

# yum install epel-release -y
# yum install redis -y
# systemctl start redis
# systemctl status redis 						# 查看服务状态
# systemctl stop redis 							# 停止服务
# systemctl restart redis 						# 重启服务
# ps -ef | grep redis 							# 查看reids服务信息
# systemctl enable redis redis					# 开机启动

2、源码安装

由于centos默认的gcc版本是gcc4.8.5,版本比较低,而Redis6以上版本要求必须在5.0以上。所以我们需要将gcc升级到高版本

1、安装高版本gcc

yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
source /etc/profile

2、配置系统环境

1、Redis建议Linux 内核过载内存设置为1,是为了让fork能够在低内存下也执行成功。

echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1

2、禁用透明大页功能

确保 Linux 内核功能透明大页面不会影响 Redis 内存使用量和延迟

临时禁用(不需要重启,立即生效)

echo never > /sys/kernel/mm/transparent_hugepage/enabled

永久禁用(需要重启,重启生效)

# yum -y install tuned
# vim /usr/lib/tuned/virtual-guest/tuned.conf
[vm]
transparent_hugepage=never

3、编译安装

# mkdir -p /data/soft
# mkdir -p /opt/redis/{conf,logs,pid}
# cd /data/soft
# wget https://download.redis.io/releases/redis-6.0.17.tar.gz
# tar xf redis-6.0.17.tar.gz -C /opt/
# ln -s /opt/redis-6.0.17  /opt/redis
# cd /opt/redis/
# make && make PREFIX=/opt/redis install

4、添加redis为系统服务

vim /usr/lib/systemd/system/redis.service
[Unit]
Description=redis-server
After=network.target

[Service]
Type=forking
#redis-server安装的路径 和 redis.conf配置文件的路径(根据自己安装的情况来填写绝对路径)
ExecStart=/opt/redis/bin/redis-server /opt/redis/conf/redis.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target
# systemctl enable redis

3、docker-compose安装

version: '3.8'
services:
  redis:
    container_name: redis
    image: redis:6.0.17
    restart: always
    ports:
      - 6379:6379
    privileged: true
    command: redis-server /etc/redis/redis.conf --appendonly yes
    volumes:
      - $PWD/data:/data
      - $PWD/conf/redis.conf:/etc/redis/redis.conf

说明:redis开启appendonly yes后需要在redis.conf配置中使用requirepass xxxxxxxx设置密码

0

评论区