文章目录
- Redis学习
- Redis简介
- 准备工作
- Redis常用数据类型介绍
- 各数据类型的特点
- Redis常用命令
- 字符串操作命令
- 哈希操作命令
- 列表操作命令
- 集合操作命令
- 有序集合操作命令
- 通用操作命令
- 在Java中操作Redis
- 导入Spring Data Redis坐标
- 配置Redis数据源
- 编写配置类,创建RedisTemplate对象
- 通过RedisTemplate对象操作Redis
- 店铺营业状态设置
- 产品需求分析
- 设置营业状态
- 代码实现
Redis学习
Redis简介
Redis是一个基于内存的key-value 结构数据库。
- 基于内存存储,读写性能高
- 适合存储热点数据(热点商品、资讯、新闻)
- 企业应用广泛
准备工作
启动redis并与本地服务器连接
双击redis-server.exe文件,之后可以双击redis-cli.exe或redis-cli.exe -h localhost -p 6379与本地服务器连接
下载Another Redis作为图形化工具使用
Redis常用数据类型介绍
各数据类型的特点
Redis常用命令
字符串操作命令
在redis中设置一个指定的key值
设置一个key值以及过期时间
到时会自动删除key
只有在key不存在时才可以赋值
哈希操作命令
列表操作命令
LPUSH可形象类比为头插法
删除队尾的值
集合操作命令
有序集合操作命令
通用操作命令
在Java中操作Redis
导入Spring Data Redis坐标
POM文件中导入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置Redis数据源
application.yml中配置,在spring下面添加。dev中填写真正的数据类
redis:
host: ${sky.redis.host}
port: ${sky.redis.port}
database: ${sky.redis.database}
编写配置类,创建RedisTemplate对象
在config类中新建对象
package com.sky.config;
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate redisTemplate = new RedisTemplate();
//设置Redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置Redis中key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
在上述的 Redis 配置代码中,redisTemplate.setKeySerializer(new StringRedisSerializer()); 设置了 Redis 中 key 的序列化器为 StringRedisSerializer。这是因为 Redis 的 key 通常是字符串,为了方便人类阅读和理解,使用字符串的序列化器将 key 转换为字符串形式存储在 Redis 中。
使用适当的序列化器对于在分布式系统中传输和存储对象是非常重要的。它确保了对象能够以可靠的方式被转换为字节流,并且在反序列化时能够正确还原。选择合适的序列化器也可以影响性能,因为不同的序列化方式有不同的效率和序列化大小。
通过RedisTemplate对象操作Redis
新建测试类进行测试
package com.sky.test;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@SpringBootTest
public class SpringDataRedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRdisTemplate(){
System.out.println(redisTemplate);
//操作字符串
ValueOperations valueOperations = redisTemplate.opsForValue();
//操作哈希
HashOperations hashOperations = redisTemplate.opsForHash();
ListOperations listOperations = redisTemplate.opsForList();
SetOperations setOperations = redisTemplate.opsForSet();
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
}
/**
* 操作字符串数据
*/
@Test
public void testString(){
//set get setex setnx
redisTemplate.opsForValue().set("city", "boy");
String city = (String)redisTemplate.opsForValue().get("city");
System.out.println(city);
redisTemplate.opsForValue().set("code", "123456", 3, TimeUnit.MINUTES);
redisTemplate.opsForValue().setIfAbsent("lock", "1");
redisTemplate.opsForValue().setIfAbsent("lock", "2");
}
/**
* 操作哈希的数据
*/
@Test
public void testHash(){
//Hset hget hdel hkeys hvals
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.put("100", "name", "jimmy");
hashOperations.put("100", "age", "20");
String name = (String) hashOperations.get("100", "name");
System.out.println(name);
Set keys = hashOperations.keys(100);
System.out.println(keys);
List values = hashOperations.values("100");
System.out.println(values);
hashOperations.delete("100", "age");
}
/**
* 操作列表数据
*/
@Test
public void testList(){
//lpush lrange rpop llen
ListOperations listOperations = redisTemplate.opsForList();
listOperations.leftPushAll("mylist", "a","b","c");
listOperations.leftPush("mylist", "d");
List mylist = listOperations.range("mylist", 0, -1);
System.out.println(mylist);
listOperations.rightPop("mylist");
Long size = listOperations.size("mylist");
System.out.println(size);
}
/**
* 集合类型操作
*/
public void testSet(){
//sadd smembers scard sinter srem
SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("set1", "a","b","c","d");
setOperations.add("set2", "a","b","x","y");
Set members = setOperations.members("set1");
System.out.println(members);
Long size = setOperations.size("set1");
System.out.println(size);
Set intersect = setOperations.intersect("set1", "set2");
System.out.println(intersect);
Set union = setOperations.union("set1", "set2");
System.out.println(union);
setOperations.remove("set1", "a","b");
}
}
店铺营业状态设置
产品需求分析
设置营业状态
代码实现
首先了解一下
@PutMapping、@PostMapping、@GetMapping 分别对应不同的 CRUD
@PutMapping: 对应于更新操作(Update)。通常用于修改已存在的资源。在 RESTful 风格的 API 中,对应于 HTTP PUT 请求。
@PostMapping: 对应于创建操作(Create)。通常用于新建资源。在 RESTful 风格的 API 中,对应于 HTTP POST 请求。
@GetMapping: 对应于读取操作(Read)。通常用于获取已存在的资源。在 RESTful 风格的 API 中,对应于 HTTP GET 请求。
新建两个Controller,通过@RestController后加的值做区分。
package com.sky.controller.admin;
import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {
@Autowired
private RedisTemplate redisTemplate;
public static final String KEY = "SHOP_STATUS";
/**
* 设置店铺营业状态
* @param status
* @return
*/
@PutMapping("/{status}")
@ApiOperation("设置店铺营业状态")
public Result setStatus(@PathVariable Integer status){
redisTemplate.opsForValue().set(KEY, status);
return Result.success();
}
/**
* 获取店铺营业状态
* @return
*/
@GetMapping("/{status}")
@ApiOperation("获取店铺营业状态")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
return Result.success(status);
}
}
package com.sky.controller.user;
import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController("userShopController")
@RequestMapping("/user/shop")
@Api(tags = "店铺相关接口")
@Slf4j
public class ShopController {
@Autowired
private RedisTemplate redisTemplate;
public static final String KEY = "SHOP_STATUS";
/**
* 获取店铺营业状态
* @return
*/
@GetMapping("/{status}")
@ApiOperation("获取店铺营业状态")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
return Result.success(status);
}
}