Redis备忘(一)
hash:
渐进式rehash:同时查询新旧两个hash,然后在后续定时任务以及hash的子指令中,循序渐进将旧的迁移到新的hash表
Redis应用:
1.分布式锁:
实现1:setnx+expire+del,setnx后客户端宕机怎么办,根本原因在于没有原子性
解决:redis2.8引入了原子性的命令进行设置。
2.分布式锁超时问题:1执行时间太长,超过了锁的时间,2拿到了锁,这时候1执行完了,就释放了锁,于是3在2执行完成之前拿到了锁
解决:(1) 别做长时间的任务
(2) value上标记一个随机数,释放锁时先看看随机数是否一致,如一致再删除(匹配value和删除key不是原子操作,可以借助lua实现“delete if equals”)。
3.消息队列:
blpop
4.位图:本质就是字符串,用getbit,setbit操作,也可以用getString获取整个字符串。可以用来实现用户签到等。
5.hyperloglog: 可以用来统计UV,不能做到精准去重,有时间可以继续研究下。
6.bloomfilter: hyperloglog只能计数,没有"contains"语义,不知道某个值是否包含,Redis4.0后可以使用bloomfilter。
注意,元素超出设定个数后需要重建布隆过滤器。
7.限流:用zset的zremrangeByScore可以获取一定时间内发生次数
8.漏斗限流
9.GeoHash: 传统数据库实现方式:select id from positions where x0-r < x < x0+r and y0-r < y < y0+r
GeoHash将二维经纬度映射到一维整数
本质是对地图用二刀法进行切割,每个小正方形有一个编码,距离越近的编码越接近
Redis将GeoHash值存储在了zset中
10.scan: 生产环境不要用keys命令,没有offset,limit参数,会一次性吐出所有key,由于Redis的单线程特性会造成卡顿。
scan通过游标进行,有limit参数(仅仅是限定了服务器单次遍历字典槽位的数量),结果有重复,需要client端去重
举例:获取大key,用scan遍历所有key。实际运维中使用redis-cli -h 127.0.0.1 -p 7001 –-bigkeys即可。
原理:
为啥快:数据在内存,单线程,所以要注意O(N)复杂度的操作,使用非阻塞IO,IO多路复用
Redis给每个客户端一个FIFO的命令队列,响应队列
定时任务的实现:最小堆,每次循环执行一个
redis每次循环会将最小堆的任务处理完后将即将要执行的任务还需要多少时间记下来,作为select 的timeout参数
通信协议:RESP文本协议,没什么可说的,性能瓶颈不在于网络
持久化:快照+AOF
COW机制:fork一个子进程,共享父进程代码段和数据段,之后父进程继续写入,会复制 一个新的页面,不影响子进程的工作。
AOF重写原理:bgrewriteaof指令开启子进程遍历内存并转换成AOF指令,序列化到一个新的AOF文件,完成后用这个文件替代旧的AOF文件。
写AOF文件实际写到了内核给文件描述符分配的一个内存缓存区中,内核异步将脏数据写盘。可以设置如fsync周期1s写盘。
优劣:使用rdb会丢失数据,使用aof会导致重启太慢,故redis4.0中支持了混合持久化。(重启的时候,可以先加载rdb的,然后再重放增量 AOF 日志)
pipline:
将原本的写->读->写->读流程,用了管道可以写写读读,其实服务器端根本没有任何区别
为啥能提高性能?因为写操作只是写到本地buffer,不会阻塞,可以很快返回。
事务:
指令在exec 之前不执行,而是缓存在服务器的一个事务队列中,即使某个命令执行失败,后续命令依然正常执行,没有实现原子性。
小对象压缩:
元素少的时候没必要使用hashmap,直接用一维数组搞定
我们用object encoding key可以查看底层用的什么数据结构
Redis备忘(一)的更多相关文章
- Redis备忘(二)
内存回收: 有时候发现10g的Redis删掉1g的key,内存占用没啥变化,因为内存页分配,有的页面可能还存在key,整个页面不能回收. 主从同步: CAP原理:一致性 可用性 分区容忍性 redis ...
- 常用linux命令备忘
备忘: 关闭防火墙:# systemctl stop firewalld 查看防火墙状态:# systemctl status firewalld 停止防火墙:# systemctl disabl ...
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
- ExtJs4常用配置方法备忘
viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...
- [备忘] Automatically reset Windows Update components
这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...
- ECMAScript 5(ES5)中bind方法简介备忘
一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...
- MFC通过txt查找文件并进行复制-备忘
MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...
随机推荐
- Eclipse通过SVN导入项目遇到的问题记录
问题一.把子项目导入为project 原因:一个大的文件夹,里面有各个小项目,需要把自己添加需求的醒目导入为Maven Project 1.右键选 Import as project 2.右键 -&g ...
- selenium-04-验证码问题
对于web应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的,对于系统来说使用验证码可以有效果的防止采用机器猜测方法 ...
- Flask基础(04)-->相关配置参数
# 导入Flask from flask import Flask from flask import config # 创建Flask的应用程序 app = Flask(__name__) #=== ...
- 10个值得深思的_PHP_面试问题
Q1 第一个问题关于弱类型 $str1 = 'yabadabadoo'; $str2 = 'yaba'; if (strpos($str1,$str2)) { echo "\"&q ...
- python编程基础之二十
字符串的其他常用方法: ord(char) # 返回char字符对应的码值,可以是中文字符 chr(x) # 输入一个unicode码,返回对应的字符 eval(str) # 将str 中的内容 ...
- [JOJZ]3855.选择困难症
[问题描述]又到吃饭时间,Polo 面对饭堂里琳(fei)琅(chang)满(keng)目(die)的各种食品,又陷入了痛苦的抉择中:该是吃手(jiao)打肉饼好呢,还是吃豆(cai)角(chong) ...
- markdown下载、安装、破解、汉化与常用语法
markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 一.markdown下载 markdown破解版下载地址: http://www.pc6.com/ ...
- homebrew安装问题(Failed during: git fetch origin master:refs/remotes/origin/master --tags --force)
在mac系统中,使用homebrew可以很方便的管理包.按照官网的说明执行以下命令时总是报错: /usr/bin/ruby -e "$(curl -fsSL https://raw.gith ...
- C语言I作业004
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业 我在这个课程的目标是 掌握使用for循环语句实现指定次数的循环程序设计 这个作业在那个具体方面帮助我实现目标 pta运用for循环语 ...
- JS里面的铠甲合体!
本标题党又回来了,最近在专心研究一些JS基础性的书籍,以期把原理都了解透彻,所以写文章的频率就降了下来.但是今天我必须要来写一下子,为什么呢,因为今天周五!先说明一下JS里面的拆箱与装箱指的是JS封箱 ...