线程模型
单线程模型,文件事件处理器通过IO多路复用 监听多个socket(socket执行accept read write close等操作产生文件事件),然后由文件事件处理器处理文件事件。
持久化方式
rdb:快照
1 | save 900 1 |
aof: 默认配置的是 appendonly no,改成yes打开AOF模式
如何连接Redis
1~使用实现了一致性哈希算法的proxy中间件twemproxy
2~Java使用Jedis、ShardedJedis、JedisPool、JedisSentinelPool(哨兵模式)或JedisCluster(Redis cluster模式)连接redis
Jedis 2.9.1存在的一个bug: https://blog.csdn.net/u013527895/article/details/103121558
Jedis加载redis集群的第一个节点如果异常不在线,并且redis设置了密码的话,会因连接异常退出不再尝试下一个节点。所谓第一个节点,就是所有redis节点加载到HashSet
1 | //src/main/java/redis/clients/jedis/JedisClusterConnectionHandler.java |
Jedis连接Redis代码参考
深入剖析Redis客户端Jedis的特性和原理: https://baijiahao.baidu.com/s?id=1715292157796722813&wfr=spider&for=pc
主从模式连接:Jedis
1 | import redis.clients.jedis.Jedis; |
多个redis实例(非cluster):ShardedJedis,一致性哈希算法
1 | import java.util.ArrayList; |
哨兵模式连接:JedisSentinelPool
1 | import redis.clients.jedis.JedisPoolConfig; |
cluster模式连接:JedisCluster,哈希槽算法
1 | import java.util.HashSet; |
集群操作
5.0版本之前使用redis-trib.rb ruby脚本操作redis集群,5.0以上统一使用redis-cli操作。
redis cluster半数以下的节点陆续下线后,集群仍可正常提供服务,节点重新上线后,节点上原master变成slave,后面不发生异常的话,不会自动调转过来。
创建redis-cluster
哨兵模式可参考:https://github.com/AliyunContainerService
多容器创建redis cluster:
Dockerfile:
1 | FROM redis |
redis.conf:
1 | #端口 |
docker-compose.yml:
1 | redis1: |
这里,其实可以让6个容器都保持默认6379端口,但宿主机端口不能重复。
cluster.sh:
1 |
|
entrypoint.sh:
1 |
|
构建、启动:
1 | [root@localhost redis-cluster]# docker build -t redis-cluster . |
连接redis1:
1 | [root@localhost redis-cluster]# docker run --rm -it redis redis-cli -h 172.17.0.2 -p 6381 |
stop/restart redis1:
1 | [root@localhost redis-cluster]# docker-compose stop redis1 |
master fail一个,对应的slave 172.17.0.5:6384变成新的master了。
重新上线redis1:172.17.0.5:6384,它是新master的slave了。
(待续)