![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
内存数据库
fhxyryxc
这个作者很懒,什么都没留下…
展开
-
LRU在Redis中的实现
Redis使用的是近似LRU算法,它跟常规的LRU算法还不太一样。近似LRU算法通过随机采样法淘汰数据,每次随机出5(默认)个key,从里面淘汰掉最近最少使用的key。Redis给每个key增加了一个额外增加了一个24bit的字段,用来存储该key最后一次被访问的时间。配置文件# 采样数量maxmemory-samples 10Redis3.0对近似LRU的优化新算法会维护一个候选池(大小为16),池中的数据根据访问时间进行排序。第一次随机选取的key都会放入池中,随后每次随机选取的key只转载 2020-11-16 17:34:52 · 104 阅读 · 0 评论 -
RDB/AOF
RDB把内存数据直接保存到dump.rdb中将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。对于灾难恢复而言,RDB是非常不错的选择//900秒内至少1个key更新则dump内存快照//save操作会阻塞主进程,bgsave会fork出一个子进程save 900 1save 300 10save 60 10000AOF将Reids的操作日志以追加的方式写入文件重启后,优先使原创 2020-06-02 23:21:50 · 72 阅读 · 0 评论 -
16384个hash槽
//CRC16算法产生的hash值有16bit,该算法可以产生2^16-=65536个值HASH_SLOT=CRC16(key) mod 16384//节点握手,握手成功后,2个节点之间会定期发送ping/pong消息,交换数据信息cluster meet 127.0.0.1:7001交换的数据信息16384÷8÷1024=2kb约为集群总节点数量的1/10,至少携带3个节点的信息节点数量越多,消息体内容越大redis作者,不建议redis cluster节点数量超过1000个频率转载 2020-06-02 23:02:56 · 210 阅读 · 0 评论 -
redis和memcached
在Redis中,并不是所有的数据都一直存储在内存中的。当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘。Redis只会缓存所有的key的信息。如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作。Redis根据“swappability = age*log(size_in_memory)”计算出哪些key对应的value需要swap到磁盘,然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以保持超过其机器本身内存大小原创 2020-06-02 22:45:13 · 62 阅读 · 0 评论 -
skiplist
有序集合对象使用ziplist编码需要满足两个条件:所有元素长度小于64字节;元素个数小于128个;skiplist编码的有序集合对象底层实现是跳跃表和字典两种转载 2020-06-02 22:31:02 · 92 阅读 · 0 评论 -
quicklist
Redis中的 list 对象在版本3.2之前,列表底层是 ziplist 和 linkedlist 实现的。在版本3.2之后,列表的底层都由quicklist实现。linkedlist双向链表linkedlist便于在表的两端进行push和pop操作,在插入节点上复杂度很低,但是它的内存开销比较大。首先,它在每个节点上除了要保存数据之外,还要额外保存两个指针;其次,双向链表的各个节点是单独的内存块,地址不连续,节点多了容易产生内存碎片。ziplistziplist存储在一段连续的内存上,所以转载 2020-06-02 21:49:52 · 128 阅读 · 0 评论 -
数据类型
redisObject16Byte---数据类型type4bit编码方式encoding4bit数据指针ptr8byte最后访问时间24bit引用计数refCount4byte数据类型数据类型编码方式-Stringint+raw+embstrHashht+ziplistListlinkedlist+ziplistSetht+intsetZSetskiplist+zip转载 2020-06-02 21:00:22 · 498 阅读 · 0 评论 -
redis连接数
redis通过监听一个TCP端口或socket的方式接收来自客户端的连接当与客户端建立连接后,redis内部会进行如下操作:1. 客户端socket会被设置为非阻塞模式,因为redis在网络时间处理上采用的是非阻塞多路复用模型;2. 然后为这个socket设置TCP_NODELAY属性,禁用Nagle算法;3. 然后创建一个可读的文件事件用于监听这个客户端socket的数据发送。// 查询redis允许的最大连接数config get maxclients//maxclients 设置为0原创 2020-06-01 18:53:52 · 629 阅读 · 0 评论 -
redis-benchmark
Redis 自带了一个叫 redis-benchmark 的工具来模拟 N 个客户端同时发出 M 个请求。参数说明-rUse random keys for SET/GET/INCR, random values for SADD ,随机值-qQuiet. Just show query/sec values-tOnly run the comma separated list of tests,仅允许指定的测试命令-nTotal number of requ转载 2020-06-01 18:27:41 · 135 阅读 · 0 评论 -
Info 统计信息
参数参数信息说明serverRedis server 信息clients客户端连接信息memory内存使用信息persistenceRDB and AOF 持久化关联信息stats通用统计信息replication主从信息cpuCPU 使用统计commandstatscommand 统计cluster集群信息keyspaceDB关联统计信息default返回默认部分all返回所有部分返回值转载 2020-06-01 18:05:25 · 168 阅读 · 0 评论 -
淘汰策略
在64bit系统下,maxmemory设置为0表示不限制Redis内存使用在32bit系统下,maxmemory不能超过3GB策略说明no-enviction(驱逐)禁止驱逐数据 ,不淘汰数据,返回OOM错误allkeys-lru从内存数据集中挑选最近最少使用的数据 淘汰allkeys-randomallkeys-lfu4.0版本及以上volatile-lru从已设置过期时间的内存数据集中挑选最近最少使用的数据 淘汰volatile-rando原创 2020-06-01 17:52:10 · 785 阅读 · 0 评论 -
内存碎片
redis产生内存碎片redis自身的内存分配器修改cache的值,且修改后的value与原来value的大小差异较大。解决方案重启redis服务。Redis 4.0-RC3 以上版本可以使用新增指令来手动回收内存碎片。redis-cli -p 6383 memory purge配置碎片整理总开关# activedefrag yes# 内存碎片达到多少的时候开启整理active-defrag-ignore-bytes 100mb# 碎片率达到百分之多少开启整理active-d转载 2020-06-01 17:40:35 · 97 阅读 · 0 评论 -
SCAN和KEYS
keys命令是以阻塞的方式执行的,keys是以遍历的方式,实现的复杂度是 O(n),Redis库中的key越多,查找实现代价越大,产生的阻塞时间越长。scan命令,以非阻塞的方式实现key值的查找,绝大多数情况下是可以替代keys命令的,可选性更强。SCAN命令是一个基于游标的迭代器。Smembers 命令返回集合中的所有的成员。(阻塞方式)// 查询key11开头的key有哪些keys key11*scan 0 match key11* count 20SMEMBERS myset1CO原创 2020-06-01 17:10:35 · 290 阅读 · 0 评论