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备忘(一)的更多相关文章

  1. Redis备忘(二)

    内存回收: 有时候发现10g的Redis删掉1g的key,内存占用没啥变化,因为内存页分配,有的页面可能还存在key,整个页面不能回收. 主从同步: CAP原理:一致性 可用性 分区容忍性 redis ...

  2. 常用linux命令备忘

    备忘: 关闭防火墙:# systemctl stop firewalld 查看防火墙状态:#  systemctl status firewalld 停止防火墙:#  systemctl disabl ...

  3. GIS部分理论知识备忘随笔

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...

  4. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  5. Vi命令备忘

    备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...

  6. ExtJs4常用配置方法备忘

    viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...

  7. [备忘] Automatically reset Windows Update components

    这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...

  8. ECMAScript 5(ES5)中bind方法简介备忘

    一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...

  9. MFC通过txt查找文件并进行复制-备忘

    MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...

随机推荐

  1. SpringBoot起飞系列-使用idea搭建环境(二)

    一.环境配置 安装idea的教程就不说了,相信大家肯定已经安装好了,另外maven环境肯定也安装好了,那么我们就开始使用idea开发工具来创建一个springboot的web项目,这里奉上一个idea ...

  2. 第八届蓝桥杯java b组第三题

    标题:承压计算 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同.金属材料被严格地堆放成金字塔形. 7                         ...

  3. 环境搭建-Hadoop集群搭建

    环境搭建-Hadoop集群搭建 写在前面,前面我们快速搭建好了centos的集群环境,接下来,我们就来开始hadoop的集群的搭建工作 实验环境 Hadoop版本:CDH 5.7.0 这里,我想说一下 ...

  4. SpringBootSecurity学习(03)网页版登录添加自定义登录页面

    自定义登录页面 前面无论是使用默认配置,还是自定义配置类,都是使用的springboot-security自带的登录页面,自带的登录页面在这个版本虽然设计的非常不错,但是在实际开发中,我们通常还是使用 ...

  5. 阿里云ECS服务器提示需要修复的漏洞问题

    1.漏洞: RHSA-2018:1842: kernel security, bug fix, and enhancement updateRHSA-2018:2299: NetworkManager ...

  6. 经典案例复盘——运维专家讲述如何实现K8S落地(摘抄)

    以下是运满满K8s容器化进程记录,摘抄一下,方便以后查阅. 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上, ...

  7. 五 mysql之多表查询

    目录 一 介绍 二 多表连接查询 1.交叉连接:不适用任何匹配条件.生成笛卡尔积 2.内连接:只连接匹配的行 3 .外链接之左连接:优先显示左表全部记录 4 .外链接之右连接:优先显示右表全部记录 5 ...

  8. Redis开发与运维:linux安装

    Linux 安装 我的系统是inux 系统,官网下载 https://redis.io/download redis-5.0.5.tar.gz 解压: 编译安装: 官网和文档说得已经很清楚了,现在就执 ...

  9. Vue三步完成跨域请求

    三步完成跨域请求 ①main.js中: Vue.prototype.HOME = '/api'; ② config/index.js中: module.exports = { dev: { // Pa ...

  10. zend studio 13.6 导入项目及其他设置

    1. 先创建一个新的项目:file -> new -> project 2. 创建新项目之后,在左侧的项目目录上右键 -> import 到此导入项目, 完成! 设置编码utf-8 ...