Why Redis 4.0?

摘要: 社区最新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:

127.0.0.1:6379> DEL funs
(integer) 1
(3.11s)
127.0.0.1:6379> slowlog get
1) 1) (integer) 42) (integer) 15281699233) (integer) 31048124) 1) "DEL"2) "funs"5) "127.0.0.1:48398"6) ""
  • 小插曲:Redis 4.0扩展了slowlog的返回结果,展示了产生慢日志的客户端IP:PORT以便追本溯源。

可以看到删除这个动作居然耗时3秒多,也就意味着这3秒内Redis无法执行其他命令,这对于线上业务来讲是有伤害的,那么如何避免删除大key时的阻塞问题呢?Redis 4.0推出了Lazyfree这一功能,使用UNLINK命令来删除大key,主线程只负责把key从数据库中"摘除",真正的释放动作放在了BIO后台线程去做,我们来看下效果:

127.0.0.1:6379> UNLINK funs
(integer) 1
(3.11s)
127.0.0.1:6379> slowlog get
(empty list or set)

可以看到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

对于源码实现有兴趣的读者可以阅读《Redis 4.0之Lazyfree》。

Lua脚本支持随机操作

Redis内嵌了Lua环境来支持用户扩展功能,但是出于数据一致性考虑,要求脚本必须是纯函数的形式,也就是说对于一段Lua脚本给定相同的参数,重复执行其结果都是相同的。

为什么要有这个限制呢?原因是Redis不仅仅是单机版的内存数据库,它还支持主从复制和持久化,执行过的Lua脚本会复制给slave以及持久化到磁盘,如果重复执行得到结果不同,那么就会出现内存、磁盘、slave之间的数据不一致,在failover或者重启之后造成数据错乱影响业务。

还是以具体例子来看,假设有这么一段Lua脚本,目的很简单就是想记录下当前时间:

local now = redis.call('time')[1]redis.call('set','now',now)return redis.call('get','now')

这里使用了Redis的TIME命令来获取时间戳,然后存储到名为now的key中,但是其执行时会报错:

$redis-cli --eval escript
(error) ERR Error running script (call to f_cfba5ec6a699dad183456f19d1099d8dabfdb80c): 
@user_script:3: @user_script: 3: Write commands not allowed after non deterministic commands. 
Call redis.replicate_commands() at the start of your script in order to switch to single commands replication mode.

错误提示也很明显,如果执行过非确定性命令(也就是TIME,因为时间是随机的),Redis就不允许执行写命令,以此来保证数据一致性。那如何才能实现随机写入呢?刚才的错误提示也给出了答案,使用redis.replicate_commands(),在执行redis.replicate_commands()之后,Redis就不再是把整个Lua脚本同步给slave和持久化,而是把脚本中调用Redis的写命令直接去做复制,那么slave和持久化也可以得到确定的结果。

脚本修改如下:

redis.replicate_commands()local now = redis.call('time')[1]redis.call('set','now',now)return redis.call('get','now')

再执行就可以实现随机写入了:

$redis-cli --eval escript
"1528191578"$redis-cli --eval escript
"1528191804"

基于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:

127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379> object freq counter:000000006889
(error) ERR An LFU maxmemory policy is not selected, access frequency not tracked. Please note that when switching between policies at runtime LRU and LFU data will take some time to adjust.127.0.0.1:6379> config set maxmemory-policy allkeys-lfu
OK
127.0.0.1:6379> object freq counter:000000006889
(integer) 3

使用scan命令遍历所有key,再通过OBJECT FREQ获取访问频率并排序,即可得到热点key。为了方便用户使用,Redis自带的客户端redis-cli也提供了热点key发现功能,执行redis-cli时加上--hotkeys选项即可,示例如下:

$./redis-cli --hotkeys# Scanning the entire keyspace to find hot keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).[00.00%] Hot key 'counter:000000000002' found so far with counter 87
[00.00%] Hot key 'key:000000000001' found so far with counter 254
[00.00%] Hot key 'mylist' found so far with counter 107
[00.00%] Hot key 'key:000000000000' found so far with counter 254
[45.45%] Hot key 'counter:000000000001' found so far with counter 87
[45.45%] Hot key 'key:000000000002' found so far with counter 254
[45.45%] Hot key 'myset' found so far with counter 64
[45.45%] Hot key 'counter:000000000000' found so far with counter 93-------- summary -------Sampled 22 keys in the keyspace!
hot key found with counter: 254    keyname: key:000000000001
hot key found with counter: 254    keyname: key:000000000000
hot key found with counter: 254    keyname: key:000000000002
hot key found with counter: 107    keyname: mylist
hot key found with counter: 93    keyname: counter:000000000000
hot key found with counter: 87    keyname: counter:000000000002
hot key found with counter: 87    keyname: counter:000000000001
hot key found with counter: 64    keyname: myset

