redis 底层原理实现
1.Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
2.简单动态字符串
c字符串是以空字符结尾的字符串,redis中使用sds(Simple Dynamic String, 简单动态字符串)代替c字符串,sds定义:
区别如下:
- set(单次设置)
- get(单次读取)
- mset(批量设置)
- mget(批量读取)
- exists(是否存在)
- del(删除)
- expire key time(设置过期时间e)
- setex (== set + expire)
- incr key number ( incr age -5 )
- setbit
- getbit
位图
会有一些 bool 型数据需要存取,比如用户一年的签到记录, 签了是 1,没签是 0,要记录 365 天。如果使用普通的 key/value,每个用户要记录 365 个,当用户上亿的时候,需要的存储空间是惊人的。
位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。
3.字典
Redis数据库使用字典来作为底层实现的。对数据库的增删改查也是构建在对字典的操作之上
字典的底层是使用哈希表来实现的。
保存k0, v0
- hset
- hget
- hlen
4.list
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是 压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的 时候才会改成 quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间,而且 会加重内存的碎片化。比如这个列表里存的只是 int 类型的数据,结构上还需要两个额外的指针 prev 和 next 。所以 Redis 将链表和 ziplist 结合起来组成了 quicklist。也就是将多个 ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空 间冗余。
- rpush
- rpop
- lpush
- lpop
- lrange key start stop
- lindex key index
5.集合
- sadd
- smembers key (获取所有元素)
- sismember key value (查找某个value是否存在)
6.zset 有序集合
- zadd
- zrange keys
7.分布式锁
2.8以前不是原子的。(有可能造成死锁)
- setnx (set if not exists)
- expire (设置过期时间)
- del
2.8以后(原子操作) - set name liu ex 5 nx
8.延时队列
- brpop/blpop (阻塞)
- 但是要注意空闲链接的问题。 长时间闲置,服务器会主动断开连接。会抛出异常
9 HyperLoglog
提供不精确的计数方案,标准误差是0.81%
- pfadd
- pfcount
- pfmerge (多个pf merge)
10 布隆过滤器(4.0)
布隆过滤器可以理解为一个不怎么精确的 set 结构,当你使用它的 contains 方法判断某 个对象是否存在时,它可能会误判。但是布隆过滤器也不是特别不精确,只要参数设置的合 理,它的精确度可以控制的相对足够精确,只会有小小的误判概率。
当布隆过滤器说某个值存在时,这个值可能不存在;当它说不存在时,那就肯定不存 在。打个比方,当它说不认识你时,肯定就不认识;当它说见过你时,可能根本就没见过 面,不过因为你的脸跟它认识的人中某脸比较相似 (某些熟脸的系数组合),所以误判以前见 过你。
- bf.add
- bf.exists
11.事务
- multi
- incr books
- exec(执行)/discard(放弃)
Redis 的事务根本不能算「原子性」,而仅仅是满足了事务的「隔 离性」,隔离性中的串行化——当前执行的事务有着不被其它事务打断的权利。
上面的 Redis 事务在发送每个指令到事务缓存队列时都要经过一次网络读写,当一个事 务内部的指令较多时,需要的网络 IO 时间也会线性增长。所以通常 Redis 的客户端在执行 事务时都会结合 pipeline 一起使用,这样可以将多次 IO 操作压缩为单次 IO 操作
优化:使用管道
- pipe = redis.pipeline(transaction=true)
- pipe.multi()
- pipe.incr(“books”)
- pipe.incr(“books”)
- values = pipe.execute()
12 过期策略
1.定是删除
- 把redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个 字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓 惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期 了就立即删除。定时删除是集中处理,惰性删除是零散处理。
2.惰性删除
https://baijiahao.baidu.com/s?id=1594341157941741587&wfr=spider&for=pc
13 持久化
- rdb (快照)
redis是单线程的,在保存快照的时候,会调用操作系统的cow(copy on write), fork 出一个子进程,主进程继续处理请求,子进程进行copy。当主进程有修改时,会复制一个大小为4k的分页,这个操作对子进程来说是透明的。所以子进程复制的还是修改的之前的内容。这样就会导致有数据丢失
- aof
aof保存的是指令流,当redis接受一个指令时,会先保存指令,在执行。这样根据aof可以把一个空的redis 恢复成原先的样子。但是随着时间的增长,aof会变得越来越大。因为redis是单线程的,所以恢复的时候会特别缓慢,可能无法处理其他的请求。
- 混合型持久(4.0)
在redis4.0版本,退出了混合持久性。在rdb开启的时候,进行aof操作,这样的保存快照的时候操作也可以被保存下来,保证数据不会丢失,同时也解决了aof臃肿的问题。
redis 底层原理实现相关推荐
- Redis底层原理和数据结构-总结篇
本文数据结构部分内容转自:SmartKeyerror 先了解数据结构,后看具体应用部分,本文着重应用部分的优缺点进行总结!数据结构部分仅仅做初步了解介绍,源码实现具体请参考如下目录自行学习,本文以6. ...
- Redis底层原理实现
简单动态字符串 Redis 是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符'\0'结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dyn ...
- Redis底层原理之跳跃表
1. 什么是跳跃表? 增加了向前指针的链表叫作跳表.跳表全称叫做跳跃表.跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表.跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查 ...
- 底层原理有那么重要吗?
大家好,我是贺同学. 前段时间在工作业务中碰到一个技术问题, 在发现问题,思考问题,解决问题的过程中,突然对底层原理有了一些思考,这里分享一下给大家. 背景 在业务中使用到了 Redis 数据库来存储 ...
- 作为程序员,对于底层原理真的有那么重要吗?
前段时间在工作业务中碰到一个技术问题, 在发现问题,思考问题,解决问题的过程中,突然对底层原理有了一些思考,这里分享一下给大家. 背景 在业务中使用到了 Redis 数据库来存储数据,但是在存储大数 ...
- redis单线程原理___Redis为何那么快-----底层原理浅析
redis单线程原理 redis单线程问题 单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程. 1. 为什么说redis能够快速执行 ...
- redis,memcached到nginx,底层网络io中剥离精髓丨C/C++Linux丨C++后端开发丨Linux服务器开发丨底层原理
redis,memcached到nginx,底层网络io中剥离精髓 1. redis单线程网络的优缺点 2. memcached多线程网络的并发优势 3. nginx多进程网络的优势 视频讲解如下,点 ...
- 后端底层开发人员必须要彻底搞懂的redis存储原理丨redis跳表与B+树详细对比
后端底层开发人员必须要彻底搞懂的redis存储原理 1. redis存储原理分析 2. redis源码学习分享 3. redis跳表与B+树详细对比分析 视频讲解如下,点击观看: 后端底层开发人员必须 ...
- Redis综述篇:与面试官彻夜长谈Redis缓存、持久化、淘汰机制、哨兵、集群底层原理!...
点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 于哥你好,最近面试挺多的,尤其是在问到java面试题,Redis被问的特别多,比如Red ...
最新文章
- 【建站系列教程】2.2、fiddler手机抓包教程
- Fedora 8中驱动ASUS6摄像头
- POJ1325二分匹配或者DINIC(最小路径覆盖)
- 关于Python中if、for、with、list、dict的练习题
- python msi installer_Windows10 MYSQL Installer 安装(mysql-installer-community-5.7.19.0.msi)
- Protocol Buffers数据编码
- 40个非常有创意的国外LOGO欣赏(上)
- python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串
- JS使用递归遍历json对象进行操作
- WPS word文档_页眉页脚横线的添加和删除
- 计算机组成原理平均cpi怎么算_计算机组成原理 第1--4章
- OPC服务器简介和入门介绍
- frp客户端进行windows远程桌面连接
- 灵活用工系统开发|劳务派遣有风险吗?
- HTTP浏览器输入URL后发生了什么
- xargs的详细解释,记得收藏,相信我你会需要的
- 将百度富文本编辑器(ueditor)中的内容转化为word文档格式
- Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解
- 磊科(NetCore) nw330 usb无线网卡 win7 x86 驱动程序 (for windows7 32位)
- conntrack未确认链表