Redis常用数据的基础操作
一、使用redis前提准备
1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置文件
spring:
redis:
host: ${sky.redis.host}//配置访问地址 本地 localhost
port: ${sky.redis.port}//配置端口 默认 6379
database: ${sky.redis.database}//配置连接的redis表 默认自动生成16张表,不设置默认第一张表。
3.创建配置类
/**
* 配置类 获取redis对象 --> 获取对象后进行基本操作
*/
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
log.info("开始创建redis模板对象....");
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key value的序列化器 字符串类型
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
Redis常用数据类型
redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
字符串string
哈希hash
列表list
集合set
有序集合sorted set/zset
二、Redis常用数据类型的基础命令和对应java的实现操作
1.redis中字符串命令
SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key seconds value 设置指定key的值,并将key的过期时间设为seconds秒
SETNX key value 只有在key不存在时设置key的值
java中对redis的字符串操作
//java中操作redis的字符串的代码
@Test
public void testString(){
//获取操作对象
ValueOperations valueOperations = redisTemplate.opsForValue();
//set get
valueOperations.set("姓名","吴通");
String name = (String) valueOperations.get("姓名");
System.out.println(name);
//有效期变量
valueOperations.set("code","1234",3, TimeUnit.MINUTES);
//是否存在变量 没有创建,有则不创建。
valueOperations.setIfAbsent("lock",1);
valueOperations.setIfAbsent("lock",2);
}
2.redis中哈希命令
redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,常用命令:
HSET key field value 将哈希表 key中的字段field 的值设为value
HGET key field 获取存储在哈希表中指定字段的值
HDEL keyfield 删除存储在哈希表中的指定字段
HKEYS key 获取哈希表中所有字段
HVALS key 获取哈希表中所有值
java中对redis的哈希操作
//java中操作redis的hash代码
@Test
public void testHash(){
HashOperations hashOperations = redisTemplate.opsForHash();
//设置值
hashOperations.put("20","name","狗");
hashOperations.put("20","age",17);
//获取值
String name = (String) hashOperations.get("20", "name");
System.out.println(name);
Set keys = hashOperations.keys("20");
System.out.println(keys);
List values = hashOperations.values("20");
System.out.println(values);
hashOperations.delete("20","name");
}
3.redis中列表命令
redis列表是简单的字符串列表,按照插入顺序排序,常用命令:
LPUSH key valuel [value2] 将一个或多个值插入到列表头部
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除并获取列表最后一个元素
LLEN key 获取列表长度
java中对redis的列表操作
//java中操作redis中list类型的数据
@Test
public void testList(){
//获取列表操作对象
ListOperations listOperations = redisTemplate.opsForList();
//对列表进行操作 左近右出
//单个插入
listOperations.leftPush("myList","ab");
//多个插入
listOperations.leftPushAll("myList","c","d","e");
//输出集合数据
List mylist = listOperations.range("myList", 0, -1);
System.out.println(mylist);
//右出数据 也就是删除插入的第一个数据
listOperations.rightPop("myList");
//列表数据个数
Long myListSize = listOperations.size("myList");
System.out.println(myListSize);
}
4.redis中集合命令
//java操作redis中set类型的数据
@Test
public void testSet(){
SetOperations setOperations = redisTemplate.opsForSet();
setOperations.add("set1","a","b","c","d");
setOperations.add("set2","a","b","x","y");
//包含的元素
Set set1 = setOperations.members("set1");
System.out.println(set1);
//大小
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");
}
5.redis中有集合命令
/**
* java中操作redis中sorted set集合类型的数据
*/
@Test
public void testSortedSet(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
zSetOperations.add("zSet","a",13);
zSetOperations.add("zSet","b",11);
zSetOperations.add("zSet","c",15);
//输出集合数据
Set zSet = zSetOperations.range("zSet", 0, -1);
System.out.println(zSet);
//指定value加上 15 + 10 = 25
zSetOperations.incrementScore("zSet","c",10);
//删除 value a b
zSetOperations.remove("zSet","a","b");
}
三、通用操作
/**
* 通用命令操作
*/
@Test
public void testCommon(){
//获取所有的key键
Set keys = redisTemplate.keys("*");
System.out.println(keys);
//判断是否存在该键 有则true 无则false
Boolean name = redisTemplate.hasKey("name");
Boolean set1 = redisTemplate.hasKey("set1");
//获取每个键的数据类型并输出
for (Object key : keys){
DataType type = redisTemplate.type(key);
System.out.println(type.name());
}
//删除整个myList集合
redisTemplate.delete("myList");
}
四、应用
当业务场景只需要一个字段属性的时候,直接在数据库创建一个单独的表来维护这个属性值不推荐。所以用到redis数据库,直接在controller中设置和获取业务逻辑需要的数据。–redis的数据完全是存储在内存中的
@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Slf4j
public class ShopController {
@Autowired
RedisTemplate redisTemplate;
//设置店铺状态
@PutMapping("/{status}")
public Result setStatus(@PathVariable Integer status){
log.info("设置店铺的状态为:{}",status == 1 ? "营业中":"打烊中");
//设置状态 用redis数据库 -- string类型数据存储
redisTemplate.opsForValue().set(ShopConstant.KEY,status);
return Result.success();
}
//获取店铺状态 并在前端页面显示接收的状态
@GetMapping("/status")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get(ShopConstant.KEY);
log.info("接收设置店铺的状态为:{}",status == 1 ? "营业":"打烊");
return Result.success(status);
}
}