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