hello,本人ZH,最近读了《redis in action》这本书,对于redis有些初步了解,和大家分享一下。
公司一直在举办读书分享会,自建小组,每周轮流分享,ZH和同事就选择了《redis in action》这本书阅读,让我真正认识了redis,百度官方对redis的定义是:
Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
简单理解就是Redis是一个非关系型数据库,具有丰富的数据结构,可持久化,支持主从复制和集群等高级功能。
一. Spring Boot 中使用redis
1. 配置文件配置redis连接,在Service中直接@Autowired自动注入RedisTemplate
RedisTemplate和StringRedisTemplate的区别:
(1)两者的关系是StringRedisTemplate继承RedisTemplate。
(2)两者的数据是不共通的,StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
(3)SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存Redis数据库,这个时候打开Redis查看的时候,数据不是以可读的形式展现的,而是以字节数组显示
2. excute()与opsFor区别
(1)execute() 需要 RedisConnection 对象,通过 RedisConnection 操作 Redis 被称为低级抽象(Low-Level Abstractions)
(2)opsFor 之类的被称为高级抽象(High-Level Abstractions),是为了提供更友好的模板类,底层还是调用的 execute(),需要 RedisConnection 对象。所以我觉得 opsFor 就是对 execute() 的进一步封装。
Redis是采用基于C/S模式的请求/响应协议的TCP服务器。
性能问题一:redis客户端发送多条请求,后面的请求需要等待前面的请求处理完后,才能进行处理,而且每个请求都存在往返时间RRT(Round Trip Time),即使redis性能极高,当数据量足够大,也会极大影响性能,还可能会引起其他意外情况。
性能问题二:性能问题一,我们可以通过scan命令来解决,如何来设置count又是一个问题,设置不好,同样会有大量请求存在,即使设置到1w(推荐最大值),如果扫描的数据量太大,这个问题同样不能避免。每个请求都会经历三次握手、四次挥手,在处理大量连接时,处理完后,挥手会产生大量time-wait,如果该服务器提供其他服务,可能对其他服务造成影响。
4. redis一些关于SessionCallback和事务要注意的地方
stringRedisTemplate.executePipelined(new SessionCallback<Object>() {
@Override
public Object execute(RedisOperations ro) {
BoundHashOperations hashOps = stringRedisTemplate.boundHashOps("key");
hashOps.put("url", "url");
hashOps.put("name", "liming");
hashOps.put("age", "10");
return null;
}
});
正常情况下操作一次命令连接一次redis,executePipelined管道,执行一次redis连接,批量操作命令;
BoundHashOperations获取的key值如果不存在,返回一个空值的对象(不是null),
Map map = hashOPs.entries();返回的是size是0的对象