1.Spring集成Redis介绍和准备工作

  1. Redis简介

Redis(Remote Dictionary Server)是一个基于内存开源的键值存储系统,具有高性能、高可靠性、支持多种数据结构等特点。Redis支持主从复制、持久化、Lua脚本等功能,可以应用于许多场景,如缓存、消息队列、计数器、分布式锁等。并且Redis具有以下几个特点:

  • 高性能:Redis采用了基于内存的存储机制,将数据存在内存中以达到快速读写的目的。此外,Redis还采用了多种提高性能的技术,如快速网络IO,异步IO等。

  • 数据结构多样性:Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。这些数据结构可以更好地适应不同的应用场景,最大化Redis数据处理效率。

  • 强一致性:Redis具有强一致性,能够确保数据存储的完整性和一致性。这意味着当数据被存储到Redis中后,客户端无论如何操作,都能够读取到最新的数据。

  • 可扩展性:Redis具有良好的扩展性,可以通过主从复制、分片等方式将数据分散到多个节点上,提高系统的可靠性和容错能力

  1. Spring集成Redis

Spring Data Redis是Spring提供的用于访问Redis的模块,它简化了Redis的操作,使用Spring Data Redis可以使我们更加轻松地进行Redis操作,同时能够支持Redis的主从复制、事务等高级功能。

Spring集成Redis的过程非常简单,只需要三个步骤:添加依赖、配置Redis连接信息、注入RedisTemplate即可。以下是示例代码:

添加依赖

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

配置Redis连接信息

<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
	<property name="hostName" value="127.0.0.1"/>
	<property name="port" value="6379"/>
</bean>

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
	<property name="connectionFactory">
		<ref bean="redisConnectionFactory" />
	</property>
</bean>

注入RedisTemplate

@Autowired
private RedisTemplate<String, Object> redisTemplate;

通过以上步骤,我们就可以在Spring中轻松地使用Redis了。例如,可以使用redisTemplate.opsForValue()来操作Redis的String类型数据,redisTemplate.opsForHash()来操作Redis的Hash类型数据等。

2.Spring集成Redis的应用

有了RedisTemplate之后,就可以使用它来访问Redis了。下面是对Redis各种数据结构操作的介绍:

  1. 字符串类型操作
// 存储字符串数据
redisTemplate.opsForValue().set("key", "value");
String result = redisTemplate.opsForValue().get("key");

介绍:RedisTemplate中OpsForValue操作用于操作字符串类型的值,例如可以存储一个字符串类型的键值对。

  • set(key, value):设置key-value键值对
  • setIfAbsent(key, value):仅在key不存在的情况下才设置值
  • get(key):获取value
  • increment(key, delta):将key对应的value增加delta
  • decrement(key, delta):将key对应的value减少delta
  • append(key, value):在key对应的字符串值后面追加value
  • size(key):返回key对应字符串值的长度
  1. 哈希类型操作
// 存储哈希数据
Map<String,Object> map = new HashMap<>();
map.put("name", "Jack");
map.put("age", 30);
redisTemplate.opsForHash().putAll("user", map);
String name = redisTemplate.opsForHash().get("user", "name").toString();
Integer age = (Integer) redisTemplate.opsForHash().get("user", "age");

介绍:RedisTemplate中OpsForHash操作用于操作哈希类型的数据,哈希是一个键值对集合,类似于Java中的Map。

  • put(key, hashKey, value):将key对应的哈希类型中,hashKey和value对应的键值对存储进去
  • putAll(key, map):批量存储key对应的哈希类型中,map中的键值对
  • get(key, hashKey): 获取key对应哈希类型中,hashKey对应的值
  • entries(key):返回key对应哈希类型中,所有的键值对
  • delete(key, hashKeys…):删除哈希类型中key对应的多个hashKey
  • size(key):获取哈希类型中key对应哈希的大小
  1. 列表类型操作
// 存储列表数据
redisTemplate.opsForList().rightPush("list", "1");
redisTemplate.opsForList().rightPush("list", "2");
String value = redisTemplate.opsForList().index("list",0);

介绍:RedisTemplate中OpsForList操作用于操作列表类型的数据,列表是一个链表结构,可以从链表的两端插入、删除元素。

  • leftPush(key, value):从左边插入值
  • leftPop(key):从左边弹出值
  • rightPush(key, value):从右边插入值
  • rightPop(key):从右边弹出值
  • range(key, start, end):获取指定范围内的元素
  • size(key):获取列表的长度
  1. 集合类型操作
