Java操作Redis

介绍

Redis的Java客户端有多种,官方推荐使用的有三种:

  • Jedis
  • Lettuce
  • Redisson

Spring对Redis客户端进行了整合,提供了Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即spring-boot-starter-data-redis。

使用Jedis操作Redis的步骤:

  1. 获取链接
  2. 执行操作
  3. 关闭连接

导入依赖

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

进行简单操作

@Test
void testRedis() {
	// 获取链接
	Jedis jedis = new Jedis("localhost", 6379);
	// 执行具体操作
    jedis.set("name", "wyw");
	// 关闭连接
	jedis.close();
}

Spring Data Redis

Spring Data Redis可以用来简化Redis操作,下面是maven坐标:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

RedisTemplate高度封装的类

主要针对jedis客户端中大量api进行归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作
  • SetOperations:set类型数据操作
  • ZSetOperations:zset类型数据操作
  • HashOperations:针对map类型的数据操作
  • ListOperations:针对list类型的数据操作

redis的文件配置

spring:
  # Redis 相关配置
  redis:
    host: localhost
    port: 6379
    # password: 123456
    database: 0	# 默认操作第0个数据库
    jedis:
      # Redis 连接池配置
      pool:
        max-active: 8 # 最大连接数 
        max-wait: 1ms # 连接池最大阻塞等待时间
        max-idle: 4   # 连接池中的最大空闲连接
        min-idle: 0   # 连接池中的最小空闲连接

序列化器

当我们执行set操作的时候,RedisTemplate会默认对key值进行序列化,不进行序列化,则需要修改配置类RedisConfig:

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();

        // 默认的key序列化器为:JdkSerializationRedisSerializer
        // redisTemplate.setKeySerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;
    }
}

案列测试

字符串 String

@Test
	void contextString() {
		redisTemplate.opsForValue().set("name", "wyw");
		System.out.println(redisTemplate.opsForValue().get("name"));

		redisTemplate.opsForValue().set("key1", "123", 10L, TimeUnit.SECONDS);
	}

哈希 Hash

@Test
	void contextHash() {
		HashOperations hashOperations = redisTemplate.opsForHash();

		hashOperations.put("001", "name", "wyw");
		hashOperations.put("001", "age", "20");
		hashOperations.put("001", "address", "addr");

		Set keys = hashOperations.keys("001");

		List values = hashOperations.values("001");

		System.out.println(keys);
		System.out.println(values);
	}

列表 list

	@Test
	void testList() {
		ListOperations listOperations = redisTemplate.opsForList();

		// 单个存值
		listOperations.leftPush("mylist", "a");
		listOperations.leftPush("mylist", "b");
		// 多个存值
		listOperations.leftPushAll("mylist", "c", "d");

		// 取值
		List mylist = listOperations.range("mylist", 0, 4);

		System.out.println(mylist);

		// 获取list长度
		Long mylistSize = listOperations.size("mylist");

		// 出队
		while(mylistSize -- > 0) {
			System.out.println(listOperations.range("mylist", mylistSize, mylistSize));
			listOperations.rightPop("mylist");
		}
	}

集合 Set

@Test
	void testSet() {
		SetOperations setOperations = redisTemplate.opsForSet();

		// 存值
		setOperations.add("myset", "1", "2", "3", "3", "1", "5");

		// 取值
		Set<String> myset = setOperations.members("myset");
		System.out.println(myset);

		// 删除成员
		setOperations.remove("myset", "1", "2");

		myset = setOperations.members("myset");
		System.out.println(myset);
	}

有序集合 sorted set

@Test
	void testZset() {
		ZSetOperations zSetOperations = redisTemplate.opsForZSet();

		// 存值
		zSetOperations.add("myZset", "a", 10);
		zSetOperations.add("myZset", "b", 20);
		zSetOperations.add("myZset", "c", 5);
		zSetOperations.add("myZset", "a", 8);

		Set myZset = zSetOperations.range("myZset", 0, -1);
		System.out.println(myZset);

		// 修改分数
		zSetOperations.incrementScore("myZset", "c", 30);
		myZset = zSetOperations.range("myZset", 0, -1);
		System.out.println(myZset);

		// 删除
		zSetOperations.remove("myZset", "a");
	}

通用命令

@Test
	void testCommon() {
		// 获取Redis中所有的key
		Set keys = redisTemplate.keys("*");
		System.out.println(keys);

		// 判断某个key是否存在
		Boolean flag = redisTemplate.hasKey("name");
		System.out.println(flag);

		// 删除指定key
		redisTemplate.delete("name");

		// 获取指定key队形的value的数据类型
		DataType keyName = redisTemplate.type("myZset");
		System.out.println(keyName.name());
	}
posted @ 2023-07-23 13:22  菠菜好不好吃  阅读(81)  评论(0编辑  收藏  举报