文章目录
- 1. 在Java中操作Redis
- 1.1 介绍
- 1.2 Jedis
- 1.3 Spring Data Redis
1. 在Java中操作Redis
1.1 介绍
- Redis的Java客户端很多,官方推荐的有三种:
- Jedis
- Lettuce
- Redisson
- Spring对 Redis客户端进行了整合,提供了Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即
spring-boot-starter-data-redis
1.2 Jedis
-
Jedis的maven坐标:
<dependency><groupld>redis.clients</groupld> <artifactld>jedis</artifactld> <version>2.8.0</version> </dependency>
-
使用Jedis操作Redis的步骤:
-
获取连接
Jedis jedis = new Jedis("localhost", 6379);
-
执行操作
jedis.set("username", "hauhua");String username = jedis.get("username"); System.out.println(username);
-
关闭连接
jedis.close();
-
1.3 Spring Data Redis
-
在Spring Boot项目中,可以使用Spring Data Redis来简化Redis操作,maven坐标:
<dependency><groupld>org.springframework.boot</groupld><artifactld>spring-boot-starter-data-redis</artifactld> </dependency>
-
因为是SpringBoot项目,需要提供启动类
@SpringBootApplication public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);} }
-
配置yaml文件
spring:application:name: demo-springdataredis#Redis相关配置redis:host: localhostport: 6379#password: 123456database: 0 #操作的是第0个数据库jedis:#Redis连接池配置pool:max-active: 8 #最大连接数(负值表示没有限制)max-wait: -1ms #最大阻塞等待时间(负值表示没有限制)max-idle: 8 #连接池中的最大空闲连接min-idle: 0 #连接池中的最小空闲连接
-
Redis配置类(对key和value进行序列化和反序列化)
@Configuration public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory); // 设置连接工厂template.setKeySerializer(new StringRedisSerializer()); // 设置键的序列化器template.setHashKeySerializer(new StringRedisSerializer()); // 设置hash键的序列化器template.setValueSerializer(new StringRedisSerializer()); // 设置值的序列化器return template;} }
-
-
Spring Data Redis中提供了一个高度封装的类:
RedisTemplate
,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:ValueOperations: 简单K-V操作 SetOperations: set类型数据操作 zSetOperations: zset类型数据操作 HashOperations:针对map类型的数据操作 Listoperations:针对list类型的数据操作
@SpringBootTest @RunWith(SpringRunner.class) public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;/*** 操作String类型数据*/@Testpublic void testString() {redisTemplate.opsForValue().set("city", "shanghai");String city = (String) redisTemplate.opsForValue().get("city");System.out.println(city);}/*** 操作hash类型数据*/@Testpublic void testHash() {//存值redisTemplate.opsForHash().put("user", "name", "hky");redisTemplate.opsForHash().put("user", "age", "24");redisTemplate.opsForHash().put("user", "gender", "male");//取值String name = (String) redisTemplate.opsForHash().get("user", "name");String age = (String) redisTemplate.opsForHash().get("user", "age");System.out.println(name + " " + age);System.out.println();//获得hash结构中所有的keySet keys = redisTemplate.opsForHash().keys("user");for (Object key :keys) {System.out.println(key);}System.out.println();//获得hash结构中所有的valueList values = redisTemplate.opsForHash().values("user");for (Object value :values) {System.out.println(value);}}/*** 操作list类型数据*/@Testpublic void testList() {ListOperations listOperations = redisTemplate.opsForList();//存值listOperations.leftPush("mylist", "apple");listOperations.leftPushAll("mylist", "banana", "orange");listOperations.leftPush("mylist", "banana");//取值List<String> list = listOperations.range("mylist", 0, -1);for (String fruit :list) {System.out.println(fruit);}//获得列表长度Long length = listOperations.size("mylist");int size = length.intValue();for (int i = 0; i < size; i++) {//出队列Object element = listOperations.rightPop("mylist");System.out.println(element);}}/*** 操作set类型数据*/@Testpublic void testSet() {SetOperations setOperations = redisTemplate.opsForSet();//存值setOperations.add("myset", "a", "b", "c", "d", "e");//取值Set<String> set = setOperations.members("myset");for (String element :set) {System.out.println(element);}//删除成员setOperations.remove("myset", "a", "b");set = setOperations.members("myset");for (String element :set) {System.out.println(element);}}/*** 操作zset类型数据*/@Testpublic void testZset() {ZSetOperations zSetOperations = redisTemplate.opsForZSet();//存值zSetOperations.add("myzset", "a", 1);zSetOperations.add("myzset", "b", 2);zSetOperations.add("myzset", "c", 3);zSetOperations.add("myzset", "a", 4);//取值Set myzset = zSetOperations.range("myzset", 0, -1);for (Object element :myzset) {System.out.println(element);}//修改分数zSetOperations.incrementScore("myzset", "b", 10);//删除成员zSetOperations.remove("myzset", "a", "b");myzset = zSetOperations.range("myzset", 0, -1);for (Object element :myzset) {System.out.println(element);}}/*** 通用操作,针对不同的数据类型都可以操作*/@Testpublic void testCommon() {//获取Redis中所有的keySet keys = redisTemplate.keys("*");for (Object key :keys) {System.out.println(key);}//判断某个key是否存在boolean exists = redisTemplate.hasKey("it");System.out.println(exists);//删除某个keyredisTemplate.delete("myZset");//判断某个key对应的value的数据类型DataType type = redisTemplate.type("myset");System.out.println(type);}}