Redis 4.0的了解以及使用

Redis作为时下最火爆的NoSQL数据库以性能强悍、数据结构丰富著称,同时其成长的脚步也从未停止,自诞生伊始已经历多次蜕变不断推出新功能。

Lazyfree

大key删除的问题想必很多用户都遇到过,Redis除string外还支持list、set、hash和sorted set等复杂数据结构,这些数据结构丰富了Redis的用法,但是如果使用不当造成单key体积过大的话就会引起一些问题。

举个简单的例子,假如某社交网站有一个大V,有上百万的粉丝,我们可以用set集合类型的数据结构来存储他的粉丝ID,存储粉丝集合的key叫做funs好了,我们来看下粉丝数:

的确是大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个命令:

  1. UNLINK:异步删除key
  2. FLUSHDB ASYNC:异步清空当前DB
  3. FLUSHALL ASYNC:异步清空所有DB

以及4个配置项:

  1. lazyfree-lazy-expire:异步删除过期key
  2. lazyfree-lazy-eviction:异步淘汰key
  3. lazyfree-lazy-server-del:隐式删除时采取异步删除,比如rename a b,若b存在则需删除b
  4. slave-lazy-flush:全量同步时,slave异步清空所有DB

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次的访问。

使用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来查看:

关于各个子命令的详细使用方式可以参考:https://redis.io/commands

点击这里查看Redis 4.0 Release Note资源链接:https://github.com/antirez/redis/blob/4.0-rc1/00-RELEASENOTES

原文发布于微信公众号 - 大数据和云计算技术(jiezhu2007)

原文发表时间:2018-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏EAWorld

8种至关重要OAuth API授权流与能力

在本文中,Curity的Daniel Lindau概述了重要的OAuth授权流程和能力。

771
来自专栏铭毅天下

干货 |《深入理解Elasticsearch》读书笔记

题记 由于之前已经梳理过Elasticsearch基础概念且在项目中实战过Elasticsearch的增删改查、聚类、排序等相关操作,对ES算是有了一定的认知...

5386
来自专栏前端正义联盟

梳理前端开发使用 eslint 和 prettier 来检查和格式化代码问题

6173
来自专栏友弟技术工作室

Linux集群系列之一——集群基础概念

集群 场景一 LAMP http,web object简单无状态连接 200,50dynamic prefork,2M ...

3538
来自专栏WeTest质量开放平台团队的专栏

Linker加载so失败问题分析

原文链接:https://wetest.qq.com/lab/view/421.html

1381
来自专栏顶级程序员

硬盘数据恢复的十大神器

因为众所周知的原因:硬盘总是坏!但是嘛,其实硬盘数据恢复也是那么难,一起来看看! 在一切工作进行之前,请先判断硬盘是否有损坏,以及缺损类型,而往往硬盘出现问题...

4516
来自专栏月色的自留地

七牛对象存储的使用

4164
来自专栏用户画像

Struts工作机制?为什么要使用Struts?

5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。

671
来自专栏CSDN技术头条

Redis错误配置详解

Redis提供了许多提高和维护高效内存数据库使用的工具。在无需额外配置应用层的前提下,Redis独特的数据类型、指令和命令调优就可以满足应用的需求,但是错误的配...

21910
来自专栏java学习

针对java初学者以及自学者的一篇入门教程

Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 最新通知 按照我去培训机构的学习经历,给初学还有自学Java 的同学一个基本的学习...

4339

扫码关注云+社区

领取腾讯云代金券