docker run –rm -p 6379:6379 redis –requirepass “password”
注意:redis-cli 连接需密码的server时,不输密码也可以进入命令模式,只有当执行命令时才报错。
Redis 安装启动
1 | mv redis.tar.gz /redis |
目录结构:
1 | /redis |
redis.conf
1 | port 6397 |
redis_init_script
1 |
|
运行起来没有看到pid文件,所以修改了stop分支。(原来只有daemonize yes时才有pid文件)
start
1 |
|
stop
1 |
|
主从复制
Redis-Server(Main)
- Redis-Server(Slave)
- Redis-Server(Slave)
- Redis-Server(Slave)
一台主机作为写入,三台从机作为读取,这样就缓解了主机的压力。
Redis支持两种方式的主从配置:
- redis.conf;
- cli.slaveOf(ip:port)
实验中发现即使kill -9 主机,从机还是可以读到值。只能证明Redis能处理kill方式的停机,并不能保证宕机时也能如此优雅。
Redis集群
大神的博客,需要好好拜读。
Redis实现锁的简单方法
SET key value [EX seconds] [PX milliseconds] [NX|XX]
1 | EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。 |
1 | package moc.oreh.common; |
此锁的特点:
- 独占式、不可重入;
- tryLock 响应中断的方式为直接返回false;
- EXPIRED_TIME_IN_SECONDS 为 60,可根据业务场景做相应修改;
为什么会这样设计?
借助Redis的set实现的锁,旨在于保持Redis高速特性的同时具有一定的并发控制,
- 没有重入场景;
- 没有wait、notify机制,并且wait具有时效性,可以不响应中断,但是为了方便停服务,所以直接return false;
- 为什么不使用set(key, token, “NX”)而要给锁加一个过期时间?是因为如果a、b共用一个Redis server,其中a突然挂了,那么a设置的key就永远都不过期,b就永远拿不到这个key的锁。
- redis server单节点,多节点情况下不保证一致性,所以一般使用zookeeper。
适用于竞争不激烈的场景,如果对锁的竞争很激烈,或者需要重入,请使用Redisson。
Redis 连接池
1 | JedisPoolConfig config = new JedisPoolConfig(); |
Redis-Client
redis client jedis
small、easy to use.
redis client redisson
感觉就像是对着jdk的API重写了一遍Redis版的实现一样。为了实现tryLock(time, timeUnit)接口,它在内部使用了Redis的pub/sub框架,这样就可以实现wait/notify机制,虽然原本我也想这么搞来着,但是这样的实现太“重”,现有业务暂时用不到。
redis client lettuce-core
看粉丝的数量远不如redisson,但是它跟redisson的功能不同,它更适合事件驱动的应用,底层用了netty。事件驱动的应用最适合用它了。