Redis学习2--使用java操作Redis

1、java操作Redis库的比较

Redis有各种语言的客户端可以来操作redis数据库,其中java语言主要有Jedis与lettuce ,Spring Data Redis封装了上边两个客户端,优缺点如下:

2、使用Jedis操作Redis

Jedis使用的基本步骤:

  1. 引入依赖

  2. 创建Jedis对象,建立连接

  3. 使用Jedis,方法名与Redis命令一致

  4. 释放资源

    java 复制代码
    public class RedisTest {
        Jedis jedis;
        @BeforeEach
        public void setUp(){
            //建立连接,设置密码,选择数据库
            jedis= new Jedis("127.0.0.1",6379);
            // jedis.auth("123456");
            jedis.select(0);
        }
    
        @Test
        public void testJedis(){
            String result = jedis.set("city", "北京");
            System.out.println(result);
            String city = jedis.get("city");
            System.out.println(city);
            String name = jedis.hget("user", "name");
            System.out.println(name);
        }
        @AfterEach
        public void tearDown(){
            //释放资源
            if(jedis!=null){
                jedis.close();
            }
        }
    }

    因为Jedis是线程不安全的,频繁创建销毁链接也有性能损耗,所以可以用Jedis连接池来获取Jedis链接,

java 复制代码
public class JedisConnectionFactory {
    private static final JedisPool jedisPool;
    static{
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(8);
        jedisPoolConfig.setMaxTotal(8);
        jedisPoolConfig.setMinIdle(0);
        jedisPoolConfig.setMaxWaitMillis(2000);
        jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379,100,"");
    }
    public static Jedis getJedis(){
        return jedisPool.getResource();
    }
}

3、使用SpringDataRedis操作redis数据库

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的使用步骤:

  1. 引入spring-boot-starter-data-redis依赖
  2. 在application.yml配置Redis信息
  3. 注入RedisTemplate
java 复制代码
<!--        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>

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

自定义RedisTemplate的序列化方式

java 复制代码
@Configuration
public class SpringDataRedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        return redisTemplate;
    }
}
java 复制代码
@SpringBootTest
public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testRedisTemplate(){
        redisTemplate.opsForValue().set("redis","6.0.9");
        Object redis = redisTemplate.opsForValue().get("redis");
        System.out.println(redis);
        User u =new User();
        u.setName("张三");
        u.setAge(20);
        redisTemplate.opsForValue().set("com:user",u);
        Object o = redisTemplate.opsForValue().get("com:user");
        System.out.println(o);
    }
}

返回的是Object

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

Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式

java 复制代码
@SpringBootTest
public class SpringDataRedisTest {
    @Autowired
    // private RedisTemplate redisTemplate;
    private StringRedisTemplate redisTemplate;
    private ObjectMapper objectMapper =new ObjectMapper();
    @Test
    void testRedisTemplate() throws JsonProcessingException {
        redisTemplate.opsForValue().set("redis","6.0.9");
        Object redis = redisTemplate.opsForValue().get("redis");
        System.out.println(redis);
        User u =new User();
        u.setName("张三");
        u.setAge(20);
        //序列化
        String s = objectMapper.writeValueAsString(u);
        redisTemplate.opsForValue().set("com:user",s);
        String o = redisTemplate.opsForValue().get("com:user");
        System.out.println(o);
        //反序列化
        User user = objectMapper.readValue(o, User.class);
    }
}

RedisTemplate的两种序列化实践方案:

方案一:

  1. 自定义RedisTemplate
  2. 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

方案二:

使用StringRedisTemplate

  1. 写入Redis时,手动把对象序列化为JSON
  2. 读取Redis时,手动把读取到的JSON反序列化为对象
相关推荐
_Johnny_8 分钟前
Redis 升级操作指南:单机与主从模式
数据库·redis·缓存
不爱洗脚的小滕14 分钟前
【Redis】三种缓存问题(穿透、击穿、双删)的 Golang 实践
redis·缓存·golang
提笔了无痕18 分钟前
什么是Redis的缓存问题,以及如何解决
数据库·redis·后端·缓存·mybatis
CodeCraft Studio31 分钟前
【能源与流程工业案例】KBC借助TeeChart 打造工业级数据可视化平台
java·信息可视化·.net·能源·teechart·工业可视化·工业图表
摇滚侠39 分钟前
Spring Boot 3零基础教程,WEB 开发 默认页签图标 Favicon 笔记29
java·spring boot·笔记
Jeled40 分钟前
AI: 生成Android自我学习路线规划与实战
android·学习·面试·kotlin
YSRM42 分钟前
Leetcode+Java+图论+最小生成树&拓扑排序
java·leetcode·图论
沐浴露z1 小时前
【JVM】详解 Class类文件的结构
java·jvm·class
桦说编程1 小时前
Java并发编程:两种控制并发度的实现方法及其比较
java·后端