MEMORY内存分析命令

分析内存可以优化Redis的使用方式,全新的MEMORY命令可以帮助用户来实现这一操作。

MEMORY命令一共有5个子命令,可以通过MEMORY HELP来查看:

127.0.0.1:6379> memory help
1) "MEMORY DOCTOR                        - Outputs memory problems report"
2) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
3) "MEMORY STATS                         - Show memory usage details"
4) "MEMORY PURGE                         - Ask the allocator to release memory"
5) "MEMORY MALLOC-STATS                  - Show allocator internal stats"

关于各个子命令的详细使用方式可以参考《Redis 4.0之MEMORY命令详解》。

开始体验Redis 4.0

  • 点击这里查看Redis 4.0 Release Note
  • 体验阿里云数据Redis 4.0版请猛击

作者简介

赵钊,花名仲肥,阿里云技术专家,专注于阿里云数据库Redis版的开发工作,活跃于Redis开源社区,致力让开发者使用最好的云数据库服务。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 热榜第一!这个 Python 项目超 8.4k 标星,网友:太实用!

这个十一&#xff0c;又经历了一波抢票大战。常规办法根本抢不到&#xff0c;大家就把目光转移到“技术手段”上&#xff0c;顺便把一个Python抢票工具&#xff0c;送到了GitHub趋势榜第一&#xff1a;标星超过8.4k&#xff0c;来自名叫文贤平的程序员。这很可能是全GitHub最德…

c语言点按钮弹窗口,【iOS】按钮点击弹窗

拖入一个Round Rect Button&#xff0c;并将Button的文字修改成“点击弹窗”将ViewController.h修改为如下代码&#xff0c;实则在ViewController.h中添加了一行-(IBAction)messageBoxShow;&#xff0c;注册messageBoxShow这个函数。类似于C语言使用函数之前需要在头文件声明这…

cstring 不明确_股价不可预测明确时间点的涨跌

前言最近不少朋友或私信问或群里问几类问题&#xff1a;XXX 股票还能买吗&#xff1f;买了会不会还继续下跌&#xff1f;买了我能不能立刻就涨&#xff1f;XXX 股票能卖吗&#xff1f;我卖了不会还继续涨吧&#xff1f;XXX 股票为什么下跌这么厉害&#xff0c;是要有黑天鹅出现…

-bash: wget: 未找到命令

[rootlocalhost ~]# yum -y install wget

11月4日,上海开源基础设施峰会,不见不散!

戳蓝字“CSDN云计算”关注我们哦&#xff01;即日起&#xff0c;登录上海开源基础设施峰会网站&#xff0c;凭“OpenInfra10”优惠码注册就能享受九折优惠。另外&#xff0c;OpenStack基金会还特别为CSDN云计算社区的成员们预留了宝贵位置。11月4日至6日&#xff0c;世界各地的…

5求的值c语言编辑,C语言中怎样求1+3+5~~~~~+9值并 – 手机爱问

2018-04-06C 语言中的原码怎么&#xff1f;数计算机二进制形式表示数分有符号数和无符号数原码、反码、补码都有符号定点数表示方法有符号定点数高位符号位0正1副下都8位整数例原码数本身二进制形式例1000001 -10000001 1正数反码和补码都和原码相同负数反码其原码除符号位之外…

一个学渣的阿里之路

摘要&#xff1a; 前言 最近有些朋友在面试阿里&#xff0c;加上 Java-Interview 项目的原因也有小伙伴和我讨论&#xff0c;近期也在负责部门的招聘&#xff0c;这让我想起年初那段长达三个月的奇葩面试经历

RabbitMQ 下载、安装、配置、验证_rpm版本(Linux环境)

文章目录一、RabbitMQ 安装准备二、RabbitMQ 安装2.1. 环境安装(最小化版本先安装环境)2.2. 安装包下载2.3. rpm安装RabbitMQ2.4. 配置文件修改2.5. 启动RabbitMQ2.6. 查看RabbitMQ是否启动2.7. 查看RabbitMQ 插件列表2.8. 安装RabbitMQ 管控台2.9. 浏览器访问RabbitMQ 管控台三…

