在Java中操作Redis

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 在Java中操作Redis

使用Jedis操作Redis

redis的java客户端很多,官方推荐的有三种:

Jedis

Lettuce

Redisson

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

使用Jedis操作Redis的步骤

1.获取链接

2.执行操作

3.关闭连接

package com.example.demotest;
 
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
 
import java.util.Set;
 
/**
 * 使用Jedis操作Redis
 */
public class JedisTest {
 
    @Test
    public void testRedis(){
        //1.获取连接
        Jedis jedis = new Jedis("localhost",6379);
 
        //2.执行具体的操作
        jedis.set("username","huan");
        String username = jedis.get("username");
        System.out.println(username);
 
        //jedis.del("username");
        jedis.hset("myhash","addr","sz");
        String hValue = jedis.hget("myhash", "addr");
        System.out.println(hValue);
 
        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
        //3.关闭连接
        jedis.close();
    }
}

使用Spring Data Redis来简化Redis操作

Spring Data Redis 中提供了一个高度封装的类,针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

ValueOperations:简单K-V操作

SetOperations :set 类型数据操作

ZSetOperations:zset 类型数据操作

HashOperations:针对map类型的数据操作

ListOperations:针对list类型的数据操作

默认操作的是0号数据库,也可以切换其他数据库

设置一下序列化,这样设置key的时候不会变成乱码

package com.example.demotest;
 
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
 
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory){
 
        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
 
        redisTemplate.setKeySerializer(new StringRedisSerializer());
 
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
 
        redisTemplate.setConnectionFactory(connectionFactory);
        return  redisTemplate;
    }
}
package com.example.demotest;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;
 
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
 
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @Test
    public void testString(){
        redisTemplate.opsForValue().set("city2","sz");
        String city2 = (String) redisTemplate.opsForValue().get("city2");
        System.out.println("打印一下" + city2);
        //指定过期时间 10 秒
        redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);
        //如果不存在key则设置
        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city", "sz");
        System.out.println(aBoolean);
 
    }
 
    @Test
    public void testHash(){
        HashOperations hashOperations = redisTemplate.opsForHash();
        //存值
        hashOperations.put("002","name","hh");
        hashOperations.put("002","age","20");
        hashOperations.put("002","address","sz");
        //取值
        String age = (String) hashOperations.get("002", "age");
        System.out.println(age);
 
        //获得hash结构中的所有字段
        Set keys = hashOperations.keys("002");
        for (Object key : keys) {
            System.out.println(key);
        }
        //获得hash结构中的所有值
        List values = hashOperations.values("002");
        for (Object value : values) {
            System.out.println(value);
        }
 
 
 
    }
 
    /**
     * 操作list类型的数据
     */
    @Test
    public void testList(){
        ListOperations listOperations = redisTemplate.opsForList();
 
        //存储
        listOperations.leftPush("mylist","a");
        listOperations.leftPushAll("mylist","b","c","d");
 
        //取值
        List<String> mylist = listOperations.range("mylist", 0, -1);
        for (String value : mylist) {
            System.out.println(value);
        }
 
        //获得列表长度
        Long size = listOperations.size("mylist");
        int lSize = size.intValue();
        for (int i = 0; i < lSize; i++) {
            //出队列
            String elment = (String) listOperations.rightPop("mylist");
            System.out.println(elment);
        }
 
 
    }
 
    /**
     * 操作set类型的数据
     */
    @Test
    public void testSet(){
        SetOperations setOperations = redisTemplate.opsForSet();
 
        //存值
        setOperations.add("myset","a","b","c","a");
 
        //取值
        Set<String> myset = setOperations.members("myset");
        for (String s : myset) {
            System.out.println(s);
        }
        //删除成员
        setOperations.remove("myset","a","b");
 
        //取值
        myset = setOperations.members("myset");
        for (String s : myset) {
            System.out.println(s);
        }
 
    }
 
    /**
     * 操作zset类型的数据
     */
    @Test
    public void testZset(){
        ZSetOperations zSetOperations = redisTemplate.opsForZSet();
 
        //存值
        zSetOperations.add("myZset","a",10.0);
        zSetOperations.add("myZset","b",11.0);
        zSetOperations.add("myZset","d",12.0);
        zSetOperations.add("myZset","a",13.0);
 
        //取值
        Set<String> myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println(s);
        }
        //修改分数
        zSetOperations.incrementScore("myZset","b",20.0);
 
        //取值
        myZset = zSetOperations.range("myZset", 0, -1);
        for (String s : myZset) {
            System.out.println(s);
        }
        //删除成员
        zSetOperations.remove("myZset","a","b");
 
 
    }
 
    @Test
    public void testCommon(){
        //获取Redis 中所有的key
        Set<String> keys = redisTemplate.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
 
        //判断某个key是否存在
        Boolean hh = redisTemplate.hasKey("hh");
        System.out.println(hh);
 
        //删除指定key
        redisTemplate.delete("myzset");
 
        //获取指定key对应的value的数据类型
        DataType dataType = redisTemplate.type("myset");
        System.out.println(dataType.name());
 
    }
}


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
17天前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
31 1
|
2月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
61 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
2月前
|
缓存 NoSQL Java
Java中redis面试题
Java中redis面试题
42 1
|
29天前
|
存储 NoSQL Java
Java 使用 Redis
10月更文挑战第22天
31 0
|
2月前
|
NoSQL Java API
Java操作redis
Java操作redis
|
7月前
|
NoSQL Java Redis
用java写个redis工具类
用java写个redis工具类
136 0
|
NoSQL Java Redis
java Redis工具类
java Redis工具类
1008 2
|
10天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
8天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
9天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
下一篇
无影云桌面