
精通Redis
文章平均质量分 70
精通Redis
会飞的IT蜗牛
当你的才华撑不起你的野心时,你就应该静下心来学习
展开
-
十四、Redis需要多少内存预留-内存占用多少才安全
极限情况:留出一倍内存。比如你的redis数据占用了8G内存,那么你还需要再预留8G空闲内存。也就是内存需求是16G。内存占用率低于50%是最安全的。普通情况:正常情况下,在序列化周期内,不会更改所有数据,只会有部分数据更改,那么,预留出可能产生的更改部分的空间,就行。如果实在要说一个数据的话,内存占用率低于75%都是安全的。比如我们这个游戏服务器的,N台数据服务器之一的截图:如上图,16G的内存,已经使用了64%了。但是实际上,在fork序...原创 2022-03-11 06:21:52 · 4951 阅读 · 0 评论 -
十三、Redis持久化之RDB原理
一、为什么需要持久化redis里有10gb数据,突然停电或者意外宕机了,再启动的时候10gb都没了?!所以需要持久化,宕机后再通过持久化文件将数据恢复。二、优缺点1、rdb文件rdb文件都是二进制,很小。比如内存数据有10gb,rdb文件可能就1gb,只是举例。2、优点由于rdb文件都是二进制文件,所以很小,在灾难恢复的时候会快些。他的效率(主进程处理命令的效率,而不是持久化的效率)相对于aof要高(bgsave而不...原创 2022-03-10 08:44:28 · 1068 阅读 · 0 评论 -
十二、Redis持久化之AOF原理
一、什么是AOF它也是Redis持久化的重要手段之一,aof-》Append Only File,只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事。二、优缺点1、优点持久化的速度快,因为每次都只是追加,rdb每次都全量持久化数据相对更可靠,丢失少,因可以配置每秒持久化、每个命令执行完就持久化2、缺点灾难性恢复的时候过慢,因为aof每次都只追加原命令,导致aof文件过大,但是后面...原创 2022-03-10 08:35:11 · 2258 阅读 · 1 评论 -
十一、Redis中的LFU思路
在Redis中的LRU算法文中说到,LRU有一个缺陷,在如下情况下:~~~~~A~~~~~A~~~~~A~~~~A~~~~~A~~~~~A~~|~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~~B~|~~~~~~~~~~C~~~~~~~~~C~~~~~~~~~C~~~~~~|~~~~~D~~~~~~~~~~D~~~~~~~~~D~~~~~~~~~D|会将数据D误认为将来最有可能被访问到的数据。Redis作者曾想改进LRU算法,但发现Redis的LRU算...原创 2022-03-10 08:22:35 · 286 阅读 · 0 评论 -
十、redis字典底层原理
一、Redis字典的实现Redis字典使用散列表最为底层实现,一个散列表里面有多个散列表节点,每个散列表节点就保存了字典中的一个键值对。1.1 字典结构:typedef struct dict{ //类型特定函数 void *type; //私有数据 void *privdata; //哈希表 dictht ht[2]; //rehash 索引 当rehash不在进行时 值为-1 int r...原创 2022-03-10 07:01:55 · 230 阅读 · 0 评论 -
九、redis原理之expire
Redis给我们提供了设置键过期的方式:expire <key> <ttl> 命令用于将键key的生存时间设置为ttl秒 pexpire <key> <ttl> 命令用于将键key的生存时间设置为ttl毫秒 expireat <key> <timestamp> 命令用于将键key的过期时间设置为timestamp pexpireat <key> <timestamp>命令用于将键key的过期时间设置为t原创 2022-03-10 06:45:38 · 2900 阅读 · 0 评论 -
八、redis原理之布隆过滤器实现原理
一、前言布隆过滤器的作用是判断一个元素是否存在于一个集合中。比如有一个集合存储了全国所有人的身份证号码,那么该集合大小有十几亿的大小,此时如果判断一个身份证是否存在于该集合中,最简单也是最笨的办法就是遍历集合,挨个判断是否和校验的身份证号码相同来判断。而布隆过滤器就是通过一个提高空间和时间效率的一种算法,来快速判断一个元素是否存在于集合中。另外还有一个问题,如果采用遍历的方式,还有一个比较大的问题就是内存的问题,假设现有一个场景,有10亿个整数,需...原创 2022-03-10 06:34:30 · 1388 阅读 · 0 评论 -
七、redis原理之事务
Redis事务相关命令:MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列。 EXEC:执行事务中的所有操作命令。 DISCARD:取消事务,放弃执行事务块中的所有命令。 WATCH:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。 UNWATCH:取消WATCH对所有key的监视。有两个客户端,都开启事务multi,然后中间发起来一系列的操作,最后两个客户端原创 2022-03-10 06:20:31 · 171 阅读 · 0 评论 -
六、redis的单线程模型
一、前言redis实际上是个单线程工作模型redis基于reactor模式开发了网络事件处理器,这个处理器叫做文件事件处理器,file event handler。这个文件事件处理器,是单线程的,redis才叫做单线程的模型,采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器来处理。如果被监听的socket准备好执行accept、read、write、close等操作的时候,跟操作对应的文件事件就会产生,这个时候文件事...原创 2022-03-10 06:42:06 · 268 阅读 · 0 评论 -
五、redis原理之sort set底层数据结构
一、redis原理之sort set底层数据结构?SortedSet(zset)有序集合可以看做是在Set集合的的基础上为集合中的每个元素维护了一个顺序值: score,它允许集合中的元素可以按照score进行排序,所以它的经典实用场景如:考生按分数排名,某游戏玩家分数排行,网站首页某数据排行,最新评论按时间排序等等。Redis是一个内存数据库,它在保证读写速度的同时也需要考虑内存开销,那对于SortedSet有序集合而言它需要维护一个顺序值,而对于有序集合的底层实现...原创 2022-03-09 10:52:32 · 3334 阅读 · 0 评论 -
四、redis原理之set底层数据结构
一、redis原理之set底层数据结构?其底层有两种实现方式:1.当value是整数值时,且数据量不大时使用inset来存储,2.其他情况都是用字典dict来存储inset的结构:typedf struct inset{ uint32_t encoding;//编码方式 有三种 默认 INSET_ENC_INT16 uint32_t length;//集合元素个数 int8_t contents[];//实际存储元素的数组原创 2022-03-09 10:44:15 · 2209 阅读 · 0 评论 -
三、redis原理之list底层数据结构
一、redis原理之list底层数据结构ziplist和quicklist。快速列表 quicklist【quicklist = 链表+ziplist】首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,即压缩列表 . 它将所有的元素紧挨着一起存储,分配的是一块连续的内存 当数据量比较多才会改成 quicklist.本质上来说,quicklist里面保存着一个一个小的ziplistquickList就是一个标准的双向链表的配置,有head 有t...原创 2022-03-09 10:40:34 · 2567 阅读 · 0 评论 -
二、redis原理之hash底层数据结构ziplist dict
一、在Redis当中,hash有两种底层实现方式:当数据量较小的时候,采用zipList作为hash的底层实现 另一种方式是使用字典dict来实现的。二、ziplist压缩列表当hash对象可以同时满足一下两个条件时,哈希对象使用ziplist编码:1.哈希对象保存的所有键值对的键和值的字符串长度都小于64字节2.哈希对象保存的键值对数量小于512个...原创 2022-03-09 10:36:07 · 1110 阅读 · 0 评论 -
一、redis原理之string底层数据结构SDS
一、前言 我们说Redis 是用 C 语言写的,,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自定义的数据结构SDS(simple dynamic string),并将 SDS 作为 Redis的默认字符串表示。二、SDS 定义struct sdshdr{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 int len; //记录 buf 数组...原创 2022-03-09 10:26:34 · 1689 阅读 · 0 评论