在java中操作redis数据库

文章目录


前言

我们在java程序中应该如何操作Redis呢?这就需要使用Redis的Java客户端,就如同我们使用JDBC操作MySQL数据库一样。

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

我们使用Spring Data Redis。

一、redis介绍

Redis是一个基于内存的key-value型结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件

主要特点:

  • 基于内存存储,读写性能高

  • 适合存储热点数据(热点商品、资讯、新闻)

  • 企业应用广泛

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,它属于非关系型数据库

1.redis服务的启用

首先下载Windows版的redis安装包进行安装

1、在cmd命令行中输入redis-server.exe redis.windows.conf

2、直接运行其服务端exe可执行文件

Redis服务默认端口号为 6379 ,如果需要修改端口号可以去配置文件中修改。

当Redis服务启动成功后,可通过客户端进行连接。

2.redis五种常用的数据类型

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

  • 字符串 string :普通字符串,Redis中最简单的数据类型

  • 哈希 hash:也叫散列,类似于Java中的HashMap结构

  • 列表 list:按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList

  • 集合 set:无序集合,没有重复元素,类似于Java中的HashSet

  • 有序集合 sorted set / zset:集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

二、操作步骤

1.引入maven坐标

代码如下

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

2.配置redis数据源

在yml文件中

  spring:
      redis:
        host: localhost
        port: 6379
        password: ******
#    创建的时候会默认创建16个库,可以通过database指定操作哪个数据库,默认是操作0号数据库
        database: 10

3、编写配置类,创建RedisTemplate对象

放在config包下面

//redis的配置类
@Configuration
@Slf4j
public class RedisConfiguration {


  @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){

        RedisTemplate redisTemplate = new RedisTemplate();
        //设置redis的连接工厂对象
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置redis key的序列化器
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置redis value的序列化器
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,故设置为StringRedisSerializer序列化器。

 4、通过RedisTemplate对象操作Redis

创建一个测试类SpringDataRedisTest

public class SpringDataRedisTest {
    @Autowired
    private RedisTemplate redisTemplate;

    public SpringDataRedisTest() {
    }

    @Test
    public void testRedisTemplate() {
        System.out.println(this.redisTemplate);
        ValueOperations valueOperations = this.redisTemplate.opsForValue();
        HashOperations hashOperations = this.redisTemplate.opsForHash();
        ListOperations listOperations = this.redisTemplate.opsForList();
        SetOperations setOperations = this.redisTemplate.opsForSet();
        ZSetOperations zSetOperations = this.redisTemplate.opsForZSet();
    }
}

1). 操作字符串类型数据

    @Test
    public void testString() {
        this.redisTemplate.opsForValue().set("city1", "北京");
        String city = (String)this.redisTemplate.opsForValue().get("city");
        System.out.println(city);
        this.redisTemplate.opsForValue().set("code", "1234", 3L, TimeUnit.MINUTES);
        this.redisTemplate.opsForValue().setIfAbsent("lock", "1");
        this.redisTemplate.opsForValue().setIfAbsent("lock", "2");
    }

2).操作哈希类型数据

    @Test
    public void testHash() {
        HashOperations hashOperations = this.redisTemplate.opsForHash();
        hashOperations.put("zyxhash", "name", "zyx");
        hashOperations.put("zyxhash", "age", "19");
        String o = (String)hashOperations.get("zyxhash", "name");
        System.out.println(o);
        Set zyxhash = hashOperations.keys("zyxhash");
        System.out.println(zyxhash);
        List zyxhash1 = hashOperations.values("zyxhash");
        System.out.println(zyxhash1);
        hashOperations.delete("zyxhash", new Object[]{"age"});
    }

3).操作列表类型数据

    @Test
    public void testList() {
        ListOperations listOperations = this.redisTemplate.opsForList();
        listOperations.leftPushAll("mylist", new Object[]{"a", "b", "c"});
        listOperations.leftPush("mylist", "d");
        List mylist = listOperations.range("mylist", 0L, -1L);
        System.out.println(mylist);
        listOperations.rightPop("mylist");
        Long size = listOperations.size("mylist");
        System.out.println(size);
    }

4).操作集合类型数据

    @Test
    public void testSet() {
        SetOperations setOperations = this.redisTemplate.opsForSet();
        setOperations.add("set1", new Object[]{"a", "b", "c", "d"});
        setOperations.add("set2", new Object[]{"a", "b", "x", "y"});
        Set members = setOperations.members("set1");
        System.out.println(members);
        Long size = setOperations.size("set1");
        System.out.println(size);
        Set intersect = setOperations.intersect("set1", "set2");
        System.out.println(intersect);
        Set union = setOperations.union("set1", "set2");
        System.out.println(union);
        setOperations.remove("set1", new Object[]{"a", "b"});
    }

5).操作有序集合类型数据

    @Test
    public void testZset() {
        ZSetOperations zSetOperations = this.redisTemplate.opsForZSet();
        zSetOperations.add("zset1", "a", 10.0);
        zSetOperations.add("zset1", "b", 12.0);
        zSetOperations.add("zset1", "c", 9.0);
        Set zset1 = zSetOperations.range("zset1", 0L, -1L);
        System.out.println(zset1);
        zSetOperations.incrementScore("zset1", "c", 10.0);
        zSetOperations.remove("zset1", new Object[]{"a", "b"});
    }

6).通用命令

    @Test
    public void testCommon() {
        Set keys = this.redisTemplate.keys("*");
        System.out.println(keys);
        Boolean name = this.redisTemplate.hasKey("name");
        Boolean set1 = this.redisTemplate.hasKey("set1");
        Iterator var4 = keys.iterator();

        while(var4.hasNext()) {
            Object key = var4.next();
            DataType type = this.redisTemplate.type(key);
            System.out.println(type.name());
        }

        this.redisTemplate.delete("mylist");
    }

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值