1. Redis介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
2. Spring整合Redis
<!--spring整合redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
3. Redis命令
String类型
Hash类型
说明:可以用散列类型保存对象和属性值
例子:User对象{id:2,name:小明,age:19}
List类型
说明:Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据.
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同
set类型
https://www.runoob.com/redis/redis-sets.html
redis事务
redis中操作可以添加事务的支持.一项任务可以由多个redis命令完成,如果有一个命令失败导致入库失败时.需要实现事务回滚.
虽然redis提供了事务操作.但是该事务是一种弱事务,只对单台redis有效.如果有多台redis,如果需要使用事务控制,则一般使用队列的形式
4. 特殊的redis方法
redis.ip=192.168.126.129
redis.port=6379
控制反转,容器管理Jedis
package com.jt.redisConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import lombok.Data;
import redis.clients.jedis.Jedis;
@Configuration
@PropertySource("classpath:/properties/redis.properties")
@ConfigurationProperties(prefix="redis")
@Data
public class RedisConfig {
private String ip;
private int port;
@Bean
public Jedis jedis() {
return new Jedis(ip,port);
}
}
4.1 SetEX()
@Test
public void setExTest() throws InterruptedException {
jedis.setex("www", 5, "超时测试");
}
@Test
public void getExTest() {
//等待五秒再次查询
System.out.println(jedis.get("www"));//null
}
4.2 SetNX()
@Test
public void getNxTest() {
//如果key不存在时,则赋值
jedis.setnx("a", "123");
jedis.setnx("a", "456");
System.out.println(jedis.get("a"));//123
}
4.3 SetParams
import redis.clients.jedis.params.SetParams;
/**
* 1.保证超时时间的原子性操作 EX
* 2.保证如果key存在,则不允许赋值. NX
* 要求:又满足超时定义,同时满足数据不允许修改
* SetParams:参数
* EX:秒
* PX:毫秒
* NX:有值不修改
* XX:如果key不存在,则数据不修改. 只有key存在时,修改
*/
@Test
public void testStringEXNX() {
SetParams setParams = new SetParams();
setParams.ex(20).xx();
jedis.set("a", "66666666", setParams);
System.out.println(jedis.get("a"));
}
4.4 Hash操作
/**
* 一般将有关联关系的数据利用hash方式进行保存.
* orderId:
* userid:下单用户
* price: xxxxx
* items: [xxxxxx,xxxxxx]
* orderShipping: xxxxxxx
*/
@Test
public void testHash() {
jedis.hset("hash", "id", "100");//{name=abc, id=100}
jedis.hset("hash", "name", "abc");
System.out.println(jedis.hgetAll("hash"));
System.out.println(jedis.hkeys("hash"));//[name, id]
System.out.println(jedis.hvals("hash"));//[100, abc]
}
4.5 SET集合
@Test
public void testSet() {
jedis.sadd("set1", "1","2","3");
jedis.sadd("set2", "3");
//求差集
System.out.println(jedis.sdiff("set1","set2"));//[1,2]
//返回所有集合元素
System.out.println(jedis.smembers("set1"));//[1,2,3]
}
4.6 List集合
@Test
public void testList() {
//从左入队
jedis.lpush("list", "1","2","3","4","5");
//取出右边第一个数据
String value = jedis.rpop("list");
System.out.println(value);//1
}
4.7 Redisd事务控制
@Test
public void testTX() {
Transaction transaction = jedis.multi(); //开始事务
try {
transaction.set("a", "a");
transaction.set("b", "b");
//int a = 1/0;
transaction.exec(); //提交事务
} catch (Exception e) {
e.printStackTrace();
transaction.discard(); //事务回滚
}
}