目录
Jedis
快速入门
Jedis里的许多方法名就是命令名称
- 1.引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
- 2.建立连接
private Jedis jedis ;
//这个注释意思是每次@Test方法前都会执行的这段,下面每个@Test就不用重复写这段了,抽取出来
//@BeforeEach表示执行测试方法之前会先执行该方法
@BeforeEach
void setUp() {
//建立连接
jedis = new Jedis ("192.168.150.101",6379) ;
//设置密码
jedis. auth("123321") ;
//选择库
jedis . select(0);
}
- 3.测试String和Hash(其他类型相似操作)
@Test
void testString() {
//插入数据,方法名称就是redis命令名称,非常简单
String result = jedis.set("name","张三");
System.out.printlf("result =”+ result);
//获取数据
String name = jedis.get("name");
System.out.println("name = " + name);
}
@Test
void testHash() {
//插入hash 数据
jedis.hset("user:1","name","Jack") ;
jedis.hset("user:1","age","21") ;
//获取
Map<String,String> map = jedis.hgetAll("user:1");
System.out.println(map) ;
}
- 4.释放资源
@AfterEach
void tearDown() {
//释放资源
if (jedis != null) {
jedis. close();
}
}
Jedis的连接池
Jedis是线程不安全的,如果说在多线程的环境下并发的去访问,大家都来去使用,Jedis是有可能出现线程安全问题的,在并发的环境下,Jedis一定要给每一个线程创建独立的对象,那此时最好的方案是使用线程池,因为频繁的创建和销毁这类的对象是有很大的一个线程损耗的。
JedisPool里是连接的一些参数,Config传的是池的一些参数。
最大连接:这个连接池最多创建8个连接,再多就不行了。
最大空闲连接:即使没有人来连接连接池,那么这个连接池最多也可以预备八个连接,这样如果有人来了,就可以直接拿来用,不用在创建连接了。
最小空闲连接:这些空闲连接在一段时间后就会被清理,设置最小空闲连接用来保留n个连接不被清理。最长等待时间:当连接池里没有连接可用的时候,我们要不要等待?等待多长时间?默认值为-1,无限等待,直到有新的空闲连接为止。
@BeforeEach
void setUp() {
// 1.建立连接
// jedis = new Jedis("192.168.150.101",6379) ;
jedis = JedisConnectionFactory.getJedis();
// 2.设置密码
jedis.auth( password:"123321");
// 3.选择库
jqdis.select(0) ;
}
SpringDataRedis
Redis将命令根据类型进行了分组,而RedisTemplate也做了这件事,内部根据类型提供了各种API,返回不同的对象,对象里面封装的就是对于该类型的各种操作,利用对象封装的形式,把不同数据类型的方法封装到不同对象里去了。
快速入门
- 1.引入依赖
<!--Redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--连接池依赖-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
- 2.配置文件
spring:
redis:
host: 192.168.150.101
port: 6379
password: 123321
lettuce: #此时可以用lettuce也可以用jedis
pool:
max-active: 8 #最大连接
max-idle: 8 #最大空闲连接
min-idle: 0 #最小空闲连接
max-wait: 100ms #连接等待时间
- 3.注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
- 4.编写测试
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
//插入一条string类型数据
redisTemplate.opsForValue().set("name","李四") ;
//读取一条string类型数据
Object name = redisTemplate.opsForValue().get("name") ;
System.out.println("name=”+name) ;
}
}
SpringDataRedis的使用步骤:
1.引入spring-boot-starter-data-redis依赖
2.在application.yml配置Redis信息
3.注入RedisTemplate
RedisTemplate的RedisSerializer
上述测试出现的问题:
剖析:
默认的JDK序列化方式:
解决:更改RedisTemplate的序列化方式
一般key都为字符串,故key序列化用StringRedisSerializer
一般value都是对象,建议使用GenericJackson2JsonRedisSerializer
定义一个Bean叫做RedisTemplate,定义泛型key是string,value是object,先创建Template,然后连接工厂,连接工厂由springboot创建,我们只需要注入进来即可,然后设置序列化工具,一顿操作之后把redisTemplate返回。
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
//创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
//创建字符串序列化工具
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
//创建并设置JSON序列化工具
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();//Objectmapper是jackson的依赖,目的把对象写成json格式
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
//设置连接工厂
template.setConnectionFactory(factory);
//设置key序列化方式
template.setKeySerializer(redisSerializer);
template.setHashKeySerializer(redisSerializer);
//设置value序列化方式
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
value(“虎哥”)作为 字符串可以正常传入了
value作为对象也可以正常传入
当获取结果的时候还能自动地反序列化成对象(存的时候将对象转化为JSON,取的时候将JSON转换为对象)。
StringRedisTemplate
将JSON反序列化为对象需要@class字节码来标识需要转化为哪个对象。
存储结果:
RedisTemplate的两种序列化实践方案
方案一:
1.自定义RedisTemplate
2.修改RedisTemplate的序列化器 为Generi cJackson2JsonRedisSerializer
方案二:
1.使用StringRedisTemplate
2.写 入Redis时,手动把对象序列化为JSON
3.读取Redis时, 手动把读取到的JSON反序列化为对象
RedisTemplate操作Hash类型
在hash里面一个key可以对应多个值
注意,Hash类型存数据不用hset
而是用put(因为对应JAVA中的HashMap,干脆直接用put了,更接近Java的编程习惯)
@Test
void testHash() {
stringRedisTemplate.opsForHash().put("user:400","name","虎哥");
stringRedisTemplate.opsForHash().put("user:400","age","21");
Map<Object, object> entries = stringRedi sTemplate.opsForHash().entries("user:400") ;
System.out.println("entries =”+ entries);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99439.html