Java项目使用Redis缓存数据

Java项目使用Redis缓存数据

一、Redis的下载安装

1、下载gcc编译器

yum install gcc-c++

在这里插入图片描述
安装完成后检查是否安装成功,查看版本

gcc --version

在这里插入图片描述
2、使用weget下载redis

wget http://download.redis.io/releases/redis-6.2.4.tar.gz

在这里插入图片描述
下载成功后使用 ll 或 ls 命令查看当前目录下有redis压缩包
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
使用命令解压缩

tar -zxvf redis-6.2.4.tar.gz

解压成功后当前目录下有redis解压后的文件
在这里插入图片描述
3、进入解压后的redis文件,使用make进行编译
在这里插入图片描述
编译后默认安装目录就是redis文件夹所在目录
4、在解压后目录下执行make install 命令安装redis
在这里插入图片描述
5、进入安装目录启动redis服务

redis-server redis.conf

在这里插入图片描述
6、在xshell复制一个会话,cd进入redis安装目录,进行客户端连接

redis-cli -h 127.0.0.1 -p 6379

在这里插入图片描述
避雷:我本来想在Redisdesktopmanager里面连接我虚拟机里装的redis,然后一直报错
在这里插入图片描述
在网上搜解决方案采用修改redis.conf后成功
具体步骤如下
(1)如果已经启动redis,ctrl+c退出关闭redis,vim redis.conf修改配置文件,把原来的bind的IP改成虚拟机IP,protectedmode改成no,保存并退出
在这里插入图片描述
(2)重新启动redis

redis-server redis.conf

再次打开Redisdesktopmanager测试连接成功
在这里插入图片描述
这种情况下,虚拟机内客户端连接目录中IP记得改成redis.conf里改成的bindIP

redis-cli -h 127.0.0.1 -p 6379

在这里插入图片描述
另外,目前redis启动必须在一个会话终端里,启动redis之后就不能切换目录,退出等操作了,如果切换目录或退出就会关闭redis服务,如果要允许在启动redis的会话终端还能做别的操作还需要在redis.conf配置文件中更改配置daemonize yes;即作为守护进程启动,这样redis就可以后台启运行了。
在这里插入图片描述
这时候我们再来重新启动redis就不会显示像第五点的图一样的redis服务器启动后的画面,可以做别的操作
在这里插入图片描述

二、Java项目中整合Redis

1、添加依赖

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

在这里插入图片描述
2、redis连接配置
Redis实例默认创建了16个数据库,且不支持自定义命名,以dbX的方式命名(db0~db15);
此处我使用的redis的14数据库,没设置密码,若设置了密码则相应在password处输入密码

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 14
    password:

在这里插入图片描述
3、代码实现
(1)基础缓存DAO

@Repository
public class BaseCacheOperate {

    private final GsonBuilder gsonBuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss");


