redis
- 开启redis进程 redis-server redis.windows.conf
- 端口号6379
- 连接客户端
- redis-cli 增加参数 --raw ,可以强制输出中文,不然会乱码
- Flushall:清空全部的库
- Flushdb:清空当前库
- redis几种数据类型
- List
@GetMapping("/list")
public List<String> listTest(){
ListOperations<String,String> listOperations = redisTemplate.opsForList();
listOperations.leftPush("list","hello");
listOperations.leftPush("list","world");
listOperations.leftPush("list","java");
List<String> list = listOperations.range("list",0,2);
return list;
} - set
@GetMapping("/set") public Set<String> setTest(){ SetOperations<String,String> setOperations = redisTemplate.opsForSet(); setOperations.add("set","hello"); setOperations.add("set","hello"); setOperations.add("set","word"); setOperations.add("set","word"); Set<String> set = setOperations.members("set"); return set; }
- hash
@GetMapping("hash") public void hashTest(){ HashOperations<String,String,String> hashOperations = redisTemplate.opsForHash(); hashOperations.put("key","hashkey","hello"); System.out.println(hashOperations.get("key","hashkey")); } }
- String
redisTemplate.opsForValue().get("")
- zset
//zset 有序集合 @GetMapping("/zset") public Set<String> zserTest(){ ZSetOperations<String,String> zSetOperations = redisTemplate.opsForZSet(); zSetOperations.add("zset","hello",1); zSetOperations.add("zset","world",2); zSetOperations.add("zset","java",3); Set<String> zset =zSetOperations.range("zset",0,2); return zset; }
- redis对字符串的常用命令
- set 设置 get 获取 del 删除
- mset mget设置获取多个key/val
- incr incrby decr decrby 加/减
- setnx msetnx 设置新的key/val key必须是原来不存在的
- setex 对一个key设置有效时间 和val
- append 在一个key的val上追加一个值,如果这个key不存在就是执行set
- 默认16个库
- redis对列表的操作
- 将一个或多个值插入到列表头部:lpush list
- 将一个或多个值插入到列表尾部:rpush list
- 返回列表中指定区间内的元素,lrange
- lrange list 0 -1 返回列表数据中的所有结果;
- lrange list 2 3 返回下标2到3,包括2,3;
- 移除并返回列表的第一个元素:lpop list (当列表key不存在时,返回nil);
- 移除列表的最后一个元素,返回值为移除的元素 :rpop list;
- 安装索引下标获得元素:lindex(-1代表最后一个,0代表第一个); lindex list 0;
- 返回列表的长度:llen list;
- 移除列表中与参数value相同的元素,并且可以指定删除的个数 : lrem list 1 zhangsan
- 对列表进行修剪,让列表保留指定区间内的元素,不在指定区间的元素被删除:ltrim list 1 2 (list区间1到2的保留);
- 移除列表的最后一个元素,并将该元素添加到另一个列表并返回;rpoplpush list newlist;
- 将列表key下标为index的元素的值设置为value, lset list 1 zhangsan;
- 在列表的元素前或后插入元素 :linsert list before zhangsan lisi 在shangsan前面插入lisi;
- 事务
- 开启事务 MULTI,提交事务exec;
- 不保证原子性,redis是乐观锁,没有隔离级别概念;
- 使用watch检测balance,事务期间balance数据变动,事务执行失败;
- 持久化
- RDB:save 命令或bgsave;自动持久化
- 优势:速度快,适合大规模的数据恢复,对数据完整性和一致性要求不高更适合使用,节省磁盘空间;
- 缺点:在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改;
- AOF:将命令存到文件中,出现意外时会重新执行该文件;
- 注解
- @EnableCaching //开启cache(本质是AOP开启增强函数),一般在main函数所在主配置加入;
- @CacheConfig //提取注解公共属性;
- 例如:@CacheConfig(cacheNames=“techntxt”)
- @Cacheable //查询结果(必须是一个序列化类)按键值放入Cache中
- 例如:@Cacheable(cacheNames= "techntxt",key= "#root.methodName+'" +."('+#p page now+#p page size+#p ClssId" +"+#p Key string+#p Passed+#p UserId+')";
- @Cacheable( cacheNames={"emp"},key = "#root .methodName+'_'+#id");
- @CachePut //提交数据按key值存入缓存,不会判断,直接存入
- @CacheEvict //清空缓存
- 发布订阅
- SUBSCRIBE easychanel订阅;
- PUBLISH easychanel hello发布消息;
- 订阅了就可以收到发布的消息;
- 主从复制
- 主库和从库,读写分离,降低服务器的压力,从库读,主库写;
- 从库只能读不能去写;
- 定义从库在redis文件夹中redis.windows.conf文件中加slaveof 127.0.0.1 6379 连接主库;
- 哨兵模式
- 主服务器宕机会重新选一个从机当作主服务器;
- redis做一级缓存(如果对象不会被修改,并且访问量很高就可以用redis做一级缓存)
- 在pom文件导入依赖;
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>5.0.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.6.6</version> </dependency>
- 在yml文件中连接redis;
spring: redis: host: 127.0.0.1 port: 6379
- 创建实体类,实现序列化接口,否则无法存入Redis数据库;
- ## 在service实现类中加@Cacheable(cacheNames="user",key="#p0)注解;cacheNames代表要存储的key值
- @Cacheable的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存;
- value :缓存多的名称,在spring配置文件中定义,必须指定至少一个;
- 在启动类中加@EnableCaching注解;
- 在service层;
@Resource
private RedisTemplate redisTemplate;@Override //查
public Applicant querySingle(int id){
Applicant applicant = (Applicant) redisTemplate.opsForValue().get("applicant_"+id);
if(applicant!=null){
return applicant;
}else {
Applicant applicant1 = applicantMapper.selectById(id);
redisTemplate.opsForValue().set("applicant_"+id,applicant1);
return applicant1;
}
}@Override //增
public void addApplicant(Applicant applicant) {
redisTemplate.opsForValue().set("applicant_"+applicant.getId(),applicant);applicantMapper.save(applicant);
}@Override //改
public void updateApplicants( Applicant applicant) {
redisTemplate.opsForValue().set("applicant_"+applicant.getId(),applicant);
applicantMapper.updateById(applicant);
}@Override //删除
public void deleteApplicant(Integer id) {
redisTemplate.delete("applicant_"+id);
applicantMapper.deleteById(id);
} - 也可以用redisTemplate做定时任务
/**
* 获取指定key的剩余时间
*/
@GetMapping("getOrderTime")
public CommonResult<Long> getOrderTime(String orderId){
Long expire = redisTemplate.getExpire(orderId);
return CommonResult.success(expire);
}
/**
* 订单定时
*/
@GetMapping("addOrder")
public CommonResult addOrder(){
redisTemplate.opsForValue().set("orderid123","添加的订单", Duration.ofMinutes(30L));
return CommonResult.success();
}
- cache方法
- yml文件中往redis中缓存
redis: host: 127.0.0.1 port: 6379 database: 0 cache: type: redis
- pom文件中添加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
- 在启动类添加 @EnableCaching
- value"在service的方法上加@Cacheable注解,
@Cacheable(value = "applicant",key = "'getApplicantList'")
@Override
public List<Applicant> getApplicantList() {
System.out.println("getApplicantList方法被调用");
return applicantMapper.selectList(null);
} - 当数据发生增、删、改变化时,就把缓存区的数据删掉,然后重新执行方法获取新的缓存;
@CacheEvict(value = "applicant",allEntries = true) @Override public void updateApplicants( Applicant applicant) { redisTemplate.opsForValue().set("applicant_"+applicant.getId(),applicant); applicantMapper.updateById(applicant); } @CacheEvict(value = "applicant",allEntries = true) @Override public void addApplicant(Applicant applicant) { redisTemplate.opsForValue().set("applicant_"+applicant.getId(),applicant); applicantMapper.save(applicant); } // 删除时,删除单个id,删除的东西即在getApplicantlist又在querySingle+#id中,所以直接删除前面的value @CacheEvict(value = "applicant",allEntries = true)
@Override
public void deleteApplicant(Integer id) {
//redisTemplate.delete("applicant_"+id);
applicantMapper.deleteById(id);
} - 对于单个id查询,在service层方法上加
@Cacheable(value = "applicant",key="'querySingle'+#id")
- 对于多参数的用","拼接;
- redisTemplate自定义
- redisTemplate默认jdk序列化,想要自定义序列化方式,就要自定义redisTemplate