目录
SpringDataRedis操作string类型,通过RedisTemplate模板对象来获取ValueOperations对象来操作String类型
Jedis
jedis属于java技术的客户端操作redis客户端
使用第一步:导入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
使用
public class JedisTest {
@Test
public void test(){
try (Jedis jedis = new Jedis("192.168.230.130", 6379)) {//自动释放资源
jedis.set("name", "hhh");
System.out.println(jedis.get("name"));
jedis.hset("person","name","hhh");
System.out.println(jedis.keys("*"));
Map<String, String> person = jedis.hgetAll("person");
person.forEach((key,value)-> System.out.println(key+"->"+value));
}
}
}
SpringDataRedis
第一步:创建SpringBoot项目
第二步:导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
第三步:通过application.yml来配置redis
spring:
redis:
host: 192.168.230.100
port: 6379
database: 0 #操作的是0号数据库
应用
SpringDataRedis操作string类型,通过RedisTemplate模板对象来获取ValueOperations对象来操作String类型
@SpringBootTest
class SpringDay9SpringdataRedisApplicationTests {
//从SpringIoC容器中直接获取
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString(){
//根据模板对象redisTemplate获取操作String类型的ValueOperations对象
ValueOperations valueOperations = redisTemplate.opsForValue();
//1.存数据和取数据
valueOperations.set("name","hqi");
Object value = valueOperations.get("name");
System.out.println("value="+value);
//2.存值和设置过期时间
valueOperations.set("address","bj",10, TimeUnit.SECONDS);//存活时间为10秒
//3.如果key存在就修改原value值,不存在则不执行
//即存在才执行
valueOperations.setIfPresent("address","tj");
//注意:修改value值之后,之前设置的过期时间就会失效
//4.如果key存在就不会修改原value值,存在则不修改
//即不存在才执行
valueOperations.setIfAbsent("name","hhh");
}
我们可以发现这个键值前面多了一些序列化的东西,所以我们可以自己配置一个RedisTemplate模板对象再交给IoC容器管理
RedisTemplate模板对象默认的key序列化器为:JdkSerializationRedisSerializer 我们要改成StringRedisSerializer
@Configuration//告诉Spring这是一个配置类,并让Spring加载这个类
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
//默认的key序列化器为:JdkSerializationRedisSerializer
//我们改成StringRedisSerializer
//键序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
//值序列化
redisTemplate.setValueSerializer(new StringRedisSerializer());
//key hashMap序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
//value hashMap序列化
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
//连接工厂
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
}
正常:
SpringDataRedis操作hash类型
@Test
void testHash(){
//根据模板对象RedisTemplate获取HashOperations对象来操作hash数据类型
HashOperations hashOperations = redisTemplate.opsForHash();
//1.存储几个hash类型的数据
//第一个参数是hash的key,第二个参数是hash的字段,第三个参数是字段值
hashOperations.put("person","name","hhh");
hashOperations.put("person","age","19");
//2.获取hash类型的某个字段值
Object value = hashOperations.get("person", "name");
System.out.println(value);//hhh
//3.根据键获取哈希类型的所有字段
Set person = hashOperations.keys("person");
System.out.println(person);//[name, age]
//4.获取hash表中所有字段值
List person1 = hashOperations.values("person");
System.out.println(person1);//[hhh, 19]
//5.根据键获取hash类型的所有值
Map person2 = hashOperations.entries("person");
person2.forEach((k,v)-> System.out.println(k+"->"+v));
//name->hhh
//age->19
}
SpringDataRedis操作list类型
@Test
void testList(){
//根据RedisTemplate模板对象获取ListOperations来操作list数据类型
ListOperations listOperations = redisTemplate.opsForList();
//1.向列表中添加数据
listOperations.leftPush("list","a");
listOperations.leftPush("list","b");
listOperations.leftPushAll("list","c","d");//批量添加
listOperations.rightPush("list","1");
listOperations.rightPush("list","2");
//2.查看list数据类型的所有值
List list = listOperations.range("list", 0, -1);
for (Object object : list) {
System.out.println("value="+object);
//value=d
//value=c
//value=b
//value=a
//value=1
//value=2
}
}
SpringDataRedis操作set数据类型
@Test
void testSet(){
//根据RedisTemplate模板对象来获取SetOperations来操作set数据类型
SetOperations setOperations = redisTemplate.opsForSet();
//1.向set集合中添加数据
setOperations.add("set","a","b","c","1","a","2");//set集合会去重,无序
//2.获取set集合的所有值
Set set = setOperations.members("set");
for (Object o : set) {
System.out.println("value="+o);
//value=a
//value=1
//value=b
//value=c
//value=2
}
//3.删除指定set集合中的值
setOperations.remove("set","a","b");
}
SpringDataRedis操作zset数据类型
@Test
void testZSet(){
//根据RedisTemplate模板对象获取ZSetOperations来操作ZSet数据类型
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//1.向zSet中添加数据
zSetOperations.add("zset","hhh",90);
zSetOperations.add("zset","aaa",70);
zSetOperations.add("zset","bbb",80);
//2.从zSet中取数据
Set zset = zSetOperations.range("zset", 0, -1);
for (Object o : zset) {
System.out.println("value="+o);
//value=aaa
//value=bbb
//value=hhh
}
//3.对某个值的分数加10
zSetOperations.incrementScore("zset","hhh",10);
//4.获取zset集合中分数和value值
Set<ZSetOperations.TypedTuple> set = zSetOperations.rangeWithScores("zset", 0, -1);
for (ZSetOperations.TypedTuple tuple : set) {
System.out.println(tuple.getValue()+"->"+tuple.getScore());
//aaa->70.0
//bbb->80.0
//hhh->100.0
}
//5.删除数据
zSetOperations.remove("zset","aaa","bbb");
}
SpringDataRedis操作通用命令
@Test
void testCommon(){
//1.获取redis中所有key
Set keys = redisTemplate.keys("*");
for (Object key : keys) {
System.out.println("key="+key);
//key=zset
//key=set
//key=list
//key=person
}
//2.判断某个key是否存在
System.out.println(redisTemplate.hasKey("set"));//true
//3.删除某个key
System.out.println(redisTemplate.delete("set"));//true
//4.获取指定key的数据类型
System.out.println(redisTemplate.type("list"));//LIST
}
使用redis连接池
1.导入依赖
<!-- redis创建连接池,默认不会创建-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.编写application.yml配置文件
spring:
redis:
host: 192.168.230.130
port: 6379
database: 0 #操作的是0号数据库
lettuce:
pool:
max-active: 8 #连接池最大连接数(使用负数表示没有限制连接个数)
max-wait: -1ms #连接池最大阻塞等待时间(使用负数表示没有限制时间)
max-idle: 8 #连接池中的最大空闲连接
min-idle: 1 #连接池中最小空闲连接
Redis持久化
把redis服务器关了之后,再重启服务器,数据库数据会部分丢失,因为redis服务器会每隔一段时间写入一次内存中数据到硬盘上
所以我们要让redis持久化,即把内存中的数据保存到硬盘上
redis持久化的两种方式
1.ROB:redis database 默认的持久化方式,以二进制的方式将数据写入文件中。每隔一段时间写一次。(效率高,但是突然关闭服务器会导致部分数据丢失)
2.AOF:Append Only File 以文本文件的方式记录用户的每次操作,数据还原时候,读取AOF文件,模拟用户的操作,将数据还原(效率低,但是不会有数据丢失)
要把redis持久化方法改成AOF,只需要把redis.conf文件的appendonly修改为yes即可