目录
在Redis官网中提供了各种语言的客户端,地址:https://redis.io/resources/clients/

其中Java客户端也包含很多:

标记为❤的就是推荐使用的java客户端,包括:
Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。
Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map.Queue等,而且支持跨进程的同步机制:Lock.Semaphore等待,比较适合用来实现特殊的功能需求。
创建有个工程,引入依赖
- <dependency>
- <groupId>redis.clientsgroupId>
- <artifactId>jedisartifactId>
- <version>3.7.0version>
- dependency>
- <dependency>
- <groupId>org.junit.jupitergroupId>
- <artifactId>junit-jupiterartifactId>
- <version>5.7.0version>
- <scope>testscope>
- dependency>
编写测试类:
- public class JedisTest {
- private Jedis jedis;
-
- @BeforeEach
- void setUp(){
- //1、建立连接
- jedis= new Jedis("192.168.178.130",6379);
- //2、设置密码
- jedis.auth("123456");
- //3、选择库
- jedis.select(2);
- }
-
- @Test
- public void test(){
- //存入数据 ctrl+alt+v快速补全
- String result = jedis.set("name", "diaolovetest");
- System.out.println("result = " + result);
- String name = jedis.get("name");
- System.out.println(name);
- }
-
- @Test
- void testHash() {
- // 插入hash数据
- jedis.hset("user:1", "name", "Jack");
- jedis.hset("user:1", "age", "21");
-
- // 获取
- Map
map = jedis.hgetAll("user:1"); - System.out.println(map);
- }
-
- @AfterEach
- void tearDown() {
- if (jedis != null) {
- jedis.close();
- }
- }
- }
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式
有关池化思想,并不仅仅是这里会使用,很多地方都有,比如说我们的数据库连接池,比如我们tomcat中的线程池,这些都是池化思想的体现。
使用工厂设计模式,去降低代的耦合,比如Spring中的Bean的创建,就用到了工厂设计模式
2)静态代码块:随着类的加载而加载,确保只能执行一次,我们在加载当前工厂类的时候,就可以执行static的操作完成对 连接池的初始化
3)最后提供返回连接池中连接的方法.
- package com.diao.util;
-
- import redis.clients.jedis.Jedis;
- import redis.clients.jedis.JedisPool;
- import redis.clients.jedis.JedisPoolConfig;
-
- /**
- * @Description: jedis连接池$
- * @Author: dyq
- * @Date: 2022年11月24日23:35:43$
- */
- public class JedisConnectionFacotry {
- private static final JedisPool jedisPool;
-
- static {
- //配置连接池
- JedisPoolConfig poolConfig = new JedisPoolConfig();
- poolConfig.setMaxTotal(8);//最大连接数
- poolConfig.setMaxIdle(8);//最大连接
- poolConfig.setMinIdle(0);//最小连接
- poolConfig.setMaxWaitMillis(1000);//最大连接时长
- //创建连接池对象
- jedisPool = new JedisPool(poolConfig,
- "192.168.178.130",6379,1000,"123456");
- }
-
- public static Jedis getJedis(){
- return jedisPool.getResource();
- }
-
- }

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:Spring Data Redis

提供了对不同Redis客户端的整合(Lettuce和Jedis)
提供了RedisTemplate统一API来操作Redis
支持Redis的发布订阅模型
支持Redis哨兵和Redis集群
支持基于Lettuce的响应式编程
支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化
支持基于Redis的JDKCollection实现
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:


-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-redisartifactId>
- dependency>
-
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-pool2artifactId>
- dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.coregroupId>
- <artifactId>jackson-databindartifactId>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
配置文件
- spring:
- redis:
- host: 192.168.178.130
- port: 6379
- password: 123456
- lettuce:
- pool:
- max-active: 8 #最大连接
- max-idle: 8 #最大空闲连接
- min-idle: 0 #最小空闲连接
- max-wait: 100ms #连接等待时间
编写测试类RedisDemoApplicationTests
- package com.example.redis_demo;
-
- import org.junit.jupiter.api.Test;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.data.redis.core.RedisTemplate;
-
- @SpringBootTest
- class RedisDemoApplicationTests {
-
- @Autowired
- private RedisTemplate redisTemplate;
-
- @Test
- void testString() {
- // 写入一条String数据
- redisTemplate.opsForValue().set("name", "diaoge");
- // 获取string数据
- Object name = redisTemplate.opsForValue().get("name");
- System.out.println("name = " + name);
- }
- }
运行成功

查看客户端数据


什么是反序列化?反序列化的过程,原理_kali_Ma的博客-CSDN博客_反序列化
尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图
为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
为了减少内存的消耗,我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间
这种用法比较普遍,因此SpringDataRedis就提供了RedisTemplate的子类StringRedisTemplate,它的key和value的序列化方式默认就是String方式。
最后小总结:
RedisTemplate的两种序列化实践方案:
方案一:
自定义RedisTemplate
修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
方案二:
使用StringRedisTemplate
写入Redis时,手动把对象序列化为JSON
读取Redis时,手动把读取到的JSON反序列化为对象
Hash结构的序列化操作
- @Test
- public void testHash(){
- stringRedisTemplate.opsForHash().put("user:400", "name", "牛哥");
- stringRedisTemplate.opsForHash().put("user:400", "age", "22");
-
- Map
- System.out.println("entries = " + entries);
- }
声明: 个人学习记录,不做商业用途,来源于B站黑马程序员redis!