首页  

redis要点整理     所属分类 redis 浏览量 1552
keys  执行直到完毕  慎用 
可使用scan指令,提取指定模式的key列表,会有一定的重复概率,客户端做去重 


大量的key过期时间设置过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。

异步队列
list ,rpush生产消息,lpop消费消息
blpop  没有消息会阻塞

延时队列
使用sortedset,时间戳作为score ,zrangebyscore指令获取N秒之前的数据轮询处理。

分布式锁  setnx  + expire 

bgsave原理 fork和cow
fork是指通过创建子进程来进行bgsave操作,cow指的是copy on write,
子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。



支持数据的持久化
支持数据的备份,master-slave模式 

性能高  读tps 110000 , 写tps 81000 
丰富的数据类型   Strings, Lists, Hashes, Sets 及 Ordered Sets 等数据类型

单线程 单个操作是原子性的 , 多个操作支持 ,通过MULTI和EXEC指令包起来。

支持 publish/subscribe, 通知, key 过期 


五种数据类型
string(字符串),hash(哈希),list(列表),set(集合)及 zsetsorted set有序集合

常用 string,hash
高级数据结构 HyperLogLog  Geo Pub/Sub 

高级玩法 
Redis Module,BloomFilter,RedisSearch,Redis-ML 


Redis vs Memcached 
Memcached 只支持简单字符串  且不能持久化
Memcached 多线程 
redis 单线程

字符串类型最大容量 512M

两种持久化机制RDB和AOF

RDB Redis DataBase 数据集快照 ,在某个时间点将数据写入一个临时文件
只有一个文件dump.rdb,方便持久化。
fork子进程来完成写操作,让主进程继续处理命令 
定时持久化,会发生数据丢失 

AOF Append-only file 
把所有的命令以redis命令请求协议的格式完全持久化存储,保存为aof文件。

1、数据安全,aof持久化可以配置appendfsync属性,有always,每进行一次命令操作就记录到aof文件中。
2、通过append模式写文件,中途服务器宕机,可通过redis-check-aof工具解决数据一致性问题。

3 rewrite模

AOF文件比RDB文件大,且恢复速度慢。

常见性能问题和解决方案

1、Master最好不要写内存快照,如果Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务
2、如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
3、为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网
4、尽量避免在压力很大的主库上增加从
5、主从复制不要用图状结构,用单向链表结构更为稳定,
即:Master <- Slave1 <- Slave2 <- Slave3 
如果Master挂了,可立刻启用Slave1做Master 

过期键的删除策略
1、定时删除:在设置键的过期时间的同时,创建一个定时器timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作。
2、惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
3、定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。


回收策略(淘汰策略)?
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据

volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,
lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。


使用策略规则

1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random


为什么redis需要把所有数据放到内存中?
为了达到最快的读写速度将数据都放到内存中,并通过异步的方式将数据写入磁盘。
如果不将数据放在内存中,磁盘I/O会严重影响性能。


同步机制
支持主从同步,从从同步。
第一次同步时,主节点做一次bgsave,将后续修改操作记录到内存buffer,
将rdb文件全量同步到复制节点,复制节点接受完成后将rdb镜像加载到内存。
加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。



Pipeline 
批量执行命令,前提是执行的指令之间没有依赖关系。


Redis集群
1 Redis Sentinal 高可用,在master宕机时自动将slave提升为master 
2 Redis Cluster 扩展性,使用Cluster进行分片存储。


Redis Java客户端 
Redisson、Jedis、lettuce等,官方推荐使用Redisson。

设置密码及验证密码
设置密码:config set requirepass 123456
授权密码:auth 123456


哈希槽 
Redis集群有16384个哈希槽,
每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

Redis集群最大节点个数  16384


Redis的连通性测试 ping命令

Redis事务相关的命令 MULTI、EXEC、DISCARD、WATCH

key的过期时间和永久有效设置 EXPIRE和PERSIST


回收进程如何工作
一个客户端运行了新的命令,添加了新的数据。
检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。


Redis内存用完了会发生什么
如果达到设置的上限,写命令会返回错误信息(读命令可以正常返回)
或者可以将Redis当缓存来使用配置淘汰机制 

一个Redis实例最多能存放多少的keys?
理论上可以处理多达2^32的keys,存储极限是系统中的可用内存值。

MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
设置合适的淘汰策略



Redis适合的场景?
1 会话缓存(Session Cache)
2 全页缓存(FPC)
3 队列
4 排行榜/计数器
5 发布/订阅  社交 聊天系统

上一篇     下一篇
threadlocal实例及原理

使用int作为key的IntHashMap

netty高性能要点

从高级程序员到CTO

java对象内存占用大小计算

spring循环依赖