摘要: 社区最新GA版本Redis 4.0推出已近一年,阿里云数据库Redis 4.0版也上线近半年,之前关于Redis 4.0的系列文章从源码实现来分析这些新功能,本文旨在从用户角度出发,让Redis的用户能够快速了解并使用Redis 4.0带来的福利。
前言
Redis作为时下最火爆的NoSQL数据库以性能强悍、数据结构丰富著称,同时其成长的脚步也从未停止,自诞生伊始已经历多次蜕变不断推出新功能。
社区最新GA版本Redis 4.0推出已近一年,阿里云数据库Redis 4.0版也上线近半年,之前关于Redis 4.0的系列文章从源码实现来分析这些新功能,本文旨在从用户角度出发,让Redis的用户能够快速了解并使用Redis 4.0带来的福利。
Lazyfree
大key删除的问题想必很多用户都遇到过,Redis除string外还支持list、set、hash和sorted set等复杂数据结构,这些数据结构丰富了Redis的用法,但是如果使用不当造成单key体积过大的话就会引起一些问题。
举个简单的例子,假如某社交网站有一个大V,有上百万的粉丝,我们可以用set集合类型的数据结构来存储他的粉丝ID,存储粉丝集合的key叫做funs好了,我们来看下粉丝数:
127.0.0.1:6379> SCARD funs
(integer) 6320505
的确是大V,有600多万的粉丝,但是很不幸的有一天这个大V注销了,这时就要删除他的信息,我们用DEL命令来删除这个key:
- 小插曲:Redis 4.0扩展了slowlog的返回结果,展示了产生慢日志的客户端IP:PORT以便追本溯源。
可以看到删除这个动作居然耗时3秒多,也就意味着这3秒内Redis无法执行其他命令,这对于线上业务来讲是有伤害的,那么如何避免删除大key时的阻塞问题呢?Redis 4.0推出了Lazyfree这一功能,使用UNLINK命令来删除大key,主线程只负责把key从数据库中"摘除",真正的释放动作放在了BIO后台线程去做,我们来看下效果:
可以看到UNLINK执行很快没有产生slowlog。
Lazyfree一共有3个命令:
- UNLINK:异步删除key
- FLUSHDB ASYNC:异步清空当前DB
- FLUSHALL ASYNC:异步清空所有DB
以及4个配置项:
- lazyfree-lazy-expire:异步删除过期key
- lazyfree-lazy-eviction:异步淘汰key
- lazyfree-lazy-server-del:隐式删除时采取异步删除,比如rename a b,若b存在则需删除b
- slave-lazy-flush:全量同步时,slave异步清空所有DB
对于源码实现有兴趣的读者可以阅读《Redis 4.0之Lazyfree》。
Lua脚本支持随机操作
Redis内嵌了Lua环境来支持用户扩展功能,但是出于数据一致性考虑,要求脚本必须是纯函数的形式,也就是说对于一段Lua脚本给定相同的参数,重复执行其结果都是相同的。
为什么要有这个限制呢?原因是Redis不仅仅是单机版的内存数据库,它还支持主从复制和持久化,执行过的Lua脚本会复制给slave以及持久化到磁盘,如果重复执行得到结果不同,那么就会出现内存、磁盘、slave之间的数据不一致,在failover或者重启之后造成数据错乱影响业务。
还是以具体例子来看,假设有这么一段Lua脚本,目的很简单就是想记录下当前时间:
这里使用了Redis的TIME命令来获取时间戳,然后存储到名为now的key中,但是其执行时会报错:
错误提示也很明显,如果执行过非确定性命令(也就是TIME,因为时间是随机的),Redis就不允许执行写命令,以此来保证数据一致性。那如何才能实现随机写入呢?刚才的错误提示也给出了答案,使用redis.replicate_commands(),在执行redis.replicate_commands()之后,Redis就不再是把整个Lua脚本同步给slave和持久化,而是把脚本中调用Redis的写命令直接去做复制,那么slave和持久化也可以得到确定的结果。
脚本修改如下:
再执行就可以实现随机写入了:
基于LFU的热点key发现机制
LFU是Redis 4.0新增的一类内存逐出策略,提供了更精确的内存淘汰算法,其本质是记录了一段时间内key的访问频率,同时也带来了额外的福利就是热点key的发现。
LFU简单来讲就是用0-255来表示key的访问频率,值越大说明访问频率越高,并且这里对频率的计数采用的是基于对数的概率增长,LFU为255可以代表100W次的访问,关于LFU的实现有兴趣的读者可以参考《Redis 4.0之基于LFU的热点key发现机制》。
使用OBJECT FREQ命令即可获取指定key的访问频率,不过需要首先把内存逐出策略设置为allkeys-lfu或者volatile-lfu:
使用scan命令遍历所有key,再通过OBJECT FREQ获取访问频率并排序,即可得到热点key。为了方便用户使用,Redis自带的客户端redis-cli也提供了热点key发现功能,执行redis-cli时加上--hotkeys选项即可,示例如下:
MEMORY内存分析命令
分析内存可以优化Redis的使用方式,全新的MEMORY命令可以帮助用户来实现这一操作。
MEMORY命令一共有5个子命令,可以通过MEMORY HELP来查看:
关于各个子命令的详细使用方式可以参考《Redis 4.0之MEMORY命令详解》。
相关推荐
此资源是Redis的4.0版本,特别针对Windows 64位操作系统进行了编译,相较于常见的3.2版本,它具有更优化的内存管理以及更新的功能特性。 1. **Redis 4.0新特性** - **模块系统**:Redis 4.0引入了模块系统,允许...
redis4.0的配置文件redis.conf
redis4.0中文手册,打包成chm文档。方便查看。本文档是 Redis Command Reference 和 Redis Documentation 的中文翻译版, 阅读这个文档可以帮助你了解 Redis 命令的具体使用方法, 并学会如何使用 Redis 的事务、...
藏经阁-Redis 4.0 解密 Redis 4.0 是 Redis 的一个重要版本,引入了多个新的功能和改进。Redis 4.0 解密旨在解密 Redis 4.0 的新功能和改进,帮助开发者更好地理解和使用 Redis。 Lazyfree Lazyfree 是 Redis ...
该文档是 Redis Command Reference 和 Redis Documentation 的完整中文翻译HTML离线版,包含了Redis4.0的所有命令、Redis 的事务、持久化、复制、Sentinel、集群等。新手最佳入门教程、老手必备参考手册!
标题所揭示的知识点是Redis4.0,而描述部分则指出是2018年数据库直播大讲堂峰会中针对Redis专场的内容,由阿里云的专家仲肥进行介绍。标签“云计算”表明这次讲解可能与云服务环境下的Redis使用相关。文中提到的...
### Redis 4.0.x 集群创建及问题处理 #### 一、集群搭建前提环境—Ruby Redis集群的搭建通常需要依赖于Ruby环境,这是因为集群管理工具往往基于Ruby编写。因此,在开始搭建Redis集群前,需要确保Ruby环境正确安装...
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal...
Redis 4.0 是一个重要的版本更新,它在性能、功能和稳定性方面都有显著提升。以下将详细介绍 Redis 4.0 版本的关键知识点及其在Linux系统中的编译与安装过程。 1. **Redis简介**:Redis是一个开源的、基于内存的...
redis4.0x5.0x-远程命令漏洞利用exp 2019年7月9日版,仅用来学习测试,不可用于非法用途,谢谢配合,实测可用
Redis 4.0 是一款高性能、开源的键值存储系统,常用于数据库、缓存和消息中间件等场景。在Linux环境下,特别是基于C7(CentOS 7)的系统上,安装Redis 4.0通常需要一些依赖包,如GCC(GNU Compiler Collection)用于...
这个压缩包“Redis-windows版4.0.2.2”提供了在Windows平台上运行Redis的资源,版本号为4.0.2.2。安装过程相对简单,只需按照网络上的教程或文档操作即可,同时它支持作为Windows服务来运行。 首先,让我们来看看...
右键解压Redis压缩包,把所有文件解压到指定的redis文件夹中 1.配置redis.windows.conf文件,除了port配置为对应的端口外,其他根据需要可更改的配置项说明如下: (1)bind 127.0.0.1 (line:79) # 设置为其他机器...
在Linux环境下安装Redis 4.0是一个常见的任务,对于开发者和系统管理员来说是必备技能。以下是关于Redis 4.0在Linux上安装及基础操作的详细指南。 1. **下载Redis源码** 首先,你需要从Redis官方网站下载最新的...
安装redis4.0版本所需的所有依赖(亲测可用 1.openssl-1.0.2s.tar 2.zlib-1.2.11.tar 3.rubygems-3.0.6 4.redis-4.1.2.gem 5.ruby-2.6.4.tar.gz
.java访问 redis集群?
Redis-x64-4.0.14.2.msi 、Redis-x64-4.0.zip 存在压缩文件里面 右键解压Redis压缩包,把所有文件解压到指定的redis文件夹中 1.配置redis.windows.conf文件,除了port配置为对应的端口外,其他根据需要可更改的配置...
Java面试题80:java访问redis级redis集群?.mp4
1. 下载源码:首先,访问Redis官方网站或GitHub仓库下载Redis-4.0-rc2的源代码包。 2. 解压源码:使用`tar`命令解压下载的文件,例如`tar -zxvf redis-4.0-rc2.tar.gz`。 3. 配置编译:进入解压后的目录,执行`./...
安装redis4.0版本所需的所有依赖(亲测可用 1.openssl-1.0.2s.tar 2.zlib-1.2.11.tar 3.rubygems-3.0.6 4.redis-4.1.2.gem 5.ruby-2.6.4.tar.gz