根据狂神说Redis写下笔记以供复习
B站狂神说Redis!:https://www.bilibili.com/video/BV1S54y1R7SB
SpringBoot操作数据:spring-data jpa jdbc mongodb redis
说明:在SpringBoot2.x后,原来使用的jedis被替换成了lettuce
默认的RedisTemplate没有过多的设置, redis对象都是需要序列化
1.导入依赖
org.springframework.boot spring-boot-starter-data-redis
springboot 2.x后 ,原来使用的 Jedis 被 lettuce 替换。
-
jedis:采用的直连,多个线程操作的话,是不安全的。如果要避免不安全,使用jedis pool连接池!更像BIO模式
-
lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况!可以减少线程数据了,更像NIO模式
2.配置文件
# 配置redis spring.redis.host=39.99.xxx.xx spring.redis.port=6379
3.使用RedisTemplate
@SpringBootTest class Redis02SpringbootApplicationTests { @Autowired private RedisTemplate redisTemplate; @Test void contextLoads() { // redisTemplate 操作不同的数据类型,api和我们的指令是一样的 // opsForValue 操作字符串 类似String // opsForList 操作List 类似List // opsForHah // 除了基本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务和基本的CRUD // 获取连接对象 //RedisConnection connection = redisTemplate.getConnectionFactory().getConnection(); //connection.flushDb(); //connection.flushAll(); redisTemplate.opsForValue().set("mykey","kuangshen"); System.out.println(redisTemplate.opsForValue().get("mykey")); } }
如果没有序列化 会出现乱码
默认的序列化器是采用JDK序列化器
test:
@Test void test() throws JsonProcessingException { User user = new User("cangjian", 3); String jsonUser = new ObjectMapper().writeValueAsString(user); //使用ObjectMapper进行序列化 redisTemplate.opsForValue().set("user",jsonUser); System.out.println(redisTemplate.opsForValue().get("user")); }
创建一个pojo类 一般pojo类都会序列化
@Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { private String name; private int age; }
4.定制RedisTemplate的模板: 基本上模板是固定的
我们创建一个Bean加入容器,就会触发RedisTemplate上的条件注解使默认的RedisTemplate失效。
@Configuration public class RedisConfig { @Bean public RedisTemplateredisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { // 将template 泛型设置为 RedisTemplate 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; } }
这个不会覆盖掉原有的RedisTemplate 所以要自己指定名字
在自定义的redisTemplate的@Bean加上自定义的名字(“myRedisTemplate”)即 @Bean(“myRedisTemplate”)
然后在@Autowired 下面加一个 @Qualifier(“myRedisTemplate”) 就可以关联上了!!!
封装RedisUtils工具类因为每次都要opsXxx , 很烦 , 所以封装一些常用的方便使用!
package com.chen.redis.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @Component public class RedisUtil { @Autowired @Qualifier("myRedisTemplate") private RedisTemplateredisTemplate; // =============================common============================ public boolean expire(String key, long time, TimeUnit timeUnit) { try { if (time > 0) { redisTemplate.expire(key, time, timeUnit); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } public long getExpire(String key) { return redisTemplate.getExpire(key, TimeUnit.SECONDS); } public boolean hasKey(String key) { try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } } @SuppressWarnings("unchecked") public void del(String... key) { if (key != null && key.length > 0) { if (key.length == 1) { redisTemplate.delete(key[0]); } else { redisTemplate.delete((Collection ) CollectionUtils.arrayToList(key)); } } } // ============================String============================= public Object get(String key) { return key == null ? null : redisTemplate.opsForValue().get(key); } public boolean set(String key, Object value) { try { redisTemplate.opsForValue().set(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } public boolean set(String key, Object value, long time) { try { if (time > 0) { redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); } else { set(key, value); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } public long incr(String key, long delta) { if (delta < 0) { throw new RuntimeException("递增因子必须大于0"); } return redisTemplate.opsForValue().increment(key, delta); } public long decr(String key, long delta) { if (delta < 0) { throw new RuntimeException("递减因子必须大于0"); } return redisTemplate.opsForValue().increment(key, -delta); } // ================================Map================================= public Object hget(String key, String item) { return redisTemplate.opsForHash().get(key, item); } public Map
全部封装 ,巨多!
Redis.conf解读容量单位不区分大小写,G和GB有区别
1k ==> 1000 bytes
1kb ==>1024 bytes
1m ==>1000000 bytes
1mb ==>1024*1024 bytes
1g ==>100000000 bytes
1gb ==>1024 * 1024 * 1024 bytes
可以使用include组合多个配置文件
include .pathtolocal.conf
include c:pathtoother.conf
网络配置
ip 绑定 : bind 127.0.0.1
保护模式(默认开启):protected-mode yes
端口:port 6379
日志输出级别
loglevel notice
日志输出文件
logfile=“” #可以自定义文件名
持久化规则
两种持久化操作 : RDB AOF
save 900 1 #900秒内至少1个key进行了修改 ,就进行持久化
save 300 10
save 60 10000
RDB文件相关
持久化错误继续工作:stop-writes-on-bgsave-error yes
是否压缩rdb文件 : rdbcompression yes
校验rdb文件:rdbchecksum yes
rdb文件的保存目录 dir ./
密码设置
requirepass “”
客户端相关
最大客户端数量 : maxclients 10000
最大内存限制 : maxmemory
内存到达限制值的处理策略 : maxmemory-policy noeviction
默认过期策略是 volatile-lru
AOF 相关
默认不开启AOF : appendonly no
默认文件名 : appendfilename “appendonly.aof”
数据同步策略 : appendfsync everysec