写给Java程序员看的Redis教程-------第二章. jedis基础知识及理论实战

本文详细介绍Java连接Redis的方法,包括引入Jedis包、测试连接、常见操作及编写工具类。进一步探讨Redis在登录和Cookie缓存、购物车以及网页缓存等场景的应用优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言: 不了解Redis是啥的可以去:第一章,redis入门

1.java连接Redis

Java连接Redis,请确保你的目标服务器的端口对外开放(云端安全组设置)

1.1 给项目中导入jedis包。

jar包可以复制

[]: https://static.runoob.com/download/jedis-2.9.0.jar

这里是一个maven依赖。

		<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.1</version><!--版本号可根据实际情况填写-->
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>

1.2 测试jedis连接

import redis.clients.jedis.Jedis;

public class RedisJava {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("134.175.110.184");
        // 如果有密码的话,使用这一行
        // jedis.auth("password");
        System.out.println("连接成功");
        //查看服务是否运行
        System.out.println("服务正在运行: " + jedis.ping());
    }
}

1.3 Java操作Redis.

import redis.clients.jedis.Jedis;

import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class RedisJava {
    public static void main(String[] args) {
        testSet();
        testKeysStar();
        testList();
        testKeys();
    }

    private static void testKeys() {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");

        // 获取数据并输出
        Set<String> keys = jedis.keys("*");
        Iterator<String> it = keys.iterator();
        while (it.hasNext()) {
            String key = it.next();
            System.out.println(key);
        }
    }

    private static void testList() {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");
        //存储数据到列表中
        jedis.lpush("site-list", "Runoob");
        jedis.lpush("site-list", "Google");
        jedis.lpush("site-list", "Taobao");
        // 获取存储的数据并输出
        List<String> list = jedis.lrange("site-list", 0, 2);
        for (int i = 0; i < list.size(); i++) {
            System.out.println("列表项为: " + list.get(i));
        }
    }

    private static void testKeysStar() {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        jedis.auth("test123");
        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key);
        }
    }

    public static void testSet() {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        System.out.println("连接成功");
        //设置 redis 字符串数据
        jedis.set("runoobkey", "www.runoob.com");
        // 获取存储的数据并输出
        System.out.println("redis 存储的字符串为: " + jedis.get("runoobkey"));
    }
}

1.4 写出Redis常用工具类

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class RedisUtil {

    /**
     * 服务器IP地址
     */
    private static String ADDR = "localhost";
    /**
     * 端口
     */

    private static int PORT = 6379;
    /**
     * 密码
     */
    private static String AUTH = "123456";
    /**
     * 连接实例的最大连接数
     */
    private static int MAX_ACTIVE = 1024;
    /**
     * 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
     */
    private static int MAX_IDLE = 200;
    /**
     * 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
     */
    private static int MAX_WAIT = 10000;
    /**
     * 连接超时的时间
     */
    private static int TIMEOUT = 10000;
    /**
     * 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
     */
    private static boolean TEST_ON_BORROW = true;

    private static JedisPool jedisPool = null;
    /**
     * 数据库模式是16个数据库 0~15
     */
    public static final int DEFAULT_DATABASE = 0;

    /**
     * 初始化Redis连接池
     */
    static {
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(MAX_ACTIVE);
            config.setMaxIdle(MAX_IDLE);
            config.setMaxWaitMillis(MAX_WAIT);
            config.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH, DEFAULT_DATABASE);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取Jedis实例
     */
    public synchronized static Jedis getJedis() {
        try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                System.out.println("redis--服务正在运行: " + resource.ping());
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 释放资源
     */
    public static void returnResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
        }
    }
}

2. Redis 使用场景分析

本章场景主要来自《Redis实战》.

2.1 Redis优化登录和cookie缓存

原有系统:用户登录时可以选择记住账号,并且能将用户的浏览记录保存以供未来用户查看or企业进行分析。

需求:用户登录后,浏览记录频繁的插入数据库,目前已经超过了服务器的承受能力,请问如何优化?

在这里插入图片描述

分析:首先,用户每次访问页面,我们可以使用cookieID从redis中查找对应的cookie,进行登录优化。当然优化登录操作并不能带来很明显的性能提升,因为耗时操作往往在之后的插入浏览记录中。

而用户的浏览记录,每次只增加一条,单条操作如果能合并为批量操作就能大大减轻数据库负担。(批量插入更高速。)

浏览记录我们可以先让其在redis缓存,等其攒够一定数量后等待低峰时期使用批量插入,插入到数据库中,尽可能的减少磁盘峰值负载。

所以优化如下:

在这里插入图片描述

2.2 使用Redis 优化购物车

上文中使用的cookie,最初的设计意图在于为网商提供一种购物车,让用户可以收集他们想要购买的商品。

现在的购物车往往存放在数据库中,但是用户往往对购物车中的商品进行简单而又耗时的操作:加减商品数量,添加商品。

这样的操作就好像用户在不断的更新,插入数据库数据,而且每次影响的行数只有一行,有时还会频繁操作。这就对磁盘读写能力挑战较大。

同样,我们依然先将用户查询到的购物车内容,或者新增的内容放到Redis中,用户查询时都保存在Redis一份,插入时先插入到Redis之中。然后用户对购物车的操作都是在Redis中进行,暂时与数据库无关。

最终在一段时间后,redis信息过期,将其放入到DB中。

在这里插入图片描述

2.3 网页缓存

在动态生成网页的时候,通常会使用模板语言来简化网页的生成操作。但是很多时候很多网页并不会产生太大的变化,此时我们就可以选择将网页缓存到redis中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值