第一次学习Redis,最后的目标是在idea中连接redis。看了别人的文献,但是是有自己思路的,主要是用于自己的学习。更高级的应用在以后进行进阶。
Redis是一个开源的、内存数据库,可以用作缓存、消息队列和流处理引擎。通常用来保存热点数据,提供高性能、低延迟的数据访问。它基于键值对的形式进行存储的。
注意:命令不严格区分大小写
select 2
dbsize
set username root
keys *
flushdb
flushall
exists username
move username 1
expire username 10
ttl username
type username
set username root
get username
append username root
strlen username
incr username
decr username
incrby username 10
decrby username 10
getrange username 0 2
setrange username 1 xxx
setex username 10 root
setnx username root
mset k1 v1 k2 v2 k3 v3
mset username root password root age 19
mget username password age
msetnx username root password root
getset username 123456
lpush list 1
lpush list 1 2 3
rpush list 1
rpush list 1 2 3
lrange list 0 -1
lpop list
rpop list
lindex list 3
llen list
lrem list 1 2
ltrim list 1 3
lset list 3 123456
linsert list before root rootFront
linsert list after root rootAfter
sadd set element
smembers set
sismember set element
srandmember set
srandmember set 2
spop set
smove set set2 element
sdiff set2 set
sinter set set2
sinter set set2
hset hash username root
hget hash username
hmset hash username root password root
hmget hash username password
hgetall hash
hdel hash username
hlen hash
hexists hash username
hkeys hash
hvals hash
hincrby hash views 1
hincrby hash age 1 年龄增加1岁
hsetnx hash password root
zadd zset 1 first
zadd zset 2 cat 3 dog 4 bird
zrange zset 0 -1
zrangebyscore zset -inf +inf
zrangebyscore zset -inf +inf withscores
zrangebyscore zset 5 10 withscores
zrem zset cat
zcard zset
zrevrange azet 4 10
并没有和druid是同样的缩进,在dev里面配置实际的信息。
关键问题1
:什么是redis模板对象?
个人解析:redis模板对象是spring底层给我们封装好了redis的一系列命令操作,比如set、get,便于我们操作使用
关键问题2
:什么是连接工厂对象?
个人解析:我们配置了redis连接信息后,在java中封装读取redis的连接信息,便于读取和连接。
关键问题3
:什么是序列化器?
个人解析:序列化器负责将Java对象转换为字节数组(序列化)存储到redis中,以及字节数组转化为Java对象(反序列化),实现redis里面的数据与java对象的转换。如果没有,那么就会乱码。
代码如下:
@Slf4j
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
log.info("开始创建redis模板对象...");
RedisTemplate redisTemplate = new RedisTemplate();
// 1.设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 2.设置redis key序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
测试类如下:
// 报错的记得加上这个
@SpringBootTest(classes = SkyApplication.class)
public class Test01 {
@Autowired
private RedisTemplate redisTemplate;
/**
* 操作字符串:redisTemplate.opsForValue()
* 操作hash:redisTemplate.opsForHash()
* 操作列表:redisTemplate.opsForList()
* 操作集合:redisTemplate.opsForSet()
* 操作有序集合:redisTemplate.opsForZSet()
*/
@Test
public void test01(){
System.out.println( "开始测试:"+ redisTemplate);
// 操作的是字符串类型
redisTemplate.opsForValue().set("city","北京");
String city = (String) redisTemplate.opsForValue().get("city");
System.out.println(city);
redisTemplate.opsForValue().set("code", "1234",3, TimeUnit.MINUTES);
redisTemplate.opsForValue().setIfAbsent("lock", "1");
redisTemplate.opsForValue().setIfAbsent("lock", "2");
}
}
测试类如下:
/**
* 操作hash
*/
@Test
public void test02(){
HashOperations hashOperations = redisTemplate.opsForHash();
// 1.创建redis键值对
hashOperations.put("hashtable","username","root");
hashOperations.put("hashtable","password","root");
// 2.读取redis数据
String username = (String) hashOperations.get("hashtable","username");
String password = (String) hashOperations.get("hashtable","password");
// 3.打印一下
System.out.println(username);
System.out.println(password);
// 4.获得key
Set keys = hashOperations.keys("hashtable");
// 5.获得values
List values = hashOperations.values("hashtable");
System.out.println(keys);
System.out.println(values);
// 6.删除键值对
hashOperations.delete("hashtable","password");
}
测试代码:
/**
* 操作列表类型数据
*/
@Test
public void test03(){
ListOperations listOperations = redisTemplate.opsForList();
// 1.从头部插入
listOperations.leftPushAll("listdemo","a","b","c");
listOperations.leftPush("listdemo","d");
// 2.从尾部插入
listOperations.rightPushAll("listdemo","e","f");
listOperations.rightPush("listdemo","g");
// 3.获得整个list
List mylist = listOperations.range("listdemo", 0, -1);
System.out.println(mylist);
// 4.从头部弹出
listOperations.leftPop("listdemo");
// 5.从尾部弹出
listOperations.rightPop("listdemo");
// 6.获得list容量
Long size = listOperations.size("listdemo");
System.out.println(size);
测试代码:
/**
* 操作Set集合
*/
@Test
public void test04(){
SetOperations setOperations = redisTemplate.opsForSet();
// 1.从集合中添加元素
setOperations.add("setdemo","a","b","c");
setOperations.add("setdemo","a","e","f");
// 2.获得所有的元素
Set set = setOperations.members("setdemo");
// 3.获得集合的大小
Long size = setOperations.size("setdemo");
// 4.获得两个集合的交集
Set intersect = setOperations.intersect("setdemo", "set2");
System.out.println(intersect);
// 5.获得两个集合的并集
Set union = setOperations.union("setdemo", "set2");
System.out.println(union);
// 6.删除set里面的元素
setOperations.remove("setdemo","a","b");
// 7.获得差集
Set difference = setOperations.difference("setdemo", "set2");
System.out.println(difference);
}
代码如下:
/**
* 操作Zset有序集合
*/
@Test
public void test05(){
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
// 1.添加元素
zSetOperations.add("zsetdemo","a",10);
zSetOperations.add("zsetdemo","b",20);
zSetOperations.add("zsetdemo","c",30);
// 2.通过score索引元素
Set zset = zSetOperations.range("zsetdemo", 0, -1);
System.out.println(zset);
// 3.删除元素
zSetOperations.remove("zsetdemo","a","b");
// 4.增加元素的score
zSetOperations.incrementScore("zsetdemo","a",10);
}
在修改营业状态的时候,我们就不要用Mysql存储了,因为只有一个字段,如果我们为了一个营业状态创建一个表,显得杀鸡焉用牛刀,而且速度没有redis快,毕竟谁都想早点下班,所以我们用redis的内存存储快速存,快速取。由于没有涉及到数据模型Model层的运用就不用写service了。
代码示例:
@RestController("adminShopController")
@RequestMapping("/admin/shop")
@Slf4j
@Api(tags = "管理端营业信息接口")
public class ShopController {
@Autowired
private RedisTemplate redisTemplate;
/**
* 修改营业状态
* 我们没必要存储在mysql里面 就为了一个status 就只有一个字段 显得杀鸡焉用牛刀
* 我们通过redis的内存存储模式 快速存 快速取
* @param status
* @return
*/
@PutMapping("{status}")
@ApiOperation("修改管理端的营业信息接口")
public Result setStatus(@PathVariable("status") Integer status) {
log.info("修改管理端的营业接口,{}", status == 1 ? "营业中":"打烊中");
redisTemplate.opsForValue().set("SHOP_STATUS", status);
return Result.success();
}
@GetMapping("/status")
@ApiOperation("查询管理端营业状态接口")
public Result<Integer> getStatus(){
Integer status = (Integer) redisTemplate.opsForValue().get("SHOP_STATUS");
log.info("查询管理营业状态接口:{}", status == 1 ? "营业中":"打烊中");
return Result.success(status);
}
}
redis是一个nosql类型的数据库,它通过键值对的形式进行存储,特别适合用于存取热点信息,消息队列等,它通过内存存储的形式在RAM中,更适合零散的场景,不适合二维表的形式的存储,可以理解为mysql是长刀,redis是短刀,都有自己的用武之地,二者结合,是最佳的实践。