当前位置:首页 > 编程笔记 > 正文
已解决

基础Redis-Java客户端操作介绍

来自网友在路上 178878提问 提问时间:2023-11-06 14:23:54阅读次数: 78

最佳答案 问答题库788位专家为你答疑解惑

Java客户端操作介绍

  • 2.基础-Redis的Java客户端
    • a.介绍
    • b.Jedis
    • c.Jedis连接池
    • d.SpringDataRedis
    • e.SpringDataRedis的序列化方式
    • f.StringRedisTemplate

2.基础-Redis的Java客户端

a.介绍

在这里插入图片描述

Jedis

  • 以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例是线程不安全的,多线程环境下需要基于连接池来使用

letture

  • Lettuce是基于Netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。

Redisson

  • Redisson是一个基于Redis实现的分布式、可伸缩的Java数据结构集合。包含了诸如Map、Queue、Lock、 Semaphore、AtomicLong等强大功能

b.Jedis

1.引入依赖:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>

2.建立连接

private Jedis jedis;
@BeforeEach
void setUp() {// 1.建立连接jedis = new Jedis("127.0.0.1",6379);// 2.设置密码//jedis.auth("");// 3.选择库jedis.select(0);
}

3.关闭连接

@AfterEach
void teardown() {if (jedis != null) {jedis.close();}
}

4.String类型

@Test
void testString() {// 存入数据String result = jedis.set("name", "John");System.out.println("result = " + result);// 获取数据String name = jedis.get("name");System.out.println("name = " + name);
}

5.hash类型

@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);
}

6.List类型

@Test
void testList() {// 插入数据jedis.lpush("jedisList:1", "A", "B");jedis.rpush("jedisList:1", "C", "D");String lpop = jedis.lpop("jedisList:1");System.out.println("lpop = " + lpop); // BString rpop = jedis.rpop("jedisList:1");System.out.println("rpop = " + rpop); // D
}

7.Set类型

@Test
void testSet() {// 插入数据jedis.sadd("zhangsan", "lisi", "wangwu", "zhaoliu");// 返回元素的个数Long scard = jedis.scard("zhangsan");System.out.println("scard = " + scard);// 获取所有元素Set<String> smembers = jedis.smembers("zhangsan");System.out.println("smembers = " + smembers);
} 

8.SorterSet类型

@Test
void testSortedSet() {// 插入数据jedis.zadd("stuScore", 85, "Jack");// 获取Double zscore = jedis.zscore("stuScore", "Jack");System.out.println("zscore = " + zscore);
}

c.Jedis连接池

Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐使用Jedis连接池代替Jedis的直连方式。

创建连接池 JedisPool

public class JedisConnectionFactory {private static final JedisPool jedisPool;static {// 配置连接池JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 最大连接数jedisPoolConfig.setMaxTotal(8);// 最大空闲连接jedisPoolConfig.setMaxIdle(8);// 最小空闲连接jedisPoolConfig.setMinIdle(0);// 等待时长jedisPoolConfig.setMaxWaitMillis(1000);// 创建连接池对象jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 1000);}public static Jedis getJedis() {return jedisPool.getResource();}
}

d.SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

API返回值类型说明redisTemplate.opsForValue()ValueOperations操作String类型数据redisTemplate.opsForHash()HashOperations操作Hash类型数据redisTemplate.opsForList()ListOperations操作List类型数据redisTemplate.opsForSet()SetOperations操作Set类型数据redisTemplate.opsForZSet()ZSetOperations操作SortedSet类型数据redisTemplate通用的命令

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.配置文件

  • 默认使用lettuce的连接池
spring:redis:host: 127.0.0.1port: 6319database: 0lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 100ms

3.注入RedisTemplate

@Autowired
private RedisTemplate redisTemplate;

4.编写测试

@Test
void testString() {// 写入一条数据redisTemplate.opsForValue().set("name", "谷歌");// 获取string数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name = " + name);
}

e.SpringDataRedis的序列化方式

RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:

在这里插入图片描述

缺点:

  • 可读性差内存

  • 占用较大

可以自定义RedisTemplate的序列化方式,代码如下:

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {// 创建RedisTemplate对象RedisTemplate<String, Object> template = new RedisTemplate<>();// 创建连接工厂template.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();// 设置key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}
}

因为在自定义配置设置了RedisTemplate<String, Object>

所以在自动注入时也需要指定RedisTemplate<String, Object>

@Autowired
private RedisTemplate<String, Object> redisTemplate;@Test
void testString() {// 写入一条数据redisTemplate.opsForValue().set("name", "谷歌");// 获取string数据Object name = redisTemplate.opsForValue().get("name");System.out.println("name = " + name);
}@Test
void testSaveUser() {redisTemplate.opsForValue().set("user:100", new User("谷歌", 21));User user = (User) redisTemplate.opsForValue().get("user:100");System.out.println("user = " + user);
}

f.StringRedisTemplate

为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。(推荐)

在这里插入图片描述

Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程:

@Autowired
private StringRedisTemplate stringRedisTemplate;@Test
void testString() {// 写入数据stringRedisTemplate.opsForValue().set("name", "百度");// 获取数据String name = stringRedisTemplate.opsForValue().get("name");System.out.println("name = " + name);
}private static final ObjectMapper mapper = new ObjectMapper();@Test
void testSaveUser() throws JsonProcessingException {// 创建对象User user = new User("腾讯", 20);// 手动序列化String json = mapper.writeValueAsString(user);// 写入数据stringRedisTemplate.opsForValue().set("user:200", json);// 获取数据String jsonUser = stringRedisTemplate.opsForValue().get("user:200");// 手动反序列化User user1 = mapper.readValue(jsonUser, User.class);System.out.println("user1 = " + user1);
}@Test
void testHash() {stringRedisTemplate.opsForHash().put("user:400", "name", "张三");stringRedisTemplate.opsForHash().put("user:400", "age", "22");Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:400");System.out.println("entries = " + entries);
}
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"基础Redis-Java客户端操作介绍":http://eshow365.cn/6-33692-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!