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写的. ...
随机推荐
- Python 之父的解析器系列之七:PEG 解析器的元语法
原题 | A Meta-Grammar for PEG Parsers 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众 ...
- Spring MVC-从零开始-view-ViewResolver
主要ViewResolver简介 InternalResourceViewResolver 将逻辑视图名解析为一个路径 BeanNameViewResolver 将逻辑视图名解析为bean的name属 ...
- openssl req(生成证书请求和自建CA)(转)
openssl req(生成证书请求和自建CA) 伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA.由于openssl req命令选项较多,所以先各举几个例子,再集中 ...
- Spring 事务注解@Transactional
事务管理一般有编程式和声明式两种,编程式是直接在代码中进行编写事物处理过程,而声名式则是通过注解方式或者是在xml文件中进行配置,相对编程式很方便. 而注解方式通过@Transactional 是常见 ...
- python 列表,集合,字典,字符串的使用
PY PY基础 append 在末尾添加元素 pop 删除末尾元素 insert(i,item)在i位插入元素 pop(i)删除i位元素 只有1个元素的tuple定义时必须加一个逗号,,来消除歧义 i ...
- 深入Dapper.NET源码 (文长)
目录 前言.目录.安装环境 Dynamic Query 原理 Part1 Dynamic Query 原理 Part2 Strongly Typed Mapping 原理 Part1 : ADO.NE ...
- vue运行报错webpack-dev-server: command not found
翻译过来就是: 'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序 解决方法: 然后总结下成功的步骤: 1. 直接在项目目录下: cnpm install npm run ...
- Spring Cloud之Hystrix
在微服务架构中,存在那么多的服务单元,若一个单元出现故障(由于网络原因或者自身原因),就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定.为了解决这样的问题, ...
- 浅谈json web token及应用
Json Web Token (JWT),是一个非常轻巧的规范,这个规范允许在网络应用环境间客户端和服务器间较安全的传递信息.该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO) ...
- 为什么那么多自学JAVA的后来都放弃了?总结起来就这些原因
目前信息化产业发展势头很好,互联网就成为了很多普通人想要涉及的行业,因为相比于传统行业,互联网行业涨薪幅度大,机会也多,所以就会大批的人想要转行来学习Java开发. 目前来讲市场上需要的Java人员非 ...