Redis学习笔记
一、环境搭建
1、下载
从官网下载redis
2、安装
- Redis运行环境安装(Redis基于C++)
yum install gcc-c++
- 解压
- 安装Redis,进入Redis解压目录下执行
make
# 然后执行
make install
-
从Redis解压目录下复制配置文件redis.conf到安装目录下/usr/local/bin
-
修改配置文件
redis默认不是后台启动的,daemonize改为yes
打开远程连接,注释掉bind
-
启动Redis
在安装目录/usr/local/bin下执行
redis-server redis.conf
即通过redis.conf配置文件来启动Redis
- 使用redis-cli连接指定的端口号测试,Redis的默认端口6379
redis-cli -p 6379
- 查看redis进程是否开启
- 关闭Redis服务
shutdown
- 断开连接
exit
- 开放端口号
firewall-cmd --zone=public --add-port=6379/tcp --permanent
- 重启防火墙
systemctl restart firewalld.service
二、性能测试
redis-benchmark:Redis官方提供的性能测试工具,参数选项如下:
例如:测试:100个并发连接 100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
三、常用命令
可以通过官网查看。
四、数据类型
Redis有八大数据类型
-
String
-
List(列表)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。 -
Set(集合)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。 -
Hash(哈希)
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 -
Zset(有序集合)
不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。
score相同:按字典顺序排序。
有序集合的成员是唯一的,但分数(score)却可以重复。 -
Geospatial(地理位置)
使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用。
有效的经度从-180度到180度。
有效的纬度从-85.05112878度到85.05112878度。
指定单位的参数 unit 必须是m(米)、km(千米)、mi(英里)、ft(英尺)。 -
Hyperloglog(基数统计)。
Redis HyperLogLog 是用来做基数(数据集中不重复的元素的个数)统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。
因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
其底层使用string数据类型
应用场景(需要允许容错):访问量(UV):一个用户多次访问,也只能算作一个人 -
BitMaps(位图)
使用位存储,信息状态只有 0 和 1
Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。
应用场景:签到统计、状态统计……
五、事务
Redis的单条命令是保证原子性的,但是redis事务不能保证原子性,也没有隔离性。
1、Redis事务操作过程:
- 开启事务(multi)
- 命令入队
- 执行事务(exec)/ 取消事务(discurd)
事务中的命令在加入时都没有被执行,直到提交时才会开始执行(Exec)一次性完成。
27.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set k1 v1 # 命令入队
QUEUED
127.0.0.1:6379> set k2 v2 # ..
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> keys *
QUEUED
127.0.0.1:6379> exec # 事务执行
1) OK
2) OK
3) "v1"
4) OK
5) 1) "k3"
2) "k2"
3) "k1"
- List item
2、事务错误:
- 代码语法错误(编译时异常)所有的命令都不执行
- 代码逻辑错误 (运行时异常) 其他命令可以正常执行 >>> 所以不保证事务原子性
3、监控
可以使用watch key监控指定数据,相当于乐观锁加锁。在多线程情况下监控数据是否有被其他线程修改。
注:每次提交执行exec后都会自动释放锁,不管是否成功
六、与spring boot整合
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置文件添加配置
spring:
redis:
host: 192.1168.10.128
port: 6379
- 定制RedisTemplate的模板
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
// 将template 泛型设置为 <String, Object>
RedisTemplate<String, Object> template = new RedisTemplate();
// 连接工厂,不必修改
template.setConnectionFactory(redisConnectionFactory);
/*
* 序列化设置
*/
// key、hash的key 采用 String序列化方式
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// value、hash的value 采用 Jackson 序列化方式
template.setValueSerializer(RedisSerializer.json());
template.setHashValueSerializer(RedisSerializer.json());
template.afterPropertiesSet();
return template;
}
}
- 测试
@SpringBootTest
class Redis02SpringbootApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
// redisTemplate 操作不同的数据类型,api和我们的指令是一样的
// opsForValue 操作字符串 类似String
// opsForList 操作List 类似List
// opsForHah
// 获取连接对象
//RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//connection.flushDb();
//connection.flushAll();
redisTemplate.opsForValue().set("mykey","kuangshen");
System.out.println(redisTemplate.opsForValue().get("mykey"));
}
}
七、redis.conf
-
容量单位不区分大小写,G和GB有区别
-
可以使用 include 组合多个配置问题
-
网络配置
-
日志输出级别
-
日志输出文件
-
持久化规则
RDB与AOF -
RDB文件相关
-
主从复制
-
Security模块中进行密码设置
-
客户端连接相关
最大客户端数量
最大内存限制
内存达到限制值的处理策略
处理策略一共有6种
volatile-lru:只对设置了过期时间的key进行LRU
allkeys-lru:删除lru算法的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl:删除即将过期的
noeviction:永不过期,返回错误 -
AOF相关部分
八、持久化
1、RDB
在指定时间间隔后,将内存中的数据集快照写入数据库 ;在恢复时候,直接读取快照文件,进行数据的恢复 ;
上图种配置的意思是在60s内操作达到10000次,或者300s内操作达到10次,或者在900s内操作达到1次,就将触发持久化。执行flushall、save命令,退出redis也会触发持久化。
默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。文件名可以在配置文件中进行自定义。
2、AOF
快照功能(RDB)并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、以及未保存到快照中的那些数据。 从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。
如果要使用AOF,需要修改配置文件:
修复.aof文件
redis-check-aof --fix
九、发布-订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
命令查看官方文档
十、Redis主从复制
1、配置
为从机配置主机
SLAVEOF host port # 主机IP和port
从配置文件配置(永久)
2、哨兵模式
配置文件 sentinel.conf
# Example sentinel.conf
# 哨兵sentinel实例运行的端口 默认26379
port 26379
# 哨兵sentinel的工作目录
dir /tmp
# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 1
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
#这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
#一个是事件的类型,
#一个是事件的描述。
#如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
#通知脚本
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh