三种方式区别:
Jedis、RedisTemplate、StringRedisTemplate:
- Jedis是官方推荐使用的操作redis的客户端
- StringRedisTemplate继承自RedisRemplate,但是两者是不共通的,StringRedisTemplate只管理StringRedisTemplate里面的数据,RedisTemplate只管理RedisTemplate下的数据,他们俩都是spring提供的
- StringRedisTemplate使用的是String的序列化策略,RedisTemplate使用的是JDK的序列化策略
- StringRedisTemplate能够查询Jedis存储的值,但是不能查询RedisTemplate的值,同样,Jedis可以得到StringRedisTemplate的值,但是不能够得到RedisTemplate的值,这个在最后会说明
Jedis使用
导依赖
<!--jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
使用:
需要在代码里配置一下环境
/*--------jedis test---------*/
@PostMapping("/jedisTest")
public void jedisTest() {
Jedis jedis = new Jedis("192.168.1.190");//ip,可以不设置port,默认6379
// Jedis jedis = new Jedis("106.13.66.110",6379);//设置port
jedis.auth("password");//密码
jedis.select(1);//设置操作的redis数据库
jedis.setex("2",60 * 60 * 24,"222");//设置key为“2”,过期时间为1天的value为“222”的数据,过期时间单位是秒
// jedis.expire("2",60 * 60 * 24);也是设置过期:key为“2”的值在一天后过期,过期时间单位也是秒
System.out.println(jedis.get("2"));
jedis.close();//关闭
}
//结果为 222
结果为:222
其他操作:
// 移除key的过期时间
jedis.persist("key");
// 将key重命名
jedis.renamenx("key", "key1");
// 删除key
jedis.del("key");
//String基本操作
jedis.setex("2",60 * 60 * 24,"222");
jedis.set("2","222");
jedis.get("2");
//set基本操作
jedis.sadd("key","members");
jedis.smembers("key");
//hash基本操作
jedis.hset("key","field","value");
jedis.hget("key","field");
//zset基本操作
jedis.zadd("key",2.22,"member");
jedis.zrange("key",1,10);
//list基本操作
jedis.lpush("key","str","str");
jedis.lpop("key");
RedisTemplate
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
可以在配置文件里配置环境:
# Redis
spring.redis.database=1 #连接的库
spring.redis.host=192.168.1.190 #ip
spring.redis.port=6379 #port
spring.redis.password=password # 密码
spring.redis.timeout=5000ms #超时时间
使用:
/*--------redisTemplate test---------*/
@PostMapping("/redisTemplateTest")
public void redisTemplateTest() {
redisTemplate.boundValueOps("1").set("111",7, TimeUnit.DAYS);//存储类型为String类型的key为“1”,value为“111”的数据,保存时间是7天
System.out.println(redisTemplate.boundValueOps("1").get());
}
结果:111
其他操作:
//String基本操作
redisTemplate.boundValueOps("1").set("111",7, TimeUnit.DAYS);
redisTemplate.boundValueOps("1").get();
//list基本操作
redisTemplate.opsForList().leftPop("key");//左边插入
redisTemplate.opsForList().range("key",1,10);//获取指定范围的内容
//set基本操作
redisTemplate.opsForSet().add("key","value","value");
redisTemplate.opsForSet().randomMember("key");
//zset基本操作
redisTemplate.opsForZSet().add("key","value",1);
redisTemplate.opsForZSet().range("key",1,10);
//hash基本操作
redisTemplate.opsForHash().putAll("key",new HashMap());
redisTemplate.opsForHash().get("key","hashkey");
StringRedisTemplate
用法和RedisTemplate一样
对比三种方式的互通性
package com.example.testall.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
/**
* @author Shuoshi.Yan
* @package:com.example.testall.test
* @className:redis test
* @description:
* @date 2020-04-28 11:01
* @version:V1.0
* @NOTICE:本内容仅限于xxx有限公司内部传阅,禁止外泄以及用于其他的商业项目
* @ Copyright xxx. All rights reserved.
**/
@RestController
@RequestMapping("/redis")
public class RedisTestController {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
/*--------stringRedisTemplate test---------*/
@PostMapping("/stringRedisTemplateTest")
public void stringRedisTemplateTest() {
stringRedisTemplate.boundValueOps("3").set("333",7, TimeUnit.DAYS);
System.out.println("---------stringRedisTemplateTest接口----------");
System.out.println("redisTemplateTest:" + stringRedisTemplate.boundValueOps("1").get());
System.out.println("jedis:" + stringRedisTemplate.boundValueOps("2").get());
System.out.println("stringRedisTemplate:" + stringRedisTemplate.boundValueOps("3").get());
}
/*--------redisTemplate test---------*/
@PostMapping("/redisTemplateTest")
public void redisTemplateTest() {
redisTemplate.boundValueOps("1").set("111",7, TimeUnit.DAYS);
System.out.println("---------redisTemplateTest接口----------");
System.out.println("redisTemplateTest:" + redisTemplate.boundValueOps("1").get());
System.out.println("jedis:" + redisTemplate.boundValueOps("2").get());
System.out.println("stringRedisTemplate:" + redisTemplate.boundValueOps("3").get());
}
/*--------jedis test---------*/
@PostMapping("/jedisTest")
public void jedisTest() {
Jedis jedis = new Jedis("192.168.1.190",6379);//配置IP,port
jedis.auth("password");//配置密码
jedis.select(1);//配置库
jedis.setex("2",60 * 60 * 24,"222");//设置值及过期时间
System.out.println("---------jedisTest接口----------");
System.out.println("redisTemplateTest:" + jedis.get("1"));
System.out.println("jedis:" + jedis.get("2"));
System.out.println("stringRedisTemplate:" + jedis.get("3"));
jedis.close();
}
}
在这里说明一下,jedis测试接口存的key是“2”,redisTemplate存的是“1”,StringRedisTemplate存的是“3”,看一下结果:
StringRedisTemplate能够查询Jedis存储的值,但是不能查询RedisTemplate的值,同样,Jedis可以得到StringRedisTemplate的值,但是不能够得到RedisTemplate的值
在来看一下redis里面存的值:
jedis:
RedisTemplate:
StringRedisTemplate:
是不是看样子还是用RedisTemplate比较好,至少看不到是什么数据