java操作redis

原文

一、准备步骤

修改配置文件redis.conf:

(1)注以下属性,因为我们是需要进行远程连接的:

#bind:127.0.0.1

(2)将protected-mode 设置为no

protected-mode no

(3)设置为允许后台连接

daemonize yes

注意:

在远程服务器进行连接需要确保将以下三个步骤都完成:

(1)设置服务器的安全组开放6379端口

(2)防火墙开放端口:

firewall-cmd --zone=public --add-port=6379/tcp --permanet

(3)重启防火墙:

systemctl restart firewalld.service

二、Jedis连接Redis

(1)创建一个Maven项目,并导入以下依赖:

<dependencies>
 
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.2.0</version>
    </dependency>
 
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
    </dependency>
 
</dependencies>

(2)测试连接:

package com.yixin;
 
import redis.clients.jedis.Jedis;
 
public class RedisTest {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        jedis.auth("123456");
        String response = jedis.ping();
        System.out.println(response); // PONG
}
 
}

输出结果:

img

看到PONG说明我们成功连接上了我们服务器上的Redis了!

三、基本操作

3.1 操作String数据类型

package com.yixin;
 
import redis.clients.jedis.Jedis;
 
import java.util.Set;
 
public class Redis_String {
 
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        String response = jedis.ping();
        System.out.println(response); // PONG
 
        //删除当前选择数据库中的所有key
        System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());
 
        //Spring实例
 
        //设置 redis 字符串数据
        //新增<'name','yixin'>的键值对
        jedis.set("name", "yixin");
        // 获取存储的数据并输出
        System.out.println("redis 存储的字符串为: "+ jedis.get("name"));
 
        //判断某个键是否存在
        System.out.println("判断某个键是否存在:"+jedis.exists("name"));
 
        //系统中所有的键
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);
 
        //按索引查询
        System.out.println("按索引查询:"+jedis.select(0));
 
        //查看键name所存储的值的类型
        System.out.println("查看键name所存储的值的类型:"+jedis.type("name"));
 
       // 随机返回key空间的一个
        System.out.println("随机返回key空间的一个:"+jedis.randomKey());
        //重命名key
        System.out.println("重命名key:"+jedis.rename("name","username"));
        System.out.println("取出改后的name:"+jedis.get("username"));
 
        //删除键username
        System.out.println("删除键username:"+jedis.del("username"));
 
        //删除当前选择数据库中的所有key
        System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());
        //查看当前数据库中key的数目
        System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());
 
        //删除数据库中的所有key
        System.out.println("删除所有数据库中的所有key:"+jedis.flushAll());
 
    }
}

3.2 操作List数据类型

package com.yixin;
 
import redis.clients.jedis.Jedis;
 
import java.util.List;
 
public class Redis_List {
 
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        String response = jedis.ping();
        System.out.println(response); // PONG
 
      System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());
 
        //List实例
        //存储数据到列表中
        jedis.lpush("list", "num1");
        jedis.lpush("list", "num2");
        jedis.lpush("list", "num3");
        
        // 获取存储的数据并输出
        List<String> list = jedis.lrange("list", 0 ,-1);
        for(int i=0; i<list.size(); i++) {
            System.out.println("列表项为: "+list.get(i));
        }
    }
}

输出结果:

img

3.3 事务操作

package com.yixin;
 
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
 
public class Redis_Transaction {
 
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        String response = jedis.ping();
        System.out.println(response); // PONG
 
        //事务测试
        jedis.flushDB();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("hello","world");
        jsonObject.put("name","yixin");
 
        //开启事务
        Transaction multi = jedis.multi();
        String result = jsonObject.toJSONString();
        // jedis.watch(result)
        try {
            multi.set("user1", result);
            multi.set("user2", result);
            int i = 1 / 0; // 代码抛出异常事务,执行失败!
            multi.exec(); // 执行事务!
 
        }catch (Exception e){
            multi.discard();// 放弃事务
            e.printStackTrace();
        }finally {
            System.out.println(jedis.get("user1"));
            System.out.println(jedis.get("user2"));
            jedis.close();
        }
    }
}
 

输出结果:

img

四、SpringBoot集成Redis

4.1 介绍

这次我们并不使用jedis来进行连接,而是使用lettuce来进行连接,jedis和lettuce的对比如下:

jedis:采用的直连,多个线程操作的话,是不安全的;想要避免不安全,使用jedis pool连接池。更像BIO模式

lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况;可以减少线程数量。更像NIO模式

4.2 集成Redis

(1)创建Spring Boot项目

(2)导入依赖

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

(3)编写配置文件

application.properties:

#配置redis
# Redis服务器地址
spring.redis.host=服务器地址
# Redis服务器连接端口
spring.redis.port=6379  
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
 

(4)编写测试类

package com.yixin;
 
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
 
@SpringBootTest
class SpringbootRedisApplicationTests {
 
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
 
    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name","yixin");
        System.out.println(redisTemplate.opsForValue().get("name"));
    }
 
}

输出:

img

这样就已经成功连接了!

在这种连接方式中,redisTemplate操作着不同的数据类型,api和我们的指令是一样的。

opsForValue:操作字符串 类似String

opsForList:操作List 类似List

opsForSet:操作Set,类似Set

opsForHash:操作Hash

opsForZSet:操作ZSet

opsForGeo:操作Geospatial

opsForHyperLogLog:操作HyperLogLog

除了基本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务,和基本的CRUD。

4.3 保存对象

(1)编写实体类

注意:要实现序列号Serializable

package com.yixin.pojo;
 
import java.io.Serializable;
 
public class User implements Serializable {
    private String name;
    private int age;
 
    public  User(){
 
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

(2)编写RedsTemplate配置

Tip:在开发当中,我们可以直接把这个模板拿去使用。

package com.yixin.config;
 
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
 
@Configuration
public class RedisConfig {
 
  @Bean
  @SuppressWarnings("all")
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
 
      //为了自己开发方便,一般直接使用 <String, Object>
      RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
      template.setConnectionFactory(factory);
 
    // Json序列化配置
      Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
      ObjectMapper om = new ObjectMapper();
      om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
      om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
      jackson2JsonRedisSerializer.setObjectMapper(om);
 
      // String 的序列化
      StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
 
      // key采用String的序列化方式
      template.setKeySerializer(stringRedisSerializer);
      // hash的key也采用String的序列化方式
      template.setHashKeySerializer(stringRedisSerializer);
      // value序列化方式采用jackson
      template.setValueSerializer(jackson2JsonRedisSerializer);
      // hash的value序列化方式采用jackson
      template.setHashValueSerializer(jackson2JsonRedisSerializer);
      template.afterPropertiesSet();
 
      return template;
  }
 
 
}

(3)存储对象

package com.yixin;
 
import com.yixin.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
 
@SpringBootTest
class SpringbootRedisApplicationTests {
 
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
 
 
 
    @Test
    void contextLoads() {
        User user=new User("yixin",18);
        redisTemplate.opsForValue().set("user",user);
        System.out.println(redisTemplate.opsForValue().get("user"));
 
    }
 
 
}

输出结果:

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值