民工哥死磕Redis教程(十五): 与Java\Php\Springboot 等应用的连接与使用

2023-06-0717:11:32数据库教程Comments1,290 views字数 11438阅读模式

前言

我们之前对Redis的学习都是在命令行窗口,那么如何使用Java来对Redis进行操作呢?官方对于Java连接Redis的开发工具推荐了Jedis,通过Jedis同样可以实现对Redis的各种操作。本篇文章会介绍基于Linux上的Redis的Java连接操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

准备步骤

修改配置文件redis.conf:

(1)注释以下属性,因为我们是需要进行远程连接的:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

#bind:127.0.0.1

(2)将protected-mode 设置为no文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

protected-mode no

(3)设置为允许后台连接文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

daemonize yes

注意:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

在远程服务器进行连接需要确保将以下三个步骤都完成:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

  • 设置服务器的安全组开放6379端口
  • 防火墙开放端口:
firewall-cmd --zone=public --add-port=6379/tcp --permanet
  • 重启防火墙:
systemctl restart firewalld.service

Jedis连接Redis

创建一个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>
测试连接:
package com.yixin;
 
import redis.clients.jedis.Jedis;
 
public class RedisTest {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        String response = jedis.ping();
        System.out.println(response); // PONG
}
 
}
输出结果:

民工哥死磕Redis教程(十五): 与Java\Php\Springboot 等应用的连接与使用看到PONG说明我们成功连接上了我们服务器上的Redis了!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

基本操作

操作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());
 
    }
}

操作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));
        }
    }
}

输出结果:民工哥死磕Redis教程(十五): 与Java\Php\Springboot 等应用的连接与使用文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

事务操作

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();
        }
    }
}

输出结果:民工哥死磕Redis教程(十五): 与Java\Php\Springboot 等应用的连接与使用文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

对于其他命令也基本类似,就不一一演示出来了,之前学过的Redis命令,在Java中同样可以进行使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

SpringBoot集成Redis

介绍

这次我们并不使用jedis来进行连接,而是使用lettuce来进行连接,jedis和lettuce的对比如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

  • jedis:采用的直连,多个线程操作的话,是不安全的;想要避免不安全,使用jedis pool连接池。更像BIO模式
  • lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况;可以减少线程数量。更像NIO模式

集成Redis

创建Spring Boot项目
导入依赖
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
编写配置文件

application.properties:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

#配置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
编写测试类
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"));
    }
 
 
}

输出:民工哥死磕Redis教程(十五): 与Java\Php\Springboot 等应用的连接与使用文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

这样就已经成功连接了!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

在这种连接方式中,redisTemplate操作着不同的数据类型,api和我们的指令是一样的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

opsForValue:操作字符串 类似String
opsForList:操作List 类似List
opsForSet:操作Set,类似Set
opsForHash:操作Hash
opsForZSet:操作ZSet
opsForGeo:操作Geospatial
opsForHyperLogLog:操作HyperLogLog

除了基本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务,和基本的CRUD。更多关于 Redis 学习的文章,请参阅:NoSQL 数据库系列之 Redis ,本系列持续更新中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

保存对象

编写实体类

注意:要实现序列号Serializable。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

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 +
                '}';
    }
}
编写RedsTemplate配置

Tip:在开发当中,我们可以直接把这个模板拿去使用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

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;
  }
 
 
}
存储对象
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"));
 
    }
 
}

输出结果:民工哥死磕Redis教程(十五): 与Java\Php\Springboot 等应用的连接与使用文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

PHP 使用 Redis

安装

开始在 PHP 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 PHP redis 驱动,且你的机器上能正常使用 PHP。接下来让我们安装 PHP redis 驱动:下载地址为:https://github.com/phpredis/phpredis/releases。更多关于 Redis 学习的文章,请参阅:NoSQL 数据库系列之 Redis ,本系列持续更新中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

PHP安装redis扩展

以下操作需要在下载的 phpredis 目录中完成:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

$ wget https://github.com/phpredis/phpredis/archive/3.1.4.tar.gz  #下载
$ tar zxvf 3.1.4.tar.gz # 解压 
$ cd phpredis-3.1.4 # 进入 phpredis 目录 
$ /usr/local/php/bin/phpize # php安装后的路径 
$ ./configure --with-php-config=/usr/local/php/bin/php-config  #编译
$ make && make install

修改php.ini文件

vi /usr/local/php/lib/php.ini

增加如下内容:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20090626" extension=redis.so

安装完成后重启php-fpm 或 apache。查看phpinfo信息,就能看到redis扩展。民工哥死磕Redis教程(十五): 与Java\Php\Springboot 等应用的连接与使用文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

连接到 redis 服务

实例
<?php
    //连接本地的 Redis 服务
   $redis = new Redis();
   $redis->connect('127.0.0.1', 6379);
   echo "Connection to server successfully";
         //查看服务是否运行
   echo "Server is running: " . $redis->ping();
?>

执行脚本,输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

Connection to server successfully 
Server is running: PONG
Redis PHP String(字符串) 实例
<?php
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server successfully";
//设置 redis 字符串数据
$redis->set("tutorial-name", "Redis tutorial");
// 获取存储的数据并输出
echo "Stored string in redis:: " . $redis->get("tutorial-name");
?>

执行脚本,输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

Connection to server successfully 
Stored string in redis:: Redis tutorial
Redis PHP List(列表) 实例
<?php
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server successfully";
//存储数据到列表中
$redis->lpush("tutorial-list", "Redis");
$redis->lpush("tutorial-list", "Mongodb");
$redis->lpush("tutorial-list", "Mysql");
// 获取存储的数据并输出
$arList = $redis->lrange("tutorial-list", 0 ,5);
echo "Stored string in redis";
print_r($arList);
?>

执行脚本,输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

Connection to server successfully 
Stored string in redis 
Mysql 
Mongodb 
Redis
Redis PHP Keys 实例
<?php
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server successfully";
// 获取数据并输出
$arList = $redis->keys("*");
echo "Stored keys in redis:: ";
print_r($arList);
?>

执行脚本,输出结果为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html

Connection to server successfully 
Stored string in redis:: 
tutorial-name
tutorial-list
参考:https://www.runoob.com/redis/redis-php.html https://yixinforu.blog.csdn.net/article/details/122906569
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/45677.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/45677.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定