根据狂神说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 RedisTemplate redisTemplate(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 RedisTemplate redisTemplate;
// =============================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