// 存储集合数据
redisTemplate.opsForSet().add("set", "1","2","3");
Long size = redisTemplate.opsForSet().size("set");
Boolean contains = redisTemplate.opsForSet().isMember("set","2");

介绍:RedisTemplate中OpsForSet操作用于操作集合类型的数据,集合是一个无序的、不重复的元素的集合。

  • add(key, values…):向集合中添加一个或多个元素
  • remove(key, values…):从集合中删除一个或多个元素
  • isMember(key, value):判断一个元素是否在集合中
  • size(key):获取集合中元素的数量
  1. 有序集合类型操作
// 存储有序集合数据
redisTemplate.opsForZSet().add("zset", "1", 1);
redisTemplate.opsForZSet().add("zset", "2", 2);
Set<String> values = redisTemplate.opsForZSet().range("zset", 0, -1);

介绍:RedisTemplate中OpsForZSet操作用于操作有序集合类型的数据,有序集合是一种有序的、不重复的元素的集合。

  • add(key, value, score):添加有序集合成员,按照分值进行排序
  • remove(key, values…):从有序集合中删除一个或多个成员
  • range(key, start, end):从有序集合中根据下标范围返回成员列表
  • size(key):获取有序集合中元素的个数

3.使用Redis实现缓存

除了上面的字符串读写操作之外,Redis还可以用作缓存的方案。在Spring中,可以通过CacheManager bean来管理缓存,在这里我们使用Redis作为缓存存储。下面是一个简单的CacheManager配置示例:

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379));
    }

    @Bean
    public RedisCacheManager cacheManager() {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
                .defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10));
        return RedisCacheManager.builder(redisConnectionFactory())
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }

}

这里使用LettuceConnectionFactory连接工厂,它是Spring Data Redis 2.0的新特性,用于替代之前的JedisConnectionFactory(但其实也可以继续使用JedisConnectionFactory)。同时,通过@EnableCaching注解开启缓存功能,并定义了一个RedisCacheManager bean,用于管理缓存。这里设置了默认的缓存TTL为10分钟,默认的缓存是使用String类型作为缓存键和值。

在实际中,可以通过@Cacheable和@CacheEvict注解来标记需要缓存的方法和需要清除缓存的方法:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Cacheable(value = "users", key = "#id")
    public User getById(Integer id) {
        return userRepository.findById(id).orElse(null);
    }

    @Cacheable(value = "users", key = "#username")
    public User getByUsername(String username) {
        return userRepository.findByUsername(username);
    }

    @CacheEvict(value = "users", allEntries = true)
    public void clearCache() {

    }

}

在这里,@Cacheable注解表示当前方法的执行结果将被缓存,value属性表示缓存的名称,key属性表示缓存的键。同样地,@CacheEvict注解表示清除缓存的操作,allEntries属性表示清除所有缓存。

在使用下面这个示例模拟获取用户信息的过程中,会将第一次获取到的数据缓存到Redis中,当再次获取同样的用户信息时,会直接从Redis中读取缓存数据,而不是从数据库中查询:

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Integer id) {
        return userService.getById(id);
    }

    @GetMapping("/username/{username}")
    public User getUserByUsername(@PathVariable String username) {
        return userService.getByUsername(username);
    }

}

5.Spring集成Redis的优点:

  • 快速读写速度:Redis是内存型数据库,将数据缓存在内存中,读取和写入速度非常快,可以提高程序的响应速度。

  • 高并发:Redis支持高并发读写,能够处理大量的请求,并且不会阻塞。

  • 数据持久化:Redis支持数据持久化,可以将数据持久化到磁盘中,保证数据的安全性。

  • 分布式缓存:Redis可以实现分布式缓存,多个应用程序共享一个缓存,减少缓存的重复存储。

  • 发布订阅功能:Redis支持发布订阅功能,可以实现消息通知、广播等功能。

6.Redis的应用场景:

  • 数据缓存:将经常访问的数据缓存在Redis中,减轻数据库的压力,提高程序性能。

  • 分布式锁:使用Redis实现分布式锁,避免多线程同时访问出现问题。

  • 计数器:使用Redis的原子性操作,实现计数器功能。

  • 限流:使用Redis实现限流功能,避免服务器过载。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