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. commons-beanutils.jar及其支持文件

    下载地址: 链接:https://pan.baidu.com/s/1AtiK3nsk0aBuBfMdNwBVGw 密码:6tul

  2. Python连载40-协程定义及状态、send语句、yield用法

    一.协程 1.历史进程: (1)3.4引入协程,用yield来实现 (2)3.5引入协程语法 (3)实现协程比较好的包有asyncio,tornado,gevent 2.定义:协程是为非抢占式多任务产 ...

  3. C# 反射Reflection——反射反射程序员的快乐

    一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...

  4. Android 禁止Edittext弹出系统软键盘 的几种方法

    第一种方法:在XML文件下添加: android:focusable="true" android:focusableInTouchMode="true" 第二 ...

  5. Python基础(十四)

    今日主要内容 装饰器扩展 有参装饰器 多个装饰器装饰一个函数 递归 一.装饰器扩展 (一)含有参数的装饰器 先来回顾一下装饰器的标准模式 def wrapper(fn): def inner(*arg ...

  6. mysql 最左前缀匹配原则

    1.在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,示例:对列col1.列col2和列col3建一个联合索引 KEY index_col1_co ...

  7. 【SQL server基础】object_id()函数

    在SQLServer数据库中,如果查询数据库中是否存在指定名称的索引或者外键约束等,经常会用到object_id('name','type')方法,做笔记如下: ? 语法:object_id('obj ...

  8. 你不知道的 IDEA Debug调试小技巧

    一.多线程调试断点 Intellij IDEA 的debug断点调试是有一个模式的选择的,就像下面这张图,平时我们都使用的是默认的 ALL(在Eclipse中默认是线程模式) ,这种模式我们只能将一个 ...

  9. 两小无猜的爱恨情仇--java =+和+=揭秘

    故事背景 当一个人问另一个人“敢不敢”的时候,另一个人必须说“敢”,这就是游戏的规则.小男孩朱利安和小女孩苏菲的相遇即开始于这样一场孩童的闹剧,一个精美的铁盒子就是他们游戏的见证.说脏话,扰乱课堂,在 ...

  10. egret引擎中使用tiled运行在微信小游戏中

    egret的官方文档,对tiled的介绍不是很细致,很多东西都需要摸索.现在把踩的坑记录下来.作为一个备忘 引用tiledmap的库 在GitHub上下载egret的tiledmap支持库:https ...