Redis入门
Redis简介
基于内存的key-value结构数据库,读写性能高,适合存储热点数据(热点商品,资讯,新闻),企业应用广泛
Redis下载与安装
安装包分为Windows和Linux版
Redis的Windows版属于绿色软件,直接解压即可使用,
Redis的启动与停止
在安装目录下,输入cmd开启命令行窗口,输入redis-server.exe redis.windows.conf启动Redis服务,默认端口号6379,按下Ctrl+c,停止服务
在安装目录下,输入cmd开启命令行窗口,输入redis-cli.exe,开启客户端,连接Redis服务,默认连接本地Redis,使用本地端口号6379,exit停止连接
Redis的设置
使用redis-cli.exe -h localhost -p 6379选择连接哪一个Redis服务,哪一个端口
修改#requirepass foobared 设置连接密码,foobared为密码,
(error) NOAUTH Authentication required.未认证需要提供密码
redis-cli.exe -h localhost -p 6379 -a 123456, -a XXXXX 输入密码
Redis数据类型
5种常用数据类型及各数据类型特点
Redis存储的是key-value结构数据,其中key是字符串类型,value有5种常用数据类型:
- 字符串 (String):普通字符串,Redis中最简单的数据类型
- 哈希 (hash):也叫散列,类似Java中的HashMap结构
- 列表(list):按照插入顺序排序,可以有重复元素,类似Java中的LinkedList结构
- 集合(set):无序集合,无重复元素,类似Java中的HashSet结构
- 有序集合(sorted set/zset):集合中每个元素关联一个分数(score),根据分数升序排序,无重复元素
Redis常用命令
字符串操作命令
哈希操作命令
列表操作命令
集合操作命令
有序集合操作命令
通用操作命令
在Java中操作Redis
Redis的Java客户端
常见的几种:
- Jedis
- Lettuce
- Spring Data Redis
Spring Data Redis 是 Spring的一部分,对Redis底层开发进行了高度封装,在Spring项目中,可以使用Spring Data Redis进行操作
Spring Data Redis的使用方式
- 导入Spring Data Redis的maven坐标
- 配置Redis数据源
- 编写配置类,创建RedisTemplate对象
- 通过RedisTemplate对象操作Redis
Java操作String类型数据
/**
* 操作字符串类型数据
*/
@Test
public void testString() {
//set get setex setnx
//得到字符串操作对象
ValueOperations stringOps = redisTemplate.opsForValue();
stringOps.set("name", "小明");
String city = (String) stringOps.get("city");
System.out.println(city);
stringOps.set("code", "1234", 3, TimeUnit.MINUTES);
//传入任意类型数据,序列化为String类型存储
stringOps.setIfAbsent("lock", "1");
stringOps.setIfAbsent("lock", "2");
}
Java操作哈希类型数据
/**
* 操作哈希类型数据
*/
@Test
public void testHash() {
//Hset Hget Hdel Hkeys Hvals
HashOperations hashOps = redisTemplate.opsForHash();
hashOps.put("100", "name", "tom");
hashOps.put("100", "age", "20");
String name = (String) hashOps.get("100", "name");
System.out.println(name);
Set keys = hashOps.keys("100");
System.out.println(keys);
List values = hashOps.values("100");
System.out.println(values);
hashOps.delete("100", "age");
}
Java操作其他类型数据
/**
* 操作列表类型数据
*/
@Test
public void testList() {
//Lpush Lrange rpop llen
ListOperations listOps = redisTemplate.opsForList();
listOps.leftPushAll("mylist", "a", "b", "c");
listOps.leftPush("mylist", "b");
List mylist = listOps.range("mylist", 0, -1);
System.out.println(mylist);
listOps.rightPop("mylist");
Long size = listOps.size("mylist");
System.out.println(size);
}
/**
* 操作集合类型数据
*/
@Test
public void testSet() {
//sadd smembers scard sinter sunion srem
SetOperations setOps = redisTemplate.opsForSet();
setOps.add("set1", "a", "b", "c", "d");
setOps.add("set2", "a", "b", "x", "y");
Set members = setOps.members("set1");
System.out.println(members);
Long size = setOps.size("set1");
System.out.println(size);
Set intersect = setOps.intersect("set1", "set2");
System.out.println(intersect);
Set union = setOps.union("set1", "set2");
System.out.println(union);
setOps.remove("set1", "a", "b");
}
/**
* 操作有序集合类型数据
*/
@Test
public void testZset() {
//zadd zrange zincrby zrem
ZSetOperations zSetOps = redisTemplate.opsForZSet();
zSetOps.add("zset1", "a", 10);
zSetOps.add("zset1", "b", 12);
zSetOps.add("zset1", "c", 9);
Set zset1 = zSetOps.range("zset1", 0, -1);
System.out.println(zset1);
zSetOps.incrementScore("zset1", "c", 10);
zSetOps.remove("zset1","a","b");
}
/**
* 操作通用类型数据
*/
@Test
public void testCommon(){
//keys exists type del
Set keys = redisTemplate.keys("*");
System.out.println(keys);
Boolean name = redisTemplate.hasKey("name");
Boolean set1 = redisTemplate.hasKey("set1");
for (Object key :keys) {
DataType type = redisTemplate.type(key);
System.out.println(type.name());
}
redisTemplate.delete("mylist");
}
店铺营业状态设置
需求分析和设计
接口设计:
- 设置营业状态
- 管理端查询营业状态
- 用户端查询营业状态
营业状态存储方式:基于Redis的字符串来进行存储
代码开发
管理端
public class ShopController {
public static final String KEY = "SHOP_STATUS";
@Autowired
private RedisTemplate redisTemplate;
/**
* 设置店铺营业状态
*
* @param status
* @return
*/
@PutMapping("/{status}")
@ApiOperation("设置店铺营业状态")
public Result setStatus(@PathVariable Integer status) {
log.info("设置店铺营业状态:{}", status == 1 ? "营业中" : "打烊中");
//将店铺营业状态存到redis数据库中
redisTemplate.opsForValue().set(KEY, status);
return Result.success();
}
/**
* 查询店铺营业状态
*
* @return
*/
@GetMapping("/status")
@ApiOperation("查询店铺营业状态")
public Result<Integer> getStatus() {
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
log.info("查询店铺营业状态为:{}", status == 1 ? "营业中" : "打烊中");
return Result.success(status);
}
}
用户端
public class ShopController {
public static final String KEY = "SHOP_STATUS";
@Autowired
private RedisTemplate redisTemplate;
/**
* 查询店铺营业状态
*
* @return
*/
@GetMapping("/status")
@ApiOperation("查询店铺营业状态")
public Result<Integer> getStatus() {
Integer status = (Integer) redisTemplate.opsForValue().get(KEY);
log.info("查询店铺营业状态为:{}", status == 1 ? "营业中" : "打烊中");
return Result.success(status);
}
}