python 华泰证券 客户端_华泰证券网上交易系统(高级版)下载 v8.13官方版下载

华泰证券网上交易系统高级版是止录最新的证券交易软件&#xff0c;该版本在原有版本上重新设计改版&#xff01;数据更清晰&#xff0c;交易更快捷&#xff01;新版本分别有行情、选股、资讯、数据和交易五大模块&#xff0c;新版的框架支持了4K高清显示器显示&#xff0c;如果…

php7.0康乐安装_Ubuntu安装php7.0环境

1.下载必须组件sudo apt-get install libxml2-devsudo apt-get install curl参考文献&#xff1a;http://php.net/manual/zh/install.unix.nginx.phpphp下载地址&#xff1a;http://php.net/releases/wget http://am1.php.net/distributions/php-7.0.0.tar.gz2.开始配置安装cd …

使用拓扑数据分析理解卷积神经网络模型的工作过程

摘要&#xff1a; 神经网络功能强大&#xff0c;但内部复杂且不透明&#xff0c;被称为黑匣子工具。使用拓扑数据分析以紧凑且可理解的方式描述卷积神经网络的功能和学习过程。1.简介神经网络在各种数据方面处理上已经取得了很大的成功&#xff0c;包括图像、文本、时间序列等。…

2000万条直播数据,揭秘斗鱼主播生存现状

戳蓝字“CSDN云计算”关注我们哦&#xff01;2019年7月17日游戏直播平台斗鱼在美国纳斯达克股票交易所成功上市&#xff0c;成为继虎牙直播之后第二家赴美上市的国内直播平台。7月底斗鱼因为平台主播“乔碧萝殿下”事件再次被推上热搜。段子手们纷纷调侃成为主播的门槛之低&…

c语言08,标准C语言08_01.doc

标准C语言08_01选择题以下程序&#xff1a; B#include void main( ){int aa[3][3]{{2},{4},{6}}, i,*p&aa[0][0];//if是数组指针int (*p)//*p存的是一位数组&#xff0c;就是二维数组的第一行for(i0;i<2;i){if(i 0) aa[i][i1]*p1; //*p2; aa[0][1]3;else p; //列地址加一…

最佳实践:使用负载均衡SLB IPv6搞定苹果AppStore审核

摘要&#xff1a; 1.Greetings HI&#xff0c;大家好&#xff0c;我是负载均衡SLB产品经理添毅&#xff0c;今天我们来聊一聊苹果的IPv6审核&#xff0c;以及使用阿里云负载均衡SLB&#xff08;IPv6&#xff09;搞定AppStore IPv6审核。 2.Appstore IPv6审核是什么 由于国外的I…

curl查看swift状态命令_前端应该会的23个linux常用命令

(给前端大学加星标&#xff0c;提升前端技能.)作者:null仔https://segmentfault.com/a/11900000214395601、ls 命令 : 显示目录内容列表Linux ls 命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。ls [-alrtAFR] [name...]常用 options-a 显示所有文件及…

405 宝塔钩子_点击数据库管理,nginx提示出现405 Not Allowed错误,是怎么回事?

许多购买VPS自己建网站的用户都选择使用宝塔面板来安装网站环境&#xff0c;今天给一网友安装网站的时候&#xff0c;宝塔面板添加网站后访问phpmyadmin后台报错&#xff0c;提示“405 not allowed”&#xff0c;分享一下解决办法。什么是405 not allowed&#xff1f;来自mozil…

深度剖析 | 阿里热修复如何精简优化补丁资源?

摘要&#xff1a; 这一年&#xff0c;关于Sophix热修复我们陆续做了很多优化和改进&#xff0c;包括&#xff1a; 兼容最新Android版本至Android P dp3 JIT混合编译的兼容 第三方加固的全面兼容 新增稳健接入方式 三星低版本特殊机型的兼容 补丁工具加速与初始化检查 资源补丁深…

CentOS7.4下载与安装

https://blog.csdn.net/qq_39135287/article/details/83993574

开启企业级市场转型之路 群晖亮出安全“杀手锏”

戳蓝字“CSDN云计算”关注我们哦&#xff01;数据犹如企业经营者的眼睛&#xff0c;通过数据可以反映出很多经营中的问题。随着大数据应用日益渗透到各行各业中&#xff0c;数据所蕴含着的巨大商业价值也逐渐被发掘&#xff0c;通过挖掘分析与管理&#xff0c;释放更大的价值&a…