    /**
     * @description boundList-Add
     */
    public void add(BoundListOperations<String, String> boundListOperations, Object obj) {
        try {
            boundListOperations.rightPush(gsonBuilder.create().toJson(obj));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * @description boundList-Delete
     */
    public void remove(BoundListOperations<String, String> boundListOperations, String cacheStr) {
        try {
            boundListOperations.remove(1, cacheStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @description boundList-Query
     */
    public List<String> list(BoundListOperations<String, String> boundListOperations, long count) {
        List<String> result = null;
        try {
            result = boundListOperations.range(0, count - 1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


    /**
     * @description boundHash-Add
     */
    public void put(BoundHashOperations<String, String, String> boundHashOperations,
                    String key, Object value) {
        try {
            boundHashOperations.put(key, gsonBuilder.create().toJson(value));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @description boundHash-Remove
     */
    public void remove(BoundHashOperations<String, String, String> boundHashOperations,
                       String key) {
        try {
            boundHashOperations.delete(key);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * @description boundHash-Entries(Value单实体)
     */
    public <T> Map<String, T> entries(BoundHashOperations<String, String, String> cacheOperations, Class<T> valueClass) {
        Map<String, T> result = new HashMap<>();
        Map<String, String> entries = cacheOperations.entries();
        if (DataStructureUtils.isValid(entries)) {
            entries.forEach((key, value) -> result.put(key, gsonBuilder.create().fromJson(value, valueClass)));
        }
        return result;
    }


    /**
     * @description boundHash-Get(Value单实体)
     */
    public <T> T get(BoundHashOperations<String, String, String> cacheOperations,
                     String key, Class<T> valueClass) {
        String cacheStr = get(cacheOperations, key);
        return StringUtils.isNotBlank(cacheStr) ? gsonBuilder.create().fromJson(cacheStr, valueClass) : null;
    }


    /**
     * @description boundHash-Get(Value为List)
     */
    public <T> List<T> getList(BoundHashOperations<String, String, String> cacheOperations,
                               String key, Class<T> valueClass) {
        String cacheStr = get(cacheOperations, key);
        return StringUtils.isNotBlank(cacheStr) ? gsonBuilder.create().fromJson(cacheStr, new TypeToken<List<T>>() {
        }.getType()) : null;
    }

    /**
     * @description boundHash-Get
     */
    public String get(BoundHashOperations<String, String, String> cacheOperations,
                      String key) {
        String result = null;
        try {
            result = cacheOperations.get(key);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


    /**
     * @param cacheOperations Hash缓存操作实例
     * @param keyList         Key值集
     * @param valueClass      Value的类
     * @return 缓存数据集
     * @description 根据Key值集获取多条Value
     */
    public <T> List<T> multiGet(BoundHashOperations<String, String, String> cacheOperations,
                                List<String> keyList, Class<T> valueClass) {
        List<String> cacheStrList = multiGet(cacheOperations, keyList);
        List<T> result = new ArrayList<>();
        if (DataStructureUtils.isValid(cacheStrList)) {
            for (String cacheStr : cacheStrList) {
                result.add(gsonBuilder.create().fromJson(cacheStr, valueClass));
            }
        }
        return result;
    }

    /**
     * @param cacheOperations Hash缓存操作实例
     * @param keyList         Key值集
     * @param typeToken       Gson转换类型
     * @return 缓存数据集
     * @description 根据Key值集获取多条Value
     */
    public <T> List<T> multiGet(BoundHashOperations<String, String, String> cacheOperations,
                                List<String> keyList, TypeToken<List<T>> typeToken) {
        List<String> cacheStrList = multiGet(cacheOperations, keyList);
        List<T> result = new ArrayList<>();
        if (DataStructureUtils.isValid(cacheStrList)) {
            for (String cacheStr : cacheStrList) {
                result.addAll(gsonBuilder.create().fromJson(cacheStr, typeToken.getType()));
            }
        }
        return result;
    }


    /**
     * @param cacheOperations Hash缓存操作实例
     * @param keyList         Key值集
     * @return 缓存数据集
     * @description 根据Key值集获取多条Value
     */
    public List<String> multiGet(BoundHashOperations<String, String, String> cacheOperations, List<String> keyList) {
        List<String> result = null;
        if (DataStructureUtils.isValid(keyList)) {
            try {
                result = cacheOperations.multiGet(keyList);
                if (result != null) {
                    result.removeIf(Objects::isNull);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return result;
    }

}

(2)实际缓存业务

@Repository
public class TestDataDAO {

    private final BaseCacheOperate baseCacheOperate;
    private final BoundHashOperations<String, String, String> operations;

    @Autowired
    public TestDataDAO(PublicCacheOperate baseCacheOperate, StringRedisTemplate redisTemplate) {
        this.baseCacheOperate = baseCacheOperate;
        this.operations = redisTemplate.boundHashOps("TEST_DATA");
    }

    /**
     * @description 缓存测试数据
     */
    public void cache(TestData testData) {
                baseCacheOperate.put(operations, testData.getId().toString(), airSiteLatestData);
    }

    /**
     * @description 根据ID获取测试数据
     */
    public TestData get(Long id) {
        return baseCacheOperate.get(operations, id.toString(), TestData.class);
    }

    /**
     * @description 根据ID集获取测试数据集
     */
    public List<TestData> list(List<Long> idList) {
        return baseCacheOperate.multiGet(operations, idList.stream()
                .map(Objects::toString).collect(Collectors.toList()), TestData.class);
    }
}

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Redis是一款高性能的内存键值数据库,它具有快速读写速度和高可靠性。在面试中,Java开发人员与Redis缓存相关的问题通常涉及如何在Java应用程序中实现Redis缓存来提高性能。 首先,Java开发人员应该了解与Redis交互的客户端API,例如Jedis和Lettuce。这些API允许Java应用程序通过TCP连接与Redis服务器进行交互,并提供了基本的高级数据类型操作和事务处理机制。开发人员应该熟练掌握这些API并了解它们的性能优化策略。 其次,Java开发人员应该知道如何在应用程序中使用 Redis缓存缓存常见的数据,例如数据库查询结果或API响应数据。这可以通过将数据存储在Redis中,以便下次访问时可以更快地读取数据来实现。开发人员应该考虑如何选择合适的数据结构(例如哈希表或有序集合)来保存数据。 另外,Java开发人员应该了解Redis缓存的通用最佳实践策略,例如如何配置Redis服务器以优化性能,如何进行数据备份和恢复,以及如何监视和调试Redis性能和健康状况。 最后,Java开发人员应该知道如何与Redis缓存集成来支持应用程序的高可用性和可伸缩性。例如,他们可以使用Redis Sentinel来自动监视Redis集群的健康状况,以及Redis Cluster来实现数据分片和负载均衡。 总之,在Java面试中,了解Redis缓存的基本知识和通用最佳实践策略非常重要,因为它可以让开发人员设计和实现高性能,可伸缩和高可用性的Java应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值