redis
2020-05-11 14:09:36 0 举报
AI智能生成
redis
作者其他创作
大纲/内容
基础
基本类型
String
int
如果可以用long类型来表示,使用int编码 <br>
embstr
不超过32字符的字符串使用embstr编码
row
超过32的使用row编码
List
quickList(ziplist和linkedlist混合体)
Hash
ziplist
使用条件:字符长度小于64,keys小于512
hashtable
Set
intset
都是整数集合,以及数量小于512
hashtable
Zset
ziplist
字符长度小于64,个数小于128
skiplist
stream
用于实现消息队列
安装包相关内容
redis-benchmark
可模拟客户端数和并发数模拟真实场景优化配置提高效率及吞吐量
dump.rdb
<ul><li><span style="font-size: inherit;">redis持久化的一种实现方式</span></li><li>通过client save命令实现持久化(直接阻塞主线程)</li><li>通过client bsave持久化(forks主线程)</li><li>通过配置 save second savetimes(forks主线程)</li></ul>
redis-check-aof(Append-only file)
通过配置文件配置<br><ul><li>是否开启</li><li>写入文件名</li><li>文件路径</li><li>写入策略(always,everysec,no)</li><li>是否重写</li></ul>
内存分配
自身内存
对象内存
缓冲内存
内存碎片
常用命令
内存模型
redisObject{<br> type;4bit//类型<br> encoding;4bit//编码<br> ptr;8byte//数据指针<br> refcount;4byte//引用次数<br> lru:24bit<br>}<br>
SDS(simple dynamic string)
jemalloc(内存分配器)
dictEntry
info memory
used_memory(分配器分配的内存总量)
used_memory_rss(向系统申请的内存总量)
total_system_memory(系统内存总量)
maxmemory(最大配置的内存)
maxmemory_policy(达到最大内存。释放内存策略)
mem_fragmentation_ratio(碎片率,正常1左右)
used_memory_peak(redis内存消耗峰值)
mem_allocator(内存分配器)
linux安装
<span style="font-size: inherit;">1.解压</span><br>2.cd /redis ,make<br>3.make install<br>4.编辑redis.conf<br>5. ./redis-server /path/to/redis.conf<br>
配置文件
单例集成使用
jedis
lettuce
redisson
哨兵Sentinal、集群Cluster
哨兵
<ul><li>redis需要开启主从复制,从主需要配置slaveof ip port,masterauth pwd</li><li>启用哨兵 ./redis-sentinel /path/to/sentinel.conf<br></li><li>生产正常使用多哨兵,不然一个哨兵挂了。整个redis服务就不可用了<br></li><li>请记住如果配置的密码,master记得也要配置masterauth</li></ul>
集群
互联网项目使用场景
消息队列
缓存
过滤器
基于bitmap做布隆过滤器
锁
incr->increment<br>setnx->setIfAbsent<br>set->set<br>主要利用redis的原子性
定时任务
<ul><li>利用setIfAbsent,如果不存在则set</li><li>当不存在返回true,存在返回false</li><li>redis对此command默认加锁</li></ul>
频率控制
<ul><li>使用keys,设置阀值,当size 大于多少是则不通过</li><li>使用keys是数据量庞大的系统中有问题,因为redis是单线程,key全局遍历会阻塞redis服务,时间复杂度O(n)</li><li>使用scan 代替keys使用</li><li>生产环境禁用keys ->rename-command KEYS ""</li></ul>
服务发现
分布式ID
<ul><li>利用increment方法在value值上+1</li><li>increment方法redis进行了加锁操作,不用担心初始化的时候出现重复值</li></ul>
位图/统计日活月活等统信息
使用bitmap<br><ul><li>内部存储一个二进制字符串,000010101001</li><li>使用普通opsForValue().get(key)获取</li><li>使用BitSet.and,or,andNot进行位运算<br></li></ul>使用hyperLogLog<br><ul><li>基于数学伯努利抛硬币实验</li><li>利用数学概率和统计学,在允许误差的情况下对大量的数据的基数统计</li><li><span style="font-size: inherit;"> redis标准误差0.81%</span></li><li><span style="font-size: inherit;">所有value进行hash算法生成64位bit.前14位用来计算桶的位置,后面的从低往搞找到出现1的索引位置存放桶中。</span></li><li> 一共有2^14 = 16384个桶</li><li>因为后面50位极端情况第50个出现1,则六位二进制可以存放50 ,即 110010<br></li><li>总共占空间 = 16384*6/8/1024=12K</li></ul>
geo
<ul><li>用来计算来两点之前的距离</li><li>获取某个点半径多少内的点</li></ul>
事务
通过mutil,exec来进行开启事务,和提交事务<br>使用discard放弃事务<br>使用watch监听键,如果在事务进行中发现key发生变化,事务失败
底层原理
底层数据结构
核心思想
持久化
dump.rdb
LUA脚本
spring-boot-starter-data-redis<br><ul><li>jedis默认线程不安全,阻塞I/O,需要额外引入连接池,创建多实例</li><li>lettuce使用netty BIO,线程安全</li><li>引用连接池加入依赖 comm-pool2</li></ul>
1.dictEntry -key(SDS),value(redisObject),链表结构<br>2.redisObject 字符串仍然通过SDS存储<br>3.redisObject 空间占16Byte.<br>4.目前只支持整型字符串共享对象(refcount>1),初始化加载0-10000个共享整型对象(0~9999)
0 条评论
下